xref: /freebsd/share/mk/bsd.crunchgen.mk (revision ec02e5e3ba898865bd65495c87d320670730f7e8)
1169733f4SAdrian Chadd#################################################################
2169733f4SAdrian Chadd#
3ce3c9a36SBryan Drewery# Generate crunched binaries using crunchgen(1).
4ce3c9a36SBryan Drewery#
5169733f4SAdrian Chadd# General notes:
6169733f4SAdrian Chadd#
7169733f4SAdrian Chadd# A number of Make variables are used to generate the crunchgen config file.
8169733f4SAdrian Chadd#
9169733f4SAdrian Chadd#  CRUNCH_SRCDIRS: lists directories to search for included programs
10169733f4SAdrian Chadd#  CRUNCH_PROGS:  lists programs to be included
11169733f4SAdrian Chadd#  CRUNCH_LIBS:  libraries to statically link with
12169733f4SAdrian Chadd#  CRUNCH_SHLIBS:  libraries to dynamically link with
13169733f4SAdrian Chadd#  CRUNCH_BUILDOPTS: generic build options to be added to every program
14169733f4SAdrian Chadd#  CRUNCH_BUILDTOOLS: lists programs that need build tools built in the
15169733f4SAdrian Chadd#       local architecture.
16169733f4SAdrian Chadd#
17169733f4SAdrian Chadd# Special options can be specified for individual programs
18d4f564c5SBryan Drewery#  CRUNCH_SRCDIR_${P}: base source directory for program ${P}
19d4f564c5SBryan Drewery#  CRUNCH_BUILDOPTS_${P}: additional build options for ${P}
20d4f564c5SBryan Drewery#  CRUNCH_ALIAS_${P}: additional names to be used for ${P}
21169733f4SAdrian Chadd#
22169733f4SAdrian Chadd# By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P}
23169733f4SAdrian Chadd# will be used to generate a hard link to the resulting binary.
24169733f4SAdrian Chadd# Specific links can be suppressed by setting
25d4f564c5SBryan Drewery# CRUNCH_SUPPRESS_LINK_${NAME} to 1.
26169733f4SAdrian Chadd#
27030b95d4SAdrian Chadd# If CRUNCH_GENERATE_LINKS is set to no, no links will be generated.
28030b95d4SAdrian Chadd#
29169733f4SAdrian Chadd
30169733f4SAdrian Chadd# $FreeBSD$
31169733f4SAdrian Chadd
32169733f4SAdrian Chadd##################################################################
33169733f4SAdrian Chadd#  The following is pretty nearly a generic crunchgen-handling makefile
34169733f4SAdrian Chadd#
35169733f4SAdrian Chadd
36d4f564c5SBryan DreweryCONF=	${PROG}.conf
37d4f564c5SBryan DreweryOUTMK=	${PROG}.mk
38d4f564c5SBryan DreweryOUTC=	${PROG}.c
39d4f564c5SBryan DreweryOUTPUTS=${OUTMK} ${OUTC} ${PROG}.cache
40169733f4SAdrian ChaddCRUNCHOBJS= ${.OBJDIR}
41030b95d4SAdrian ChaddCRUNCH_GENERATE_LINKS?= yes
42169733f4SAdrian Chadd
43d4f564c5SBryan DreweryCLEANFILES+= ${CONF} *.o *.lo *.c *.mk *.cache *.a *.h
44169733f4SAdrian Chadd
4542f8c5b5SEd Maste# Don't try to extract debug info from ${PROG}.
4614472d17SWarner LoshMK_DEBUG_FILES= no
4742f8c5b5SEd Maste
480d2a1539SBryan Drewery# Set a default SRCDIR for each for simpler handling below.
490d2a1539SBryan Drewery.for D in ${CRUNCH_SRCDIRS}
500d2a1539SBryan Drewery.for P in ${CRUNCH_PROGS_${D}}
510d2a1539SBryan DreweryCRUNCH_SRCDIR_${P}?=	${.CURDIR}/../../${D}/${P}
520d2a1539SBryan Drewery.endfor
530d2a1539SBryan Drewery.endfor
540d2a1539SBryan Drewery
55169733f4SAdrian Chadd# Program names and their aliases contribute hardlinks to 'rescue' executable,
56169733f4SAdrian Chadd# except for those that get suppressed.
57d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS}
58d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}}
59d4f564c5SBryan Drewery${OUTPUTS}: ${CRUNCH_SRCDIR_${P}}/Makefile
60030b95d4SAdrian Chadd.if ${CRUNCH_GENERATE_LINKS} == "yes"
617d31a762SAdrian Chadd.ifndef CRUNCH_SUPPRESS_LINK_${P}
62d4f564c5SBryan DreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${P}
637d31a762SAdrian Chadd.endif
64d4f564c5SBryan Drewery.for A in ${CRUNCH_ALIAS_${P}}
657d31a762SAdrian Chadd.ifndef CRUNCH_SUPPRESS_LINK_${A}
66d4f564c5SBryan DreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${A}
677d31a762SAdrian Chadd.endif
687d31a762SAdrian Chadd.endfor
69030b95d4SAdrian Chadd.endif
70169733f4SAdrian Chadd.endfor
71169733f4SAdrian Chadd.endfor
72169733f4SAdrian Chadd
73db74470bSBryan Drewery.if !defined(_SKIP_BUILD)
74d4f564c5SBryan Dreweryall: ${PROG}
75db74470bSBryan Drewery.endif
76d4f564c5SBryan Dreweryexe: ${PROG}
77169733f4SAdrian Chadd
78d4f564c5SBryan Drewery${CONF}: Makefile
79d4f564c5SBryan Drewery	echo \# Auto-generated, do not edit >${.TARGET}
80169733f4SAdrian Chadd.ifdef CRUNCH_BUILDOPTS
81d4f564c5SBryan Drewery	echo buildopts ${CRUNCH_BUILDOPTS} >>${.TARGET}
82169733f4SAdrian Chadd.endif
83169733f4SAdrian Chadd.ifdef CRUNCH_LIBS
84d4f564c5SBryan Drewery	echo libs ${CRUNCH_LIBS} >>${.TARGET}
85169733f4SAdrian Chadd.endif
86169733f4SAdrian Chadd.ifdef CRUNCH_SHLIBS
87d4f564c5SBryan Drewery	echo libs_so ${CRUNCH_SHLIBS} >>${.TARGET}
88169733f4SAdrian Chadd.endif
89d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS}
90d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}}
91d4f564c5SBryan Drewery	echo progs ${P} >>${.TARGET}
92d4f564c5SBryan Drewery	echo special ${P} srcdir ${CRUNCH_SRCDIR_${P}} >>${.TARGET}
93169733f4SAdrian Chadd.ifdef CRUNCH_BUILDOPTS_${P}
94d4f564c5SBryan Drewery	echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ \
95d4f564c5SBryan Drewery	    ${CRUNCH_BUILDOPTS_${P}} >>${.TARGET}
96169733f4SAdrian Chadd.else
97d4f564c5SBryan Drewery	echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ >>${.TARGET}
98169733f4SAdrian Chadd.endif
99d4f564c5SBryan Drewery.for A in ${CRUNCH_ALIAS_${P}}
100d4f564c5SBryan Drewery	echo ln ${P} ${A} >>${.TARGET}
101169733f4SAdrian Chadd.endfor
102169733f4SAdrian Chadd.endfor
103169733f4SAdrian Chadd.endfor
104169733f4SAdrian Chadd
1054b9775d8SSimon J. GerratyCRUNCHGEN?= crunchgen
106409bf2b0SBryan DreweryCRUNCHENV?= MK_TESTS=no \
107409bf2b0SBryan Drewery	    _RECURSING_CRUNCH=1
108d4f564c5SBryan Drewery.ORDER: ${OUTPUTS} objs
109a13e2ac5SBryan Drewery${OUTPUTS:[1]}: .META
110a13e2ac5SBryan Drewery${OUTPUTS}: ${CONF}
111409bf2b0SBryan Drewery	MAKE=${MAKE} ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \
112409bf2b0SBryan Drewery	    ${CRUNCHGEN} -fq -m ${OUTMK} -c ${OUTC} ${CONF}
113169733f4SAdrian Chadd
11401d591d4SBryan Drewery# These 2 targets cannot use .MAKE since they depend on the generated
11501d591d4SBryan Drewery# ${OUTMK} above.
116d4f564c5SBryan Drewery${PROG}: ${OUTPUTS} objs
117*ec02e5e3SBryan Drewery	${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \
118*ec02e5e3SBryan Drewery	    CC="${CC} ${CFLAGS} ${LDFLAGS}" \
119*ec02e5e3SBryan Drewery	    CXX="${CXX} ${CXXFLAGS} ${LDFLAGS}" \
120*ec02e5e3SBryan Drewery	    ${MAKE} -f ${OUTMK} exe
121169733f4SAdrian Chadd
122d4f564c5SBryan Dreweryobjs: ${OUTMK}
123d4f564c5SBryan Drewery	${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f ${OUTMK} objs
124169733f4SAdrian Chadd
125169733f4SAdrian Chadd# <sigh> Someone should replace the bin/csh and bin/sh build-tools with
126169733f4SAdrian Chadd# shell scripts so we can remove this nonsense.
127d4f564c5SBryan Drewery.for _tool in ${CRUNCH_BUILDTOOLS}
1285583e49bSBryan Drewerybuild-tools-${_tool}:
129d4f564c5SBryan Drewery	${_+_}cd ${.CURDIR}/../../${_tool}; \
13001d591d4SBryan Drewery	    ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \
13101d591d4SBryan Drewery	    ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools
1325583e49bSBryan Drewerybuild-tools: build-tools-${_tool}
133169733f4SAdrian Chadd.endfor
134169733f4SAdrian Chadd
135169733f4SAdrian Chadd# Use a separate build tree to hold files compiled for this crunchgen binary
136169733f4SAdrian Chadd# Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't
137169733f4SAdrian Chadd# get that to cooperate with bsd.prog.mk.  Besides, many of the standard
138169733f4SAdrian Chadd# targets should NOT be propagated into the components.
1395583e49bSBryan Drewery.for __target in clean cleandepend cleandir obj objlink
140d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS}
141d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}}
1425583e49bSBryan Drewery${__target}_crunchdir_${P}: .PHONY .MAKE
1430d2a1539SBryan Drewery	${_+_}cd ${CRUNCH_SRCDIR_${P}} && \
1445583e49bSBryan Drewery	    ${CRUNCHENV} MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \
1455583e49bSBryan Drewery	    DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${__target}
1465583e49bSBryan Drewery${__target}: ${__target}_crunchdir_${P}
1475583e49bSBryan Drewery.endfor
148169733f4SAdrian Chadd.endfor
149169733f4SAdrian Chadd.endfor
150169733f4SAdrian Chadd
151169733f4SAdrian Chaddclean:
152169733f4SAdrian Chadd	rm -f ${CLEANFILES}
153d4f564c5SBryan Drewery	${_+_}if [ -e ${.OBJDIR}/${OUTMK} ]; then			\
154d4f564c5SBryan Drewery		${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} 	\
155d4f564c5SBryan Drewery		-f ${OUTMK} clean;					\
156169733f4SAdrian Chadd	fi
157