1215226Sadrian################################################################# 2215226Sadrian# 3289870Sbdrewery# Generate crunched binaries using crunchgen(1). 4289870Sbdrewery# 5215226Sadrian# General notes: 6215226Sadrian# 7215226Sadrian# A number of Make variables are used to generate the crunchgen config file. 8215226Sadrian# 9215226Sadrian# CRUNCH_SRCDIRS: lists directories to search for included programs 10215226Sadrian# CRUNCH_PROGS: lists programs to be included 11215226Sadrian# CRUNCH_LIBS: libraries to statically link with 12215226Sadrian# CRUNCH_SHLIBS: libraries to dynamically link with 13215226Sadrian# CRUNCH_BUILDOPTS: generic build options to be added to every program 14215226Sadrian# CRUNCH_BUILDTOOLS: lists programs that need build tools built in the 15215226Sadrian# local architecture. 16215226Sadrian# 17215226Sadrian# Special options can be specified for individual programs 18289735Sbdrewery# CRUNCH_SRCDIR_${P}: base source directory for program ${P} 19289735Sbdrewery# CRUNCH_BUILDOPTS_${P}: additional build options for ${P} 20289735Sbdrewery# CRUNCH_ALIAS_${P}: additional names to be used for ${P} 21215226Sadrian# 22215226Sadrian# By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P} 23215226Sadrian# will be used to generate a hard link to the resulting binary. 24215226Sadrian# Specific links can be suppressed by setting 25289735Sbdrewery# CRUNCH_SUPPRESS_LINK_${NAME} to 1. 26215226Sadrian# 27229658Sadrian# If CRUNCH_GENERATE_LINKS is set to no, no links will be generated. 28229658Sadrian# 29215226Sadrian 30215226Sadrian# $FreeBSD: releng/11.0/share/mk/bsd.crunchgen.mk 301882 2016-06-14 16:19:54Z bdrewery $ 31215226Sadrian 32215226Sadrian################################################################## 33215226Sadrian# The following is pretty nearly a generic crunchgen-handling makefile 34215226Sadrian# 35215226Sadrian 36289735SbdreweryCONF= ${PROG}.conf 37289735SbdreweryOUTMK= ${PROG}.mk 38289735SbdreweryOUTC= ${PROG}.c 39289735SbdreweryOUTPUTS=${OUTMK} ${OUTC} ${PROG}.cache 40215226SadrianCRUNCHOBJS= ${.OBJDIR} 41289735SbdreweryCRUNCH_GENERATE_LINKS?= yes 42300806Sbdrewery# Don't let the prog.mk use MK_AUTO_OBJ, but do let the component builds use 43300806Sbdrewery# it. 44300806SbdreweryCRUNCHENV+= MK_AUTO_OBJ=no 45300806SbdreweryCRUNCH_BUILDOPTS+= MK_AUTO_OBJ=${MK_AUTO_OBJ} 46215226Sadrian 47289735SbdreweryCLEANFILES+= ${CONF} *.o *.lo *.c *.mk *.cache *.a *.h 48215226Sadrian 49251512Semaste# Don't try to extract debug info from ${PROG}. 50289735SbdreweryMK_DEBUG_FILES= no 51251512Semaste 52289846Sbdrewery# Set a default SRCDIR for each for simpler handling below. 53289846Sbdrewery.for D in ${CRUNCH_SRCDIRS} 54289846Sbdrewery.for P in ${CRUNCH_PROGS_${D}} 55289846SbdreweryCRUNCH_SRCDIR_${P}?= ${.CURDIR}/../../${D}/${P} 56289846Sbdrewery.endfor 57289846Sbdrewery.endfor 58289846Sbdrewery 59215226Sadrian# Program names and their aliases contribute hardlinks to 'rescue' executable, 60215226Sadrian# except for those that get suppressed. 61289735Sbdrewery.for D in ${CRUNCH_SRCDIRS} 62289735Sbdrewery.for P in ${CRUNCH_PROGS_${D}} 63289735Sbdrewery${OUTPUTS}: ${CRUNCH_SRCDIR_${P}}/Makefile 64229658Sadrian.if ${CRUNCH_GENERATE_LINKS} == "yes" 65215413Sadrian.ifndef CRUNCH_SUPPRESS_LINK_${P} 66289735SbdreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${P} 67215413Sadrian.endif 68289735Sbdrewery.for A in ${CRUNCH_ALIAS_${P}} 69215413Sadrian.ifndef CRUNCH_SUPPRESS_LINK_${A} 70289735SbdreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${A} 71215413Sadrian.endif 72215226Sadrian.endfor 73229658Sadrian.endif 74215226Sadrian.endfor 75215413Sadrian.endfor 76215226Sadrian 77296121Sbdrewery.if !defined(_SKIP_BUILD) 78289735Sbdreweryall: ${PROG} 79296121Sbdrewery.endif 80289735Sbdreweryexe: ${PROG} 81215226Sadrian 82289735Sbdrewery${CONF}: Makefile 83289735Sbdrewery echo \# Auto-generated, do not edit >${.TARGET} 84215226Sadrian.ifdef CRUNCH_BUILDOPTS 85289735Sbdrewery echo buildopts ${CRUNCH_BUILDOPTS} >>${.TARGET} 86215226Sadrian.endif 87215226Sadrian.ifdef CRUNCH_LIBS 88289735Sbdrewery echo libs ${CRUNCH_LIBS} >>${.TARGET} 89215226Sadrian.endif 90215226Sadrian.ifdef CRUNCH_SHLIBS 91289735Sbdrewery echo libs_so ${CRUNCH_SHLIBS} >>${.TARGET} 92215226Sadrian.endif 93289735Sbdrewery.for D in ${CRUNCH_SRCDIRS} 94289735Sbdrewery.for P in ${CRUNCH_PROGS_${D}} 95289735Sbdrewery echo progs ${P} >>${.TARGET} 96289735Sbdrewery echo special ${P} srcdir ${CRUNCH_SRCDIR_${P}} >>${.TARGET} 97215226Sadrian.ifdef CRUNCH_BUILDOPTS_${P} 98289735Sbdrewery echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ \ 99289735Sbdrewery ${CRUNCH_BUILDOPTS_${P}} >>${.TARGET} 100215226Sadrian.else 101289735Sbdrewery echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ >>${.TARGET} 102215226Sadrian.endif 103289735Sbdrewery.for A in ${CRUNCH_ALIAS_${P}} 104289735Sbdrewery echo ln ${P} ${A} >>${.TARGET} 105215226Sadrian.endfor 106215226Sadrian.endfor 107215226Sadrian.endfor 108215226Sadrian 109284341SsjgCRUNCHGEN?= crunchgen 110300806SbdreweryCRUNCHENV+= MK_TESTS=no \ 111300807Sbdrewery UPDATE_DEPENDFILE=no \ 112300801Sbdrewery _RECURSING_CRUNCH=1 113289735Sbdrewery.ORDER: ${OUTPUTS} objs 114300802Sbdrewery${OUTPUTS:[1]}: .META 115300802Sbdrewery${OUTPUTS}: ${CONF} 116300806Sbdrewery MAKE=${MAKE} ${CRUNCHENV:NMK_AUTO_OBJ=*} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ 117300806Sbdrewery MK_AUTO_OBJ=${MK_AUTO_OBJ} \ 118300801Sbdrewery ${CRUNCHGEN} -fq -m ${OUTMK} -c ${OUTC} ${CONF} 119300804Sbdrewery # Avoid redundantly calling 'make objs' which we've done by our 120300804Sbdrewery # own dependencies. 121300804Sbdrewery sed -i '' -e "s/^\(${PROG}:.*\) \$$(SUBMAKE_TARGETS)/\1/" ${OUTMK} 122215226Sadrian 123289731Sbdrewery# These 2 targets cannot use .MAKE since they depend on the generated 124289731Sbdrewery# ${OUTMK} above. 125300807Sbdrewery${PROG}: ${OUTPUTS} objs .META 126300806Sbdrewery ${CRUNCHENV} \ 127300803Sbdrewery CC="${CC} ${CFLAGS} ${LDFLAGS}" \ 128300803Sbdrewery CXX="${CXX} ${CXXFLAGS} ${LDFLAGS}" \ 129300807Sbdrewery ${MAKE} .MAKE.MODE=normal -f ${OUTMK} exe 130215226Sadrian 131300807Sbdreweryobjs: ${OUTMK} .META 132300806Sbdrewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ 133301882Sbdrewery ${MAKE} -f ${OUTMK} BUILD_TOOLS_META=.NOMETA_CMP objs 134215226Sadrian 135215226Sadrian# <sigh> Someone should replace the bin/csh and bin/sh build-tools with 136215226Sadrian# shell scripts so we can remove this nonsense. 137289735Sbdrewery.for _tool in ${CRUNCH_BUILDTOOLS} 138289734Sbdrewerybuild-tools-${_tool}: 139289735Sbdrewery ${_+_}cd ${.CURDIR}/../../${_tool}; \ 140289734Sbdrewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \ 141289734Sbdrewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools 142289734Sbdrewerybuild-tools: build-tools-${_tool} 143215226Sadrian.endfor 144215226Sadrian 145215226Sadrian# Use a separate build tree to hold files compiled for this crunchgen binary 146215226Sadrian# Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't 147215226Sadrian# get that to cooperate with bsd.prog.mk. Besides, many of the standard 148215226Sadrian# targets should NOT be propagated into the components. 149289734Sbdrewery.for __target in clean cleandepend cleandir obj objlink 150289735Sbdrewery.for D in ${CRUNCH_SRCDIRS} 151289735Sbdrewery.for P in ${CRUNCH_PROGS_${D}} 152289734Sbdrewery${__target}_crunchdir_${P}: .PHONY .MAKE 153289846Sbdrewery ${_+_}cd ${CRUNCH_SRCDIR_${P}} && \ 154289731Sbdrewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 155289734Sbdrewery DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${__target} 156289734Sbdrewery${__target}: ${__target}_crunchdir_${P} 157215226Sadrian.endfor 158215226Sadrian.endfor 159289734Sbdrewery.endfor 160215226Sadrian 161215226Sadrianclean: 162215226Sadrian rm -f ${CLEANFILES} 163289735Sbdrewery ${_+_}if [ -e ${.OBJDIR}/${OUTMK} ]; then \ 164289735Sbdrewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} \ 165289735Sbdrewery -f ${OUTMK} clean; \ 166215226Sadrian fi 167300807Sbdrewery 168300807SbdreweryMETA_XTRAS+= ${find ${CRUNCHOBJS}${SRCTOP} -name '*.meta' 2>/dev/null || true:L:sh} 169