1######################################################################################################## 2# 3# Makefile wrapper to build tcl on Mac OS X in a way compatible with the tk/macosx Xcode buildsystem 4# uses the standard unix build system in tcl/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# customizable settings 15 16DESTDIR ?= 17INSTALL_ROOT ?= ${DESTDIR} 18 19BUILD_DIR ?= ${CURDIR}/../../build 20SYMROOT ?= ${BUILD_DIR}/${PROJECT} 21OBJROOT ?= ${SYMROOT} 22 23EXTRA_CONFIGURE_ARGS ?= 24EXTRA_MAKE_ARGS ?= 25 26INSTALL_PATH ?= /Library/Frameworks 27PREFIX ?= /usr/local 28BINDIR ?= ${PREFIX}/bin 29LIBDIR ?= ${INSTALL_PATH} 30MANDIR ?= ${PREFIX}/man 31 32# set to non-empty value to install manpages in addition to html help: 33INSTALL_MANPAGES ?= 34 35# Checks and overrides for subframework builds 36ifeq (${SUBFRAMEWORK},1) 37ifeq (${DYLIB_INSTALL_DIR},) 38 @echo "Cannot install subframework with empty DYLIB_INSTALL_DIR !" && false 39endif 40ifeq (${DESTDIR},) 41 @echo "Cannot install subframework with empty DESTDIR !" && false 42endif 43override BUILD_DIR = ${DESTDIR}/build 44override INSTALL_PATH = /Frameworks 45endif 46 47#------------------------------------------------------------------------------------------------------- 48# meta targets 49 50meta := all install embedded install-embedded clean distclean test 51 52styles := develop deploy 53 54all := ${styles} 55all : ${all} 56 57install := ${styles:%=install-%} 58install : ${install} 59install-%: action := install- 60 61embedded := ${styles:%=embedded-%} 62embedded : embedded-deploy 63install-embedded := ${embedded:%=install-%} 64install-embedded : install-embedded-deploy 65 66clean := ${styles:%=clean-%} 67clean : ${clean} 68clean-%: action := clean- 69distclean := ${styles:%=distclean-%} 70distclean : ${distclean} 71distclean-%: action := distclean- 72 73test := ${styles:%=test-%} 74test : ${test} 75test-%: action := test- 76 77targets := $(foreach v,${meta},${$v}) 78 79#------------------------------------------------------------------------------------------------------- 80# build styles 81 82BUILD_STYLE = 83CONFIGURE_ARGS = 84OBJ_DIR = ${OBJROOT}/${BUILD_STYLE} 85 86empty := 87space := ${empty} ${empty} 88objdir = $(subst ${space},\ ,${OBJ_DIR}) 89 90develop_make_args := BUILD_STYLE=Development CONFIGURE_ARGS=--enable-symbols 91deploy_make_args := BUILD_STYLE=Deployment INSTALL_TARGET=install-strip \ 92 EXTRA_CFLAGS=-DNDEBUG 93embedded_make_args := EMBEDDED_BUILD=1 94install_make_args := INSTALL_BUILD=1 95 96${targets}: 97 ${MAKE} ${action}${PROJECT} \ 98 $(foreach s,${styles} embedded install,$(if $(findstring $s,$@),${${s}_make_args})) 99 100#------------------------------------------------------------------------------------------------------- 101# project specific settings 102 103PROJECT := tcl 104PRODUCT_NAME := Tcl 105 106UNIX_DIR := ${CURDIR}/../unix 107VERSION := $(shell awk -F= '/^TCL_VERSION/ {print $$2; nextfile}' ${UNIX_DIR}/configure.ac) 108TCLSH := tclsh${VERSION} 109 110BUILD_TARGET := all tcltest 111INSTALL_TARGET := install 112 113export CPPROG := cp -p 114 115INSTALL_TARGETS = install-binaries install-headers install-libraries 116ifeq (${EMBEDDED_BUILD},) 117INSTALL_TARGETS += install-private-headers 118endif 119ifeq (${INSTALL_BUILD}_${EMBEDDED_BUILD}_${BUILD_STYLE},1__Deployment) 120INSTALL_TARGETS += install-packages html-tcl 121ifneq (${INSTALL_MANPAGES},) 122INSTALL_TARGETS += install-doc 123endif 124endif 125 126MAKE_VARS := INSTALL_ROOT INSTALL_TARGETS VERSION GENERIC_FLAGS 127MAKE_ARGS_V = $(foreach v,${MAKE_VARS},$v='${$v}') 128 129build-${PROJECT}: target = ${BUILD_TARGET} 130install-${PROJECT}: target = ${INSTALL_TARGET} 131clean-${PROJECT} distclean-${PROJECT} test-${PROJECT}: \ 132 target = $* 133 134DO_MAKE = +${MAKE} -C "${OBJ_DIR}" ${target} ${MAKE_ARGS_V} ${MAKE_ARGS} ${EXTRA_MAKE_ARGS} 135 136#------------------------------------------------------------------------------------------------------- 137# build rules 138 139${PROJECT}: 140 ${MAKE} install-${PROJECT} INSTALL_ROOT="${OBJ_DIR}/" 141 142${objdir}/Makefile: ${UNIX_DIR}/Makefile.in ${UNIX_DIR}/configure \ 143 ${UNIX_DIR}/tclConfig.sh.in Tcl-Info.plist.in 144 mkdir -p "${OBJ_DIR}" && cd "${OBJ_DIR}" && \ 145 if [ ${UNIX_DIR}/configure -nt config.status ]; then ${UNIX_DIR}/configure -C \ 146 --prefix="${PREFIX}" --bindir="${BINDIR}" --libdir="${LIBDIR}" \ 147 --mandir="${MANDIR}" --enable-framework --enable-dtrace --disable-zipfs \ 148 ${CONFIGURE_ARGS} ${EXTRA_CONFIGURE_ARGS}; else ./config.status; fi 149 150build-${PROJECT}: ${objdir}/Makefile 151 ${DO_MAKE} 152ifeq (${INSTALL_BUILD},) 153# symolic link hackery to trick 154# 'make install INSTALL_ROOT=${OBJ_DIR}' 155# into building Tcl.framework and tclsh in ${SYMROOT} 156 @cd "${OBJ_DIR}" && mkdir -p $(dir $(subst ${space},\ ,.${LIBDIR})) $(dir $(subst ${space},\ ,.${BINDIR})) "${SYMROOT}" && \ 157 rm -f ".${LIBDIR}" ".${BINDIR}" && ln -fs "${SYMROOT}" ".${LIBDIR}" && \ 158 ln -fs "${SYMROOT}" ".${BINDIR}" && ln -fs "${OBJ_DIR}/tcltest" "${SYMROOT}" 159endif 160 161install-${PROJECT}: build-${PROJECT} 162ifeq (${EMBEDDED_BUILD}_${INSTALL_ROOT},1_) 163 @echo "Cannot install-embedded with empty INSTALL_ROOT !" && false 164endif 165ifeq (${EMBEDDED_BUILD},1) 166 @rm -rf "${INSTALL_ROOT}${LIBDIR}/Tcl.framework" 167endif 168 ${DO_MAKE} 169ifeq (${INSTALL_BUILD},1) 170ifeq (${EMBEDDED_BUILD},1) 171# if we are embedding frameworks, don't install tclsh 172 @rm -f "${INSTALL_ROOT}${BINDIR}/${TCLSH}" && \ 173 rmdir -p "${INSTALL_ROOT}${BINDIR}" 2>&- || true 174else 175# install tclsh symbolic link 176 @ln -fs ${TCLSH} "${INSTALL_ROOT}${BINDIR}/tclsh" 177endif 178endif 179ifeq (${BUILD_STYLE}_${EMBEDDED_BUILD},Development_) 180# keep copy of debug library around, so that 181# Deployment build can be installed on top 182# of Development build without overwriting 183# the debug library 184 @if [ -d "${INSTALL_ROOT}${LIBDIR}/${PRODUCT_NAME}.framework/Versions/${VERSION}" ]; then \ 185 cd "${INSTALL_ROOT}${LIBDIR}/${PRODUCT_NAME}.framework/Versions/${VERSION}"; \ 186 ln -f "${PRODUCT_NAME}" "${PRODUCT_NAME}_debug"; \ 187 fi 188endif 189 190clean-${PROJECT}: %-${PROJECT}: 191 ${DO_MAKE} 192 rm -rf "${SYMROOT}"/{${PRODUCT_NAME}.framework,${TCLSH},tcltest} 193 rm -f "${OBJ_DIR}"{"${LIBDIR}","${BINDIR}"} && \ 194 rmdir -p "${OBJ_DIR}"$(dir $(subst ${space},\ ,${LIBDIR})) 2>&- || true && \ 195 rmdir -p "${OBJ_DIR}"$(dir $(subst ${space},\ ,${BINDIR})) 2>&- || true 196 197distclean-${PROJECT}: %-${PROJECT}: clean-${PROJECT} 198 ${DO_MAKE} 199 rm -rf "${OBJ_DIR}" 200 201test-${PROJECT}: %-${PROJECT}: build-${PROJECT} 202 ${DO_MAKE} 203 204#------------------------------------------------------------------------------------------------------- 205 206.PHONY: ${meta} ${targets} ${PROJECT} build-${PROJECT} install-${PROJECT} \ 207 clean-${PROJECT} distclean-${PROJECT} 208 209.NOTPARALLEL: 210 211#------------------------------------------------------------------------------------------------------- 212