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