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