Hello!
The attached patches try to fix a few problems with building CHICKEN on Mac OS X. First, the build-tools are not automatically in the PATH, and are located somewhere deep in the Xcode.cpp application directory. I've added some variables that point to the default locations and which the user can override when invoking make(1). Second, I added a variable to chicken-config.h that gives the full path to the "postinstall" program, which is used on some platforms to fix up the runtime linker path for locating libchicken. On Mac this is "install_name_tool". "csc" needs to call this on freshly linked executables, so it needs to be in chicken-config.h. And third, the stupid "max-install-name" thing, which causes the invocation of the postinstall program to fail sometimes, depending on the installation path length. "csc" needs to do some special magic here to and pass "-headerpad_max_install_names" to gcc(1) when linking. Jim noted that this might not be supported on older Macs, but I vote for using this anyway. It is supported by at least 2 generations of Xcode, AFAIK, and is the official option provided by gcc itself on Darwin. We should support the current generation of the official toolchain, I'd say, and in the end the options can be adapted manually, in case someone desperately needs to get things running on an ancient Mac. felix
>From ac788e1fb3ae60c3d0cadfe3864a4251b98c6ef7 Mon Sep 17 00:00:00 2001 From: felix <[email protected]> Date: Tue, 28 Jan 2014 10:16:09 +0100 Subject: [PATCH 1/2] Use additional variables in MacOSX makefile to specify location of C compiler and build tools. Setting -isysroot doesn't seem to be necessary in this case, the default being to compile for Mac OS, apparently. --- Makefile.macosx | 6 +++++- README | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Makefile.macosx b/Makefile.macosx index 39f395a..fea3ef9 100644 --- a/Makefile.macosx +++ b/Makefile.macosx @@ -33,11 +33,14 @@ SRCDIR = ./ # platform configuration +XCODE_DEVELOPER ?= /Applications/Xcode.app/Contents/Developer +XCODE_TOOL_PATH ?= $(XCODE_DEVELOPER)/Toolchains/XcodeDefault.xctoolchain/usr/bin +C_COMPILER ?= $(XCODE_DEVELOPER)/usr/bin/gcc ARCH ?= $(shell sh $(SRCDIR)/config-arch.sh) # commands -POSTINSTALL_PROGRAM = install_name_tool +POSTINSTALL_PROGRAM = $(XCODE_TOOL_PATH)/install_name_tool # options @@ -51,6 +54,7 @@ else C_COMPILER_OPTIMIZATION_OPTIONS ?= -Os -fomit-frame-pointer endif endif +LIBRARIAN ?= $(XCODE_TOOL_PATH)/ar LINKER_LINK_SHARED_LIBRARY_OPTIONS = -dynamiclib -compatibility_version 1 -current_version 1.0 -install_name $@ POSTINSTALL_PROGRAM_FLAGS = -change lib$(PROGRAM_PREFIX)chicken$(PROGRAM_SUFFIX)$(SO) $(LIBDIR)/lib$(PROGRAM_PREFIX)chicken$(PROGRAM_SUFFIX)$(SO) LIBRARIAN_OPTIONS = scru diff --git a/README b/README index bb3a106..059718a 100644 --- a/README +++ b/README @@ -442,7 +442,16 @@ Mac OS X: - - On 10.6 and 10.7, Chicken may incorrectly select a 32-bit build + - The build currently assumes the Xcode application path is + "/Applications/Xcode.app/", with the C compiler and build + tools being located in the "Contents/Developer/usr/bin" + and + "Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin" + subdirectories, respectively. To override these locations, + set XCODE_DEVELOPER and XCODE_TOOL_PATH on the make(3) + command line. + + - On 10.6 and 10.7, CHICKEN may incorrectly select a 32-bit build environment when it should be building 64-bit, resulting in a build error. This occurs when you have a 32-bit kernel and a 64-bit gcc (that is, on Core 2 Duo systems running 10.6 Desktop). -- 1.7.12.4 (Apple Git-37)
>From 1fb9dadeb5f0fdf0994de25c3dfc63244e2c50e7 Mon Sep 17 00:00:00 2001 From: felix <[email protected]> Date: Tue, 28 Jan 2014 10:17:18 +0100 Subject: [PATCH 2/2] Store name of the post-install program in chicken-config, so that csc can pick up the path to "install_program_name" on Mac OS. Also pass "-headerpad_max_install_names" to the linker when building dynamically loadable .so's. --- Makefile.cygwin | 3 +++ Makefile.mingw | 3 +++ csc.scm | 5 +++-- defaults.make | 3 +++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Makefile.cygwin b/Makefile.cygwin index 8594882..6989ab8 100644 --- a/Makefile.cygwin +++ b/Makefile.cygwin @@ -136,6 +136,9 @@ chicken-defaults.h: echo "#ifndef C_INSTALL_CXX" >>$@ echo "# define C_INSTALL_CXX \"$(CXX_COMPILER)\"" >>$@ echo "#endif" >>$@ + echo "#ifndef C_INSTALL_POSTINSTALL_PROGRAM" >>$@ + echo "# define C_INSTALL_POSTINSTALL_PROGRAM \"$(POSTINSTALL_PROGRAM)\"" >>$@ + echo "#endif" >>$@ echo "#ifndef C_INSTALL_CFLAGS" >>$@ echo "# define C_INSTALL_CFLAGS \"$(C_COMPILER_OPTIONS) $(C_COMPILER_OPTIMIZATION_OPTIONS)\"" >>$@ echo "#endif" >>$@ diff --git a/Makefile.mingw b/Makefile.mingw index 74e9aff..4027171 100644 --- a/Makefile.mingw +++ b/Makefile.mingw @@ -134,6 +134,9 @@ endif echo #ifndef C_INSTALL_CXX >>$@ echo # define C_INSTALL_CXX "$(CXX_COMPILER)" >>$@ echo #endif >>$@ + echo #ifndef C_INSTALL_POSTINSTALL_PROGRAM >>$@ + echo # define C_INSTALL_POSTINSTALL_PROGRAM "$(POSTINSTALL_PROGRAM)" >>$@ + echo #endif" >>$@ echo #ifndef C_INSTALL_RC_COMPILER >>$@ echo # define C_INSTALL_RC_COMPILER "$(RC_COMPILER)" >>$@ echo #endif >>$@ diff --git a/csc.scm b/csc.scm index 935687f..0d34178 100644 --- a/csc.scm +++ b/csc.scm @@ -61,6 +61,7 @@ (define-foreign-variable CSC_PROGRAM c-string "C_CSC_PROGRAM") (define-foreign-variable WINDOWS_SHELL bool "C_WINDOWS_SHELL") (define-foreign-variable BINARY_VERSION int "C_BINARY_VERSION") +(define-foreign-variable POSTINSTALL_PROGRAM c-string "C_INSTALL_POSTINSTALL_PROGRAM") ;;; Parameters: @@ -522,7 +523,7 @@ EOF (set! compile-options (append pic-options '("-DC_SHARED") compile-options)) (set! link-options (cons (cond - (osx (if lib "-dynamiclib" "-bundle")) + (osx (if lib "-dynamiclib" "-bundle -headerpad_max_install_names")) (else "-shared")) link-options)) (set! shared #t) ) @@ -936,7 +937,7 @@ EOF (when (and osx (or (not cross-chicken) host-mode)) (command (string-append - "install_name_tool -change " libchicken ".dylib " + POSTINSTALL_PROGRAM " -change " libchicken ".dylib " (quotewrap (let ((lib (string-append libchicken ".dylib"))) (if deployed diff --git a/defaults.make b/defaults.make index 4a0f238..943dc88 100644 --- a/defaults.make +++ b/defaults.make @@ -358,6 +358,9 @@ endif echo "#ifndef C_INSTALL_RC_COMPILER" >>$@ echo "# define C_INSTALL_RC_COMPILER \"$(RC_COMPILER)\"" >>$@ echo "#endif" >>$@ + echo "#ifndef C_INSTALL_POSTINSTALL_PROGRAM" >>$@ + echo "# define C_INSTALL_POSTINSTALL_PROGRAM \"$(POSTINSTALL_PROGRAM)\"" >>$@ + echo "#endif" >>$@ echo "#ifndef C_INSTALL_CFLAGS" >>$@ echo "# define C_INSTALL_CFLAGS \"$(C_COMPILER_OPTIONS) $(C_COMPILER_OPTIMIZATION_OPTIONS)\"" >>$@ echo "#endif" >>$@ -- 1.7.12.4 (Apple Git-37)
_______________________________________________ Chicken-hackers mailing list [email protected] https://lists.nongnu.org/mailman/listinfo/chicken-hackers
