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 42*eb9b07bbSBryan Drewery# Don't let the prog.mk use MK_AUTO_OBJ, but do let the component builds use 43*eb9b07bbSBryan Drewery# it. 44*eb9b07bbSBryan DreweryCRUNCHENV+= MK_AUTO_OBJ=no 45*eb9b07bbSBryan DreweryCRUNCH_BUILDOPTS+= MK_AUTO_OBJ=${MK_AUTO_OBJ} 46169733f4SAdrian Chadd 47d4f564c5SBryan DreweryCLEANFILES+= ${CONF} *.o *.lo *.c *.mk *.cache *.a *.h 48169733f4SAdrian Chadd 4942f8c5b5SEd Maste# Don't try to extract debug info from ${PROG}. 5014472d17SWarner LoshMK_DEBUG_FILES= no 5142f8c5b5SEd Maste 520d2a1539SBryan Drewery# Set a default SRCDIR for each for simpler handling below. 530d2a1539SBryan Drewery.for D in ${CRUNCH_SRCDIRS} 540d2a1539SBryan Drewery.for P in ${CRUNCH_PROGS_${D}} 550d2a1539SBryan DreweryCRUNCH_SRCDIR_${P}?= ${.CURDIR}/../../${D}/${P} 560d2a1539SBryan Drewery.endfor 570d2a1539SBryan Drewery.endfor 580d2a1539SBryan Drewery 59169733f4SAdrian Chadd# Program names and their aliases contribute hardlinks to 'rescue' executable, 60169733f4SAdrian Chadd# except for those that get suppressed. 61d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS} 62d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}} 63d4f564c5SBryan Drewery${OUTPUTS}: ${CRUNCH_SRCDIR_${P}}/Makefile 64030b95d4SAdrian Chadd.if ${CRUNCH_GENERATE_LINKS} == "yes" 657d31a762SAdrian Chadd.ifndef CRUNCH_SUPPRESS_LINK_${P} 66d4f564c5SBryan DreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${P} 677d31a762SAdrian Chadd.endif 68d4f564c5SBryan Drewery.for A in ${CRUNCH_ALIAS_${P}} 697d31a762SAdrian Chadd.ifndef CRUNCH_SUPPRESS_LINK_${A} 70d4f564c5SBryan DreweryLINKS+= ${BINDIR}/${PROG} ${BINDIR}/${A} 717d31a762SAdrian Chadd.endif 727d31a762SAdrian Chadd.endfor 73030b95d4SAdrian Chadd.endif 74169733f4SAdrian Chadd.endfor 75169733f4SAdrian Chadd.endfor 76169733f4SAdrian Chadd 77db74470bSBryan Drewery.if !defined(_SKIP_BUILD) 78d4f564c5SBryan Dreweryall: ${PROG} 79db74470bSBryan Drewery.endif 80d4f564c5SBryan Dreweryexe: ${PROG} 81169733f4SAdrian Chadd 82d4f564c5SBryan Drewery${CONF}: Makefile 83d4f564c5SBryan Drewery echo \# Auto-generated, do not edit >${.TARGET} 84169733f4SAdrian Chadd.ifdef CRUNCH_BUILDOPTS 85d4f564c5SBryan Drewery echo buildopts ${CRUNCH_BUILDOPTS} >>${.TARGET} 86169733f4SAdrian Chadd.endif 87169733f4SAdrian Chadd.ifdef CRUNCH_LIBS 88d4f564c5SBryan Drewery echo libs ${CRUNCH_LIBS} >>${.TARGET} 89169733f4SAdrian Chadd.endif 90169733f4SAdrian Chadd.ifdef CRUNCH_SHLIBS 91d4f564c5SBryan Drewery echo libs_so ${CRUNCH_SHLIBS} >>${.TARGET} 92169733f4SAdrian Chadd.endif 93d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS} 94d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}} 95d4f564c5SBryan Drewery echo progs ${P} >>${.TARGET} 96d4f564c5SBryan Drewery echo special ${P} srcdir ${CRUNCH_SRCDIR_${P}} >>${.TARGET} 97169733f4SAdrian Chadd.ifdef CRUNCH_BUILDOPTS_${P} 98d4f564c5SBryan Drewery echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ \ 99d4f564c5SBryan Drewery ${CRUNCH_BUILDOPTS_${P}} >>${.TARGET} 100169733f4SAdrian Chadd.else 101d4f564c5SBryan Drewery echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ >>${.TARGET} 102169733f4SAdrian Chadd.endif 103d4f564c5SBryan Drewery.for A in ${CRUNCH_ALIAS_${P}} 104d4f564c5SBryan Drewery echo ln ${P} ${A} >>${.TARGET} 105169733f4SAdrian Chadd.endfor 106169733f4SAdrian Chadd.endfor 107169733f4SAdrian Chadd.endfor 108169733f4SAdrian Chadd 1094b9775d8SSimon J. GerratyCRUNCHGEN?= crunchgen 110*eb9b07bbSBryan DreweryCRUNCHENV+= MK_TESTS=no \ 111409bf2b0SBryan Drewery _RECURSING_CRUNCH=1 112d4f564c5SBryan Drewery.ORDER: ${OUTPUTS} objs 113a13e2ac5SBryan Drewery${OUTPUTS:[1]}: .META 114a13e2ac5SBryan Drewery${OUTPUTS}: ${CONF} 115*eb9b07bbSBryan Drewery MAKE=${MAKE} ${CRUNCHENV:NMK_AUTO_OBJ=*} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ 116*eb9b07bbSBryan Drewery MK_AUTO_OBJ=${MK_AUTO_OBJ} \ 117409bf2b0SBryan Drewery ${CRUNCHGEN} -fq -m ${OUTMK} -c ${OUTC} ${CONF} 1188ab39856SBryan Drewery # Avoid redundantly calling 'make objs' which we've done by our 1198ab39856SBryan Drewery # own dependencies. 1208ab39856SBryan Drewery sed -i '' -e "s/^\(${PROG}:.*\) \$$(SUBMAKE_TARGETS)/\1/" ${OUTMK} 121169733f4SAdrian Chadd 12201d591d4SBryan Drewery# These 2 targets cannot use .MAKE since they depend on the generated 12301d591d4SBryan Drewery# ${OUTMK} above. 124d4f564c5SBryan Drewery${PROG}: ${OUTPUTS} objs 125*eb9b07bbSBryan Drewery ${CRUNCHENV} \ 126ec02e5e3SBryan Drewery CC="${CC} ${CFLAGS} ${LDFLAGS}" \ 127ec02e5e3SBryan Drewery CXX="${CXX} ${CXXFLAGS} ${LDFLAGS}" \ 128ec02e5e3SBryan Drewery ${MAKE} -f ${OUTMK} exe 129169733f4SAdrian Chadd 130d4f564c5SBryan Dreweryobjs: ${OUTMK} 131*eb9b07bbSBryan Drewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} \ 132*eb9b07bbSBryan Drewery ${MAKE} -f ${OUTMK} objs 133169733f4SAdrian Chadd 134169733f4SAdrian Chadd# <sigh> Someone should replace the bin/csh and bin/sh build-tools with 135169733f4SAdrian Chadd# shell scripts so we can remove this nonsense. 136d4f564c5SBryan Drewery.for _tool in ${CRUNCH_BUILDTOOLS} 1375583e49bSBryan Drewerybuild-tools-${_tool}: 138d4f564c5SBryan Drewery ${_+_}cd ${.CURDIR}/../../${_tool}; \ 13901d591d4SBryan Drewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \ 14001d591d4SBryan Drewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools 1415583e49bSBryan Drewerybuild-tools: build-tools-${_tool} 142169733f4SAdrian Chadd.endfor 143169733f4SAdrian Chadd 144169733f4SAdrian Chadd# Use a separate build tree to hold files compiled for this crunchgen binary 145169733f4SAdrian Chadd# Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't 146169733f4SAdrian Chadd# get that to cooperate with bsd.prog.mk. Besides, many of the standard 147169733f4SAdrian Chadd# targets should NOT be propagated into the components. 1485583e49bSBryan Drewery.for __target in clean cleandepend cleandir obj objlink 149d4f564c5SBryan Drewery.for D in ${CRUNCH_SRCDIRS} 150d4f564c5SBryan Drewery.for P in ${CRUNCH_PROGS_${D}} 1515583e49bSBryan Drewery${__target}_crunchdir_${P}: .PHONY .MAKE 1520d2a1539SBryan Drewery ${_+_}cd ${CRUNCH_SRCDIR_${P}} && \ 1535583e49bSBryan Drewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 1545583e49bSBryan Drewery DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${__target} 1555583e49bSBryan Drewery${__target}: ${__target}_crunchdir_${P} 1565583e49bSBryan Drewery.endfor 157169733f4SAdrian Chadd.endfor 158169733f4SAdrian Chadd.endfor 159169733f4SAdrian Chadd 160169733f4SAdrian Chaddclean: 161169733f4SAdrian Chadd rm -f ${CLEANFILES} 162d4f564c5SBryan Drewery ${_+_}if [ -e ${.OBJDIR}/${OUTMK} ]; then \ 163d4f564c5SBryan Drewery ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} \ 164d4f564c5SBryan Drewery -f ${OUTMK} clean; \ 165169733f4SAdrian Chadd fi 166