summaryrefslogtreecommitdiffstats
path: root/macosx/Makefile
diff options
context:
space:
mode:
authordas <das>2005-05-24 04:21:31 (GMT)
committerdas <das>2005-05-24 04:21:31 (GMT)
commitb0fdc226a3f785fcf390544a5546be0cfd1e7458 (patch)
treeba20400bcdbf394be0258f6dc603b703b1a34d56 /macosx/Makefile
parent5be843b40e45bf4ee2b4cb252a4d877ed85b8563 (diff)
downloadtk-b0fdc226a3f785fcf390544a5546be0cfd1e7458.zip
tk-b0fdc226a3f785fcf390544a5546be0cfd1e7458.tar.gz
tk-b0fdc226a3f785fcf390544a5546be0cfd1e7458.tar.bz2
* macosx/Makefile:
* macosx/README: * macosx/Tk-Info.plist.in (new file): * macosx/Wish-Info.plist.in (new file): * unix/Makefile.in: * unix/configure.in: * unix/tcl.m4: * unix/tkUnixInit.c: moved all Darwin framework and TkAqua build support from macosx/Wish.pbproj and macosx/Makefile into the standard unix configure/make buildsystem, the project and macosx/Makefile are no longer required to build Tk.framework and/or TkAqua. TkAqua is now enabled by the --enable-aqua configure option, and static and non-framework builds of TkAqua are now available via the standard configure switches. Tk/X11 can also be built as a framework. The macosx/Makefile now wraps the unix buildsystem and no longer uses the projects, embedded builds are still only available via this Makefile, but for other builds it is not longer required (but its current functionality is still available for backwards compatibility). The projects currently do not call through to the Makefile to build (unlike Tcl.pbproj) so project builds may differ from makefile builds. Due to issues with spaces in pathnames, 'Wish Shell.app' has been renamed to 'Wish.app', the macosx/Makefile installs backwards compatibility symlinks for the old name. * macosx/tkMacOSXInit.c (TkpInit): added support for Tk resource file in non-framework and static builds: the resource file is copied into a __tk_rsrc MachO segment of the library or executable at link time and extracted into a temporary location at initialization. * unix/configure: autoconf-2.13
Diffstat (limited to 'macosx/Makefile')
-rw-r--r--macosx/Makefile295
1 files changed, 221 insertions, 74 deletions
diff --git a/macosx/Makefile b/macosx/Makefile
index ad5b4c9..ca29ead 100644
--- a/macosx/Makefile
+++ b/macosx/Makefile
@@ -1,13 +1,14 @@
-################################################################################
+########################################################################################################
#
-# Makefile to build AquaTk on Mac OS X packaged as a Framework
-# uses Project Builder command line tool 'pbxbuild'
+# Makefile wrapper to build tk on Mac OS X in a way compatible with the tk/macosx Xcode buildsystem
+# uses the standard unix build system in tk/unix (which can be used directly instead of this
+# if you are not using the tk/macosx projects).
#
-# RCS: @(#) $Id: Makefile,v 1.7.2.7 2004/11/11 01:26:42 das Exp $
+# RCS: @(#) $Id: Makefile,v 1.7.2.8 2005/05/24 04:21:32 das Exp $
#
-################################################################################
+########################################################################################################
-#-------------------------------------------------------------------------------
+#-------------------------------------------------------------------------------------------------------
# customizable settings
DESTDIR ?=
@@ -17,117 +18,263 @@ BUILD_DIR ?= ${CURDIR}/../../build
SYMROOT ?= ${BUILD_DIR}/${PROJECT}
OBJROOT ?= ${SYMROOT}
+EXTRA_CONFIGURE_ARGS ?=
EXTRA_MAKE_ARGS ?=
INSTALL_PATH ?= /Library/Frameworks
APPLICATION_INSTALL_PATH ?= /Applications/Utilities
-
-PREFIX ?= /usr
+PREFIX ?= /usr/local
BINDIR ?= ${PREFIX}/bin
+LIBDIR ?= ${INSTALL_PATH}
MANDIR ?= ${PREFIX}/man
-TCL_FRAMEWORK_DIR ?= ${BUILD_DIR}/tcl
-TCLSH_DIR ?= ${TCL_FRAMEWORK_DIR}
+# tcl build directory (containing tclConfig.sh and Makefile)
+TCL_BUILD_DIR ?= ${BUILD_DIR}/tcl/${BUILD_STYLE}
+# location of installed tcl, only used if tcl in TCL_BUILD_DIR can't be found
+TCL_FRAMEWORK_DIR ?= /Library/Frameworks
+TCLSH_DIR ?= ${PREFIX}
# set to non-empty value to install manpages in addition to html help:
INSTALL_MANPAGES ?=
-#-------------------------------------------------------------------------------
+# set to non-empty value to build TkX11 instead of TkAqua:
+TK_X11 ?=
-PROJECT = tk
-TARGET = Wish
+#-------------------------------------------------------------------------------------------------------
+# meta targets
-DEVBUILDSTYLE = Development
-DEPBUILDSTYLE = Deployment
+meta := all install embedded install-embedded clean distclean test
-PBXBUILD = /usr/bin/pbxbuild
-XCODEBUILD = /usr/bin/xcodebuild
+styles := develop deploy
-BUILDCMD = `if [ -f $(XCODEBUILD) ]; then \
- echo "$(XCODEBUILD) -project $$(ls -d *.pbproj)"; \
- else echo "$(PBXBUILD)"; fi`
+all := ${styles}
+all : ${all}
-MAKE_VARS := SYMROOT OBJROOT BINDIR APPLICATION_INSTALL_PATH \
- TCL_FRAMEWORK_DIR TCLSH_DIR
-MAKE_ARGS_V = $(foreach v,${MAKE_VARS},$v=${$v})
+install := ${styles:%=install-%}
+install : ${install}
+install-%: action := install-
-BUILD = ${BUILDCMD} -target "${TARGET}" ${MAKE_ARGS_V} \
- DYLIB_INSTALL_PATH="${INSTALL_PATH}" \
- ${EXTRA_MAKE_ARGS} ${MAKEOVERRIDES}
+embedded := ${styles:%=embedded-%}
+embedded : embedded-deploy
+install-embedded := ${embedded:%=install-%}
+install-embedded : install-embedded-deploy
-DEVBUILD = ${BUILD} -buildstyle "${DEVBUILDSTYLE}"
-DEPBUILD = ${BUILD} -buildstyle "${DEPBUILDSTYLE}"
+clean := ${styles:%=clean-%}
+clean : ${clean}
+clean-%: action := clean-
+distclean := ${styles:%=distclean-%}
+distclean : ${distclean}
+distclean-%: action := distclean-
-INSTALLOPTS = INSTALL_ROOT="${INSTALL_ROOT}"
+test := ${styles:%=test-%}
+test : ${test}
+test-%: action := test-
-EMBEDDEDOPTS = EMBEDDED_BUILD=1
+targets := $(foreach v,${meta},${$v})
-################################################################################
+#-------------------------------------------------------------------------------------------------------
+# build styles
-all: develop deploy
+BUILD_STYLE =
+CONFIGURE_ARGS =
+OBJ_DIR = ${OBJROOT}/${BUILD_STYLE}
-install: install-develop install-deploy
+develop_make_args := BUILD_STYLE=Development CONFIGURE_ARGS=--enable-symbols
+deploy_make_args := BUILD_STYLE=Deployment INSTALL_TARGET=install-strip
+embedded_make_args := EMBEDDED_BUILD=1
+install_make_args := INSTALL_BUILD=1
-embedded: embedded-deploy
+${targets}:
+ ${MAKE} ${action}${PROJECT} \
+ $(foreach s,${styles} embedded install,$(if $(findstring $s,$@),${${s}_make_args}))
-install-embedded: install-embedded-deploy cleanup-embedded
+#-------------------------------------------------------------------------------------------------------
+# project specific settings
-clean: clean-develop clean-deploy
+PROJECT := tk
+PRODUCT_NAME := Tk
-################################################################################
+UNIX_DIR := ${CURDIR}/../unix
+VERSION := $(shell awk -F= '/^TK_VERSION/ {print $$2; nextfile}' ${UNIX_DIR}/configure.in)
+WISH = wish${VERSION}
-develop:
- ${DEVBUILD}
+BUILD_TARGET := wish
+INSTALL_TARGET := install
-deploy:
- ${DEPBUILD}
+ifneq ($(wildcard ${TCL_BUILD_DIR}/tclConfig.sh),)
+TCL_DIR := ${TCL_BUILD_DIR}
+TCL_FRAMEWORK_DIR := ${TCL_BUILD_DIR}/..
+else
+TCL_DIR := ${TCL_FRAMEWORK_DIR}/Tcl.framework
+TCL_EXE := ${TCLSH_DIR}/tclsh${VERSION}
+MAKE_VARS = TCL_EXE
+export DYLD_FRAMEWORK_PATH := ${TCL_FRAMEWORK_DIR}
+endif
+export CPPROG := cp -p
-install-develop:
- ${DEVBUILD} install ${INSTALLOPTS}
+ifeq (${TK_X11},)
+override CONFIGURE_ARGS := ${CONFIGURE_ARGS} --enable-aqua
+else
+VERSION := ${VERSION}-X11
+endif
-install-deploy:
- ${DEPBUILD} install ${INSTALLOPTS}
+INSTALL_TARGETS = install-binaries install-libraries
+ifeq (${EMBEDDED_BUILD},)
+INSTALL_TARGETS += install-private-headers install-demos
+endif
+ifeq (${INSTALL_BUILD}_${EMBEDDED_BUILD}_${BUILD_STYLE},1__Deployment)
+INSTALL_TARGETS += html-tk
ifneq (${INSTALL_MANPAGES},)
-# install manpages
- ${MAKE} -C "$(CURDIR)/../unix" -f Makefile.in install-doc \
- SRC_DIR="$(CURDIR)/.." UNIX_DIR="$(CURDIR)/../unix" \
- mandir="$(MANDIR)" ${INSTALLOPTS} ${EXTRA_MAKE_ARGS}
+INSTALL_TARGETS += install-doc
endif
+endif
+
+MAKE_VARS += INSTALL_ROOT INSTALL_TARGETS VERSION
+MAKE_ARGS_V = $(foreach v,${MAKE_VARS},$v='${$v}')
-embedded-develop:
- ${DEVBUILD} ${EMBEDDEDOPTS}
+build-${PROJECT}: target = ${TARGET}
+install-${PROJECT}: target = ${INSTALL_TARGET}
+clean-${PROJECT} distclean-${PROJECT} test-${PROJECT}: \
+ target = $*
-embedded-deploy:
- ${DEPBUILD} ${EMBEDDEDOPTS}
+DO_MAKE = +${MAKE} -C ${OBJ_DIR} ${target} ${MAKE_ARGS_V} ${MAKE_ARGS} ${EXTRA_MAKE_ARGS}
-install-embedded-develop:
- ${DEVBUILD} install ${INSTALLOPTS} ${EMBEDDEDOPTS}
+${PROJECT}: override INSTALL_ROOT := ${OBJ_DIR}/
-install-embedded-deploy:
- ${DEPBUILD} install ${INSTALLOPTS} ${EMBEDDEDOPTS}
+#-------------------------------------------------------------------------------------------------------
+# locations for custom tk install actions
-clean-develop:
- ${DEVBUILD} clean
+ifeq (${INSTALL_BUILD},1)
+TOP_DIR := ${INSTALL_ROOT}/
+APP_DIR := ${APPLICATION_INSTALL_PATH}
+FMWK_DIR := ${LIBDIR}
+else
+TOP_DIR := ${SYMROOT}
+APP_DIR := .
+FMWK_DIR := .
+endif
-clean-deploy:
- ${DEPBUILD} clean
+TCL_FMWK_DIR := ${FMWK_DIR}/Tcl.framework/Versions/${VERSION}
+TK_FMWK_DIR := ${FMWK_DIR}/${PRODUCT_NAME}.framework/Versions/${VERSION}
+
+#-------------------------------------------------------------------------------------------------------
+# build rules
+
+${PROJECT}: install-${PROJECT}
+
+${OBJ_DIR}/Makefile: ${UNIX_DIR}/Makefile.in ${UNIX_DIR}/configure
+ mkdir -p ${OBJ_DIR} && cd ${OBJ_DIR} && ${UNIX_DIR}/configure \
+ --prefix=${PREFIX} --bindir=${BINDIR} --libdir=${LIBDIR} \
+ --mandir=${MANDIR} --enable-threads --enable-framework \
+ --with-tcl=${TCL_DIR} \
+ ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS}
+
+build-${PROJECT}: ${OBJ_DIR}/Makefile
+ ${DO_MAKE}
+# symolic link hackery to trick
+# 'make install INSTALL_ROOT=${OBJ_DIR}'
+# into building Tk.framework and wish in ${SYMROOT}
+ @cd ${OBJ_DIR} && mkdir -p $(dir ./${LIBDIR}) $(dir ./${BINDIR}) ${SYMROOT} && \
+ rm -rf ./${LIBDIR} ./${BINDIR} && ln -fs ${SYMROOT} ./${LIBDIR} && \
+ ln -fs ${SYMROOT} ./${BINDIR} && ln -fs ${OBJ_DIR}/tktest ${SYMROOT}
+ifeq (${TK_X11},)
+ @rm -f ${OBJ_DIR}/${BINDIR}
+endif
+# Create symbolic link to Tcl.framework in ${SYMROOT}if necessary
+ @cd ${SYMROOT} && if [ ! -e Tcl.framework -o -L Tcl.framework ]; then \
+ rm -f Tcl.framework && ln -s ${TCL_FRAMEWORK_DIR}/Tcl.framework . ; fi
+
+install-${PROJECT}: build-${PROJECT}
+ifeq (${EMBEDDED_BUILD}_${INSTALL_ROOT},1_)
+ @echo "Cannot install-embedded with empty INSTALL_ROOT !" && false
+else
+ @rm -rf "${INSTALL_ROOT}/${LIBDIR}/Tk.framework"
+endif
+ ${DO_MAKE}
+ifeq (${INSTALL_BUILD},1)
+ifeq (${EMBEDDED_BUILD},1)
+# if we are embedding frameworks, don't install wish
+ @rm -f "${INSTALL_ROOT}${BINDIR}/${WISH}" && \
+ rmdir -p "${INSTALL_ROOT}${BINDIR}" 2>&- || true
+else
+# redo prebinding
+ @cd ${INSTALL_ROOT}/ && \
+ if [ ! -d usr/lib ]; then mkdir -p usr && ln -fs /usr/lib usr/ && RM_USRLIB=1; fi; \
+ if [ -n "${TK_X11}" -a ! -d usr/X11R6 ]; then mkdir -p usr && ln -fs /usr/X11R6 usr/ && RM_USRX11=1; fi; \
+ if [ ! -d System ]; then ln -fs /System . && RM_SYSTEM=1; fi; \
+ if [ ! -d ./${LIBDIR}/Tcl.framework ]; then ln -fs ${TCL_FRAMEWORK_DIR}/Tcl.framework ./${LIBDIR}; RM_TCL=1; fi; \
+ redo_prebinding -r . "./${TK_FMWK_DIR}/${PRODUCT_NAME}"; \
+ if [ -z "${TK_X11}" ]; then redo_prebinding -r . "./${TK_FMWK_DIR}/Resources/Wish.app/Contents/MacOS/Wish"; \
+ else redo_prebinding -r . "./${BINDIR}/${WISH}"; fi; \
+ if [ -n "$${RM_USRLIB:-}" ]; then rm -f usr/lib; rmdir -p usr 2>&-; fi; \
+ if [ -n "$${RM_USRX11:-}" ]; then rm -f usr/X11R6; rmdir -p usr 2>&-; fi; \
+ if [ -n "$${RM_SYSTEM:-}" ]; then rm -f System; fi; \
+ if [ -n "$${RM_TCL:-}" ]; then rm -f ./${LIBDIR}/Tcl.framework; fi
+# install wish symbolic link
+ @ln -fs ${WISH} ${INSTALL_ROOT}${BINDIR}/wish
+endif
+endif
+ifeq (${BUILD_STYLE}_${EMBEDDED_BUILD},Development_)
+# keep copy of debug library around, so that
+# Deployment build can be installed on top
+# of Development build without overwriting
+# the debug library
+ @cd ${INSTALL_ROOT}${LIBDIR}/${PRODUCT_NAME}.framework/Versions/${VERSION} && \
+ ln -f "${PRODUCT_NAME}" "${PRODUCT_NAME}_debug"
+endif
+ifeq (${TK_X11},)
+ifeq (${EMBEDDED_BUILD},)
+# install Wish.app link in APPLICATION_INSTALL_PATH and setup 'Wish Shell' compatibility links
+ @cd ${TOP_DIR} && mkdir -p "./${APP_DIR}" && \
+ ln -fsh "$$(echo ./${APP_DIR} | sed -e 's#/[^/][^/]*#/..#g')/${TK_FMWK_DIR}/Resources/Wish.app" "./${APP_DIR}" && \
+ ln -fsh Wish.app "./${APP_DIR}/Wish Shell.app" && \
+ ln -fsh Wish.app "./${TK_FMWK_DIR}/Resources/Wish Shell.app" && \
+ ln -fsh Wish "./${TK_FMWK_DIR}/Resources/Wish.app/Contents/MacOS/Wish Shell"
+else
+# if we are embedding frameworks, move them into the app and fix their install names
+ @cd ${TOP_DIR} && \
+ rm -rf "./${APP_DIR}/Wish.app" && mkdir -p "./${APP_DIR}" && \
+ mv -f "./${TK_FMWK_DIR}/Resources/Wish.app" "./${APP_DIR}" && \
+ ln -fsh Wish.app "./${APP_DIR}/Wish Shell.app" && \
+ rm -rf "./${APP_DIR}/Wish.app/Contents/Frameworks" && \
+ mkdir -p "./${APP_DIR}/Wish.app/Contents/Frameworks" && \
+ mv -f "./${FMWK_DIR}"/T{cl,k}.framework "./${APP_DIR}/Wish.app/Contents/Frameworks" && \
+ rmdir -p "./${FMWK_DIR}" 2>&- || true && cd "./${APP_DIR}/Wish.app/Contents" && \
+ rm -rf Frameworks/T{cl,k}.framework/{,/Versions/$(VERSION)}/{Headers,PrivateHeaders,*_debug,lib*.a,*Config.sh} && \
+ fix_install_id ( ) { \
+ chmod -RH a+w "$$1"; \
+ install_name_tool -id $$(otool -L "$$1" | awk "/$$2\.framework.*[^:]\$$/ {sub(\"^.*/Frameworks\",\"@executable_path/../Frameworks\",\$$1); print \$$1}") "$$1"; \
+ chmod -RH a-w "$$1"; \
+ } && \
+ fix_install_name ( ) { \
+ chmod -RH a+w "$$1"; \
+ install_name_tool -change $$(otool -L "$$1" | awk "/$$2\.framework.*[^:]\$$/ {print \$$1; sub(\"^.*/Frameworks\",\"@executable_path/../Frameworks\",\$$1); print \$$1}") "$$1"; \
+ chmod -RH a-w "$$1"; \
+ } && \
+ fix_install_id Frameworks/Tcl.framework/Tcl Tcl && fix_install_id Frameworks/Tk.framework/Tk Tk && \
+ fix_install_name MacOS/Wish Tcl && fix_install_name MacOS/Wish Tk
+endif
+endif
-################################################################################
+clean-${PROJECT}: %-${PROJECT}:
+ ${DO_MAKE}
+ rm -rf ${SYMROOT}/{${PRODUCT_NAME}.framework,${WISH},tktest}
+ rm -f ${OBJ_DIR}{${LIBDIR},${BINDIR}} && \
+ rmdir -p ${OBJ_DIR}$(dir ${LIBDIR}) 2>&- || true && \
+ rmdir -p ${OBJ_DIR}$(dir ${BINDIR}) 2>&- || true
-cleanup-embedded:
- @-cd ${INSTALL_ROOT}/; \
- chmod -RH u+w Library/Frameworks/Tcl.framework; \
- rm -rf Library/Frameworks/Tcl.framework; \
- chmod -RH u+w Library/Frameworks/Tk.framework; \
- rm -rf Library/Frameworks/Tk.framework; \
- rmdir -p Library/Frameworks 2>&-;
+distclean-${PROJECT}: %-${PROJECT}: clean-${PROJECT}
+ ${DO_MAKE}
+ rm -rf ${OBJ_DIR}
+
+test-${PROJECT}: %-${PROJECT}: build-${PROJECT}
+ ${DO_MAKE}
-################################################################################
+#-------------------------------------------------------------------------------------------------------
-.PHONY: all install embedded clean develop deploy install-develop install-deploy \
-embedded-develop embedded-deploy install-embedded-develop install-embedded-deploy \
-clean-develop clean-deploy cleanup-embedded
+.PHONY: ${meta} ${targets} ${PROJECT} build-${PROJECT} install-${PROJECT} \
+ clean-${PROJECT} distclean-${PROJECT}
.NOTPARALLEL:
-################################################################################
+#-------------------------------------------------------------------------------------------------------