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