1######################################################################################################## 2# 3# Makefile wrapper to build tk on Mac OS X in a way compatible with the tk/macosx Xcode buildsystem 4# uses the standard unix build system in tk/unix (which can be used directly instead of this 5# if you are not using the tk/macosx projects). 6# 7# Copyright (c) 2002-2008 Daniel A. Steffen <das@users.sourceforge.net> 8# 9# See the file "license.terms" for information on usage and redistribution of 10# this file, and for a DISCLAIMER OF ALL WARRANTIES. 11# 12######################################################################################################## 13 14#------------------------------------------------------------------------------------------------------- 15# customizable settings 16 17DESTDIR ?= 18INSTALL_ROOT ?= ${DESTDIR} 19 20BUILD_DIR ?= ${CURDIR}/../../build 21SYMROOT ?= ${BUILD_DIR}/${PROJECT} 22OBJROOT ?= ${SYMROOT} 23 24EXTRA_CONFIGURE_ARGS ?= 25EXTRA_MAKE_ARGS ?= 26 27INSTALL_PATH ?= /Library/Frameworks 28APPLICATION_INSTALL_PATH ?= /Applications/Utilities 29PREFIX ?= /usr/local 30BINDIR ?= ${PREFIX}/bin 31LIBDIR ?= ${INSTALL_PATH} 32MANDIR ?= ${PREFIX}/man 33 34# tcl build directory (containing tclConfig.sh and Makefile) 35TCL_BUILD_DIR ?= ${BUILD_DIR}/tcl/${BUILD_STYLE} 36# location of installed tcl, only used if tcl in TCL_BUILD_DIR can't be found 37TCL_FRAMEWORK_DIR ?= /Library/Frameworks 38TCLSH_DIR ?= ${PREFIX}/bin 39 40# set to non-empty value to install manpages in addition to html help: 41INSTALL_MANPAGES ?= 42 43# set to non-empty value to build TkX11 instead of TkAqua: 44TK_X11 ?= 45 46#------------------------------------------------------------------------------------------------------- 47# meta targets 48 49meta := all install embedded install-embedded clean distclean test 50 51styles := develop deploy 52 53all := ${styles} 54all : ${all} 55 56install := ${styles:%=install-%} 57install : ${install} 58install-%: action := install- 59 60embedded := ${styles:%=embedded-%} 61embedded : embedded-deploy 62install-embedded := ${embedded:%=install-%} 63install-embedded : install-embedded-deploy 64 65clean := ${styles:%=clean-%} 66clean : ${clean} 67clean-%: action := clean- 68distclean := ${styles:%=distclean-%} 69distclean : ${distclean} 70distclean-%: action := distclean- 71 72test := ${styles:%=test-%} 73test : ${test} 74test-%: action := test- 75 76targets := $(foreach v,${meta},${$v}) 77 78#------------------------------------------------------------------------------------------------------- 79# build styles 80 81BUILD_STYLE = 82CONFIGURE_ARGS = 83OBJ_DIR = ${OBJROOT}/${BUILD_STYLE} 84 85empty := 86space := ${empty} ${empty} 87objdir = $(subst ${space},\ ,${OBJ_DIR}) 88 89develop_make_args := BUILD_STYLE=Development CONFIGURE_ARGS=--enable-symbols 90deploy_make_args := BUILD_STYLE=Deployment INSTALL_TARGET=install-strip 91embedded_make_args := EMBEDDED_BUILD=1 92install_make_args := INSTALL_BUILD=1 93 94${targets}: 95 ${MAKE} ${action}${PROJECT} \ 96 $(foreach s,${styles} embedded install,$(if $(findstring $s,$@),${${s}_make_args})) 97 98#------------------------------------------------------------------------------------------------------- 99# project specific settings 100 101PROJECT := tk 102PRODUCT_NAME := Tk 103 104UNIX_DIR := ${CURDIR}/../unix 105VERSION := $(shell awk -F= '/^TK_VERSION/ {print $$2; nextfile}' ${UNIX_DIR}/configure.in) 106TCL_VERSION := ${VERSION} 107wish := wish 108WISH = wish${VERSION} 109 110BUILD_TARGET := all tktest 111INSTALL_TARGET := install 112 113ifneq ($(wildcard $(subst ${space},\ ,${TCL_BUILD_DIR})/tclConfig.sh),) 114TCL_DIR := ${TCL_BUILD_DIR} 115TCL_FRAMEWORK_DIR := ${TCL_BUILD_DIR}/.. 116MAKE_VARS := 117else 118TCL_DIR := ${TCL_FRAMEWORK_DIR}/Tcl.framework 119TCL_EXE := ${TCLSH_DIR}/tclsh${TCL_VERSION} 120MAKE_VARS := TCL_EXE 121export DYLD_FRAMEWORK_PATH := ${TCL_FRAMEWORK_DIR} 122endif 123 124export CPPROG := cp -p 125 126ifeq (${TK_X11},) 127override CONFIGURE_ARGS := ${CONFIGURE_ARGS} --enable-aqua 128else 129override CONFIGURE_ARGS := ${CONFIGURE_ARGS} --enable-xft 130VERSION := ${VERSION}-X11 131wish := ${wish}-X11 132override EMBEDDED_BUILD := 133endif 134 135INSTALL_TARGETS = install-binaries install-headers install-libraries 136ifeq (${EMBEDDED_BUILD},) 137INSTALL_TARGETS += install-private-headers install-demos 138endif 139ifeq (${INSTALL_BUILD}_${EMBEDDED_BUILD}_${BUILD_STYLE},1__Deployment) 140INSTALL_TARGETS += html-tk 141ifneq (${INSTALL_MANPAGES},) 142INSTALL_TARGETS += install-doc 143endif 144endif 145 146MAKE_VARS += INSTALL_ROOT INSTALL_TARGETS VERSION 147MAKE_ARGS_V = $(foreach v,${MAKE_VARS},$v='${$v}') 148 149build-${PROJECT}: target = ${BUILD_TARGET} 150install-${PROJECT}: target = ${INSTALL_TARGET} 151clean-${PROJECT} distclean-${PROJECT} test-${PROJECT}: \ 152 target = $* 153 154DO_MAKE = +${MAKE} -C "${OBJ_DIR}" ${target} ${MAKE_ARGS_V} ${MAKE_ARGS} ${EXTRA_MAKE_ARGS} 155 156#------------------------------------------------------------------------------------------------------- 157# locations for custom tk install actions 158 159ifeq (${INSTALL_BUILD},1) 160TOP_DIR := ${INSTALL_ROOT}/ 161APP_DIR := ${APPLICATION_INSTALL_PATH} 162FMWK_DIR := ${LIBDIR} 163else 164TOP_DIR := ${SYMROOT} 165APP_DIR := . 166FMWK_DIR := . 167endif 168 169TCL_FMWK_DIR := ${FMWK_DIR}/Tcl.framework/Versions/${TCL_VERSION} 170TK_FMWK_DIR := ${FMWK_DIR}/${PRODUCT_NAME}.framework/Versions/${VERSION} 171 172#------------------------------------------------------------------------------------------------------- 173# build rules 174 175${PROJECT}: 176 ${MAKE} install-${PROJECT} INSTALL_ROOT="${OBJ_DIR}/" 177 178${objdir}/Makefile: ${UNIX_DIR}/Makefile.in ${UNIX_DIR}/configure \ 179 ${UNIX_DIR}/tkConfig.sh.in Tk-Info.plist.in Wish-Info.plist.in 180 mkdir -p "${OBJ_DIR}" && cd "${OBJ_DIR}" && \ 181 if [ ${UNIX_DIR}/configure -nt config.status ]; then ${UNIX_DIR}/configure -C \ 182 --prefix="${PREFIX}" --bindir="${BINDIR}" --libdir="${LIBDIR}" \ 183 --mandir="${MANDIR}" --enable-threads --enable-framework \ 184 --with-tcl="${TCL_DIR}" \ 185 ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS}; else ./config.status; fi 186ifneq (${VERSION},${TCL_VERSION}) 187 @cd "${OBJ_DIR}" && sed -e 's#/Versions/${TCL_VERSION}#/Versions/${VERSION}#' \ 188 tkConfig.sh > tkConfig.sh.1 && mv -f tkConfig.sh.1 tkConfig.sh 189endif 190 191build-${PROJECT}: ${objdir}/Makefile 192 ${DO_MAKE} 193ifeq (${INSTALL_BUILD},) 194# symolic link hackery to trick 195# 'make install INSTALL_ROOT=${OBJ_DIR}' 196# into building Tk.framework and wish in ${SYMROOT} 197 @cd "${OBJ_DIR}" && mkdir -p $(dir $(subst ${space},\ ,./${LIBDIR})) $(dir $(subst ${space},\ ,./${BINDIR})) "${SYMROOT}" && \ 198 rm -rf "./${LIBDIR}" "./${BINDIR}" && ln -fs "${SYMROOT}" "./${LIBDIR}" && \ 199 ln -fs "${SYMROOT}" "./${BINDIR}" && ln -fs "${OBJ_DIR}/tktest" "${SYMROOT}" 200ifeq (${TK_X11},) 201 @rm -f "${OBJ_DIR}/${BINDIR}" && \ 202 ln -fs Wish.app/Contents/MacOS/Wish "${SYMROOT}/${WISH}" 203endif 204# Create symbolic link to Tcl.framework in ${SYMROOT}if necessary 205 @cd "${SYMROOT}" && if [ ! -e Tcl.framework -o -L Tcl.framework ]; then \ 206 rm -f Tcl.framework && ln -s "${TCL_FRAMEWORK_DIR}/Tcl.framework" . ; fi 207endif 208 209install-${PROJECT}: build-${PROJECT} 210ifeq (${EMBEDDED_BUILD}_${INSTALL_ROOT},1_) 211 @echo "Cannot install-embedded with empty INSTALL_ROOT !" && false 212endif 213ifeq (${EMBEDDED_BUILD},1) 214 @rm -rf "${INSTALL_ROOT}/${LIBDIR}/Tk.framework" 215endif 216 ${DO_MAKE} 217ifeq (${EMBEDDED_BUILD}_${TK_X11},1_) 218# workaround bug with 'cp -pRH' on Darwin 6 and earlier 219 @if [ "`uname -r | awk -F. '{print $$1}'`" -lt 7 ]; then \ 220 mkdir -p "${TOP_DIR}"/{"${TCL_FMWK_DIR}","${TK_FMWK_DIR}"}/PrivateHeaders; fi 221endif 222ifeq (${INSTALL_BUILD},1) 223ifeq (${EMBEDDED_BUILD},1) 224# if we are embedding frameworks, don't install wish 225 @rm -f "${INSTALL_ROOT}${BINDIR}/${WISH}" && \ 226 rmdir -p "${INSTALL_ROOT}${BINDIR}" 2>&- || true 227else 228# redo prebinding (when not building for Mac OS X 10.4 or later only) 229 @if [ "`echo "$${MACOSX_DEPLOYMENT_TARGET}" | \ 230 awk -F '10\\.' '{print int($$2)}'`" -lt 4 -a "`echo "$${CFLAGS}" | \ 231 awk -F '-mmacosx-version-min=10\\.' '{print int($$2)}'`" -lt 4 ]; \ 232 then cd ${INSTALL_ROOT}/; \ 233 if [ ! -d usr/lib ]; then mkdir -p usr && ln -fs /usr/lib usr/ && RM_USRLIB=1; fi; \ 234 if [ -n "${TK_X11}" -a ! -d usr/X11R6 ]; then mkdir -p usr && ln -fs /usr/X11R6 usr/ && RM_USRX11=1; fi; \ 235 if [ ! -d System ]; then ln -fs /System . && RM_SYSTEM=1; fi; \ 236 if [ ! -d "./${LIBDIR}/Tcl.framework" ]; then ln -fs "${TCL_FRAMEWORK_DIR}/Tcl.framework" "./${LIBDIR}"; RM_TCL=1; fi; \ 237 redo_prebinding -r . "./${TK_FMWK_DIR}/${PRODUCT_NAME}"; \ 238 if [ -z "${TK_X11}" ]; then redo_prebinding -r . "./${TK_FMWK_DIR}/Resources/Wish.app/Contents/MacOS/Wish"; \ 239 else redo_prebinding -r . "./${BINDIR}/${WISH}"; fi; \ 240 if [ -n "$${RM_USRLIB:-}" ]; then rm -f usr/lib; rmdir -p usr 2>&-; fi; \ 241 if [ -n "$${RM_USRX11:-}" ]; then rm -f usr/X11R6; rmdir -p usr 2>&-; fi; \ 242 if [ -n "$${RM_SYSTEM:-}" ]; then rm -f System; fi; \ 243 if [ -n "$${RM_TCL:-}" ]; then rm -f "./${LIBDIR}/Tcl.framework"; fi; fi 244# install wish symbolic link 245 @ln -fs ${WISH} "${INSTALL_ROOT}${BINDIR}/${wish}" 246endif 247endif 248ifeq (${BUILD_STYLE}_${EMBEDDED_BUILD},Development_) 249# keep copy of debug library around, so that 250# Deployment build can be installed on top 251# of Development build without overwriting 252# the debug library 253 @cd "${INSTALL_ROOT}${LIBDIR}/${PRODUCT_NAME}.framework/Versions/${VERSION}" && \ 254 ln -f "${PRODUCT_NAME}" "${PRODUCT_NAME}_debug" 255endif 256ifeq (${TK_X11},) 257ifeq (${EMBEDDED_BUILD},) 258# install Wish.app link in APPLICATION_INSTALL_PATH and setup 'Wish Shell' compatibility links 259 @cd "${TOP_DIR}" && if [ -n "${APP_DIR}" ]; then mkdir -p "./${APP_DIR}" && rm -rf "./${APP_DIR}/Wish.app" && \ 260 ln -fsh "./$$(echo "${APP_DIR}" | sed -e 's#/[^/][^/]*#/..#g')/${FMWK_DIR}/${PRODUCT_NAME}.framework/Resources/Wish.app" "./${APP_DIR}" && \ 261 ln -fsh Wish.app "./${APP_DIR}/Wish Shell.app"; fi && \ 262 ln -fsh Wish.app "./${TK_FMWK_DIR}/Resources/Wish Shell.app" && \ 263 ln -fsh Wish "./${TK_FMWK_DIR}/Resources/Wish.app/Contents/MacOS/Wish Shell" 264else 265# if we are embedding frameworks, move them into the app and fix their install names 266 @cd "${TOP_DIR}" && \ 267 rm -rf "./${APP_DIR}/Wish.app" && mkdir -p "./${APP_DIR}" && \ 268 mv -f "./${TK_FMWK_DIR}/Resources/Wish.app" "./${APP_DIR}" && \ 269 ln -fsh Wish.app "./${APP_DIR}/Wish Shell.app" && \ 270 rm -rf "./${APP_DIR}/Wish.app/Contents/Frameworks" && \ 271 mkdir -p "./${APP_DIR}/Wish.app/Contents/Frameworks" && \ 272 ${CPPROG} -RH "./${FMWK_DIR}"/T{cl,k}.framework "./${APP_DIR}/Wish.app/Contents/Frameworks" && \ 273 cd "./${APP_DIR}/Wish.app/Contents" && \ 274 rm -rf Frameworks/Tcl.framework/{,/Versions/${TCL_VERSION}}/{Headers,PrivateHeaders,*_debug,lib*.a,*Config.sh} && \ 275 rm -rf Frameworks/Tk.framework/{,/Versions/${VERSION}}/{Headers,PrivateHeaders,*_debug,lib*.a,*Config.sh} && \ 276 fix_install_id ( ) { \ 277 chmod -RH a+w "$$1"; \ 278 install_name_tool -id $$(otool -L "$$1" | awk "/$$2\.framework.*[^:]\$$/ {sub(\"^.*/Frameworks\",\"@executable_path/../Frameworks\",\$$1); print \$$1}") "$$1"; \ 279 chmod -RH a-w "$$1"; \ 280 } && \ 281 fix_install_name ( ) { \ 282 chmod -RH a+w "$$1"; \ 283 install_name_tool -change $$(otool -L "$$1" | awk "/$$2\.framework.*[^:]\$$/ {print \$$1; sub(\"^.*/Frameworks\",\"@executable_path/../Frameworks\",\$$1); print \$$1}") "$$1"; \ 284 chmod -RH a-w "$$1"; \ 285 } && \ 286 fix_install_id Frameworks/Tcl.framework/Tcl Tcl && fix_install_id Frameworks/Tk.framework/Tk Tk && \ 287 fix_install_name MacOS/Wish Tcl && fix_install_name MacOS/Wish Tk 288ifeq (${INSTALL_BUILD},1) 289 @cd "${TOP_DIR}" && rm -rf "./${FMWK_DIR}"/T{cl,k}.framework && rmdir -p "./${FMWK_DIR}" 2>&- || true 290endif 291endif 292endif 293 294clean-${PROJECT}: %-${PROJECT}: 295 ${DO_MAKE} 296 rm -rf "${SYMROOT}"/{${PRODUCT_NAME}.framework,${WISH},tktest} 297 rm -f "${OBJ_DIR}"{"${LIBDIR}","${BINDIR}"} && \ 298 rmdir -p "${OBJ_DIR}"$(dir $(subst ${space},\ ,${LIBDIR})) 2>&- || true && \ 299 rmdir -p "${OBJ_DIR}"$(dir $(subst ${space},\ ,${BINDIR})) 2>&- || true 300 301distclean-${PROJECT}: %-${PROJECT}: clean-${PROJECT} 302 ${DO_MAKE} 303 rm -rf "${OBJ_DIR}" 304 305test-${PROJECT}: %-${PROJECT}: build-${PROJECT} 306 ${DO_MAKE} 307 308#------------------------------------------------------------------------------------------------------- 309 310.PHONY: ${meta} ${targets} ${PROJECT} build-${PROJECT} install-${PROJECT} \ 311 clean-${PROJECT} distclean-${PROJECT} 312 313.NOTPARALLEL: 314 315#------------------------------------------------------------------------------------------------------- 316