Python3.1.2 Universal Binaryビルドへの道(但し、自環境のみ有効)

長かった……長かった。
やっとこさ、Python3.1.2を自環境でビルドすることができました。なかなか時間がとれず、原因が分からなかったのですがとりあえず解決できたので、メモを残しておく。(但し、検証していないので参考程度に)


結論からいえば、Makefile.pre.inの以下の箇所(451行から478行)に原因がありました。(configureはPython2.6.4をreadlineと文字ロケール問題を回避してSnow Leopardに入れる - 日々の御伽噺の通り。Python3でも変わっておりません)

# This rule is here for OPENSTEP/Rhapsody/MacOSX. It builds a temporary
# minimal framework (not including the Lib directory and such) in the current
# directory.
RESSRCDIR=Mac/Resources/framework
$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
		$(LIBRARY) \
		$(RESSRCDIR)/Info.plist
	$(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)
	if test "${UNIVERSALSDK}"; then \
		$(CC) -o $(LDLIBRARY) @UNIVERSAL_ARCH_FLAGS@ -dynamiclib \
			-isysroot "${UNIVERSALSDK}" \
			-all_load $(LIBRARY) -Wl,-single_module \
			-install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
			-compatibility_version $(VERSION) \
			-current_version $(VERSION) \
			-framework CoreFoundation $(LIBS); \
        else \
		/usr/bin/libtool -o $(LDLIBRARY) -dynamic $(OTHER_LIBTOOL_OPT) $(LIBRARY) \
			@LIBTOOL_CRUFT@ -framework CoreFoundation $(LIBS);\
	fi
	$(INSTALL) -d -m $(DIRMODE)  \
		$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/Resources/English.lproj
	$(INSTALL_DATA) $(RESSRCDIR)/Info.plist \
		$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/Resources/Info.plist
	$(LN) -fsn $(VERSION) $(PYTHONFRAMEWORKDIR)/Versions/Current
	$(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK)
	$(LN) -fsn Versions/Current/Headers $(PYTHONFRAMEWORKDIR)/Headers
	$(LN) -fsn Versions/Current/Resources $(PYTHONFRAMEWORKDIR)/Resources


問題の箇所は466行目の"-framework CoreFoundation $(LIBS); \"の部分。自分はGNU Readlineを有効にするため、Macportsのライブラリパスを設定しているのだけど、それが徒になった。ビルド時のエラーが以下。

/usr/bin/install -c -d -m 755 Python.framework/Versions/3.1
if test "/"; then \
		gcc -o Python.framework/Versions/3.1/Python -arch i386 -arch x86_64 -dynamiclib \
			-isysroot "/" \
			-all_load libpython3.1.a -Wl,-single_module \
			-install_name /Library/Frameworks/Python.framework/Versions/3.1/Python \
			-compatibility_version 3.1 \
			-current_version 3.1 \
			-framework CoreFoundation -lintl -ldl  -framework CoreFoundation; \
        else \
		/usr/bin/libtool -o Python.framework/Versions/3.1/Python -dynamic  libpython3.1.a \
			 -lSystem -lSystemStubs -arch_only x86_64 -install_name /Library/Frameworks/Python.framework/Versions/3.1/Python -compatibility_version 3.1 -current_version 3.1 -framework CoreFoundation -lintl -ldl  -framework CoreFoundation;\
	fi
ld: library not found for -lintl
collect2: ld returned 1 exit status
ld: library not found for -lintl
collect2: ld returned 1 exit status
lipo: can't open input file: /var/folders/Bl/BlmoJMODFjOPP3kngUwZg++++TI/-Tmp-//cca9wIXl.out (No such file or directory)
make: *** [Python.framework/Versions/3.1/Python] Error 1


リンカーで「libintlがねぇよ!」と転けているということはパスが通ってないのかな?、と予測はしていた。
"-framework CoreFoundation $(LIBS); \"が"-framework CoreFoundation -lintl -ldl -framework CoreFoundation; \"に展開されている事には気がついていたのだけど……よくよく見てみれば、ライブラリパス通ってないじゃないか。ということで$(CPPFLAGS)と$(LDFLAGS)を追加してビルド&インストール完了。$(CPPFLAGS)はいらないかもしれないが。

RESSRCDIR=Mac/Resources/framework
$(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
		$(LIBRARY) \
		$(RESSRCDIR)/Info.plist
	$(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)
	if test "${UNIVERSALSDK}"; then \
		$(CC) -o $(LDLIBRARY) @UNIVERSAL_ARCH_FLAGS@ -dynamiclib \
			-isysroot "${UNIVERSALSDK}" \
			-all_load $(LIBRARY) -Wl,-single_module \
			-install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
			-compatibility_version $(VERSION) \
			-current_version $(VERSION) \
			$(CPPFLAGS) $(LDFLAGS) \
			-framework CoreFoundation $(LIBS); \
        else \
		/usr/bin/libtool -o $(LDLIBRARY) -dynamic $(OTHER_LIBTOOL_OPT) $(LIBRARY) \
			@LIBTOOL_CRUFT@ -framework CoreFoundation $(LIBS);\
	fi


ちなみに、問題なくビルド出来ていたPython2.7のMakefile.pre.inの該当箇所は以下。

	if test "${UNIVERSALSDK}"; then \
		$(CC) -o $(LDLIBRARY) @UNIVERSAL_ARCH_FLAGS@ -dynamiclib \
			-isysroot "${UNIVERSALSDK}" \
			-all_load $(LIBRARY) -Wl,-single_module \
			-install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
			-compatibility_version $(VERSION) \
			-current_version $(VERSION); \
        else \
		/usr/bin/libtool -o $(LDLIBRARY) -dynamic $(OTHER_LIBTOOL_OPT) $(LIBRARY) \
			@LIBTOOL_CRUFT@ ;\


ないのね。