1215226Sadrian################################################################# 2215226Sadrian# 3291786Sbdrewery# Generate crunched binaries using crunchgen(1). 4291786Sbdrewery# 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 18215226Sadrian# CRUNCH_SRCDIR_$(P): base source directory for program $(P) 19215226Sadrian# CRUNCH_BUILDOPTS_$(P): additional build options for $(P) 20215226Sadrian# 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 25215226Sadrian# 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$ 31215226Sadrian 32215226Sadrian################################################################## 33215226Sadrian# The following is pretty nearly a generic crunchgen-handling makefile 34215226Sadrian# 35215226Sadrian 36215226SadrianCONF= $(PROG).conf 37215226SadrianOUTMK= $(PROG).mk 38215226SadrianOUTC= $(PROG).c 39215226SadrianOUTPUTS=$(OUTMK) $(OUTC) $(PROG).cache 40215226SadrianCRUNCHOBJS= ${.OBJDIR} 41215226Sadrian.if defined(MAKEOBJDIRPREFIX) 42215226SadrianCANONICALOBJDIR:= ${MAKEOBJDIRPREFIX}${.CURDIR} 43241298Smarcel.elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != "" 44241298SmarcelCANONICALOBJDIR:=${MAKEOBJDIR} 45215226Sadrian.else 46215226SadrianCANONICALOBJDIR:= /usr/obj${.CURDIR} 47215226Sadrian.endif 48229658SadrianCRUNCH_GENERATE_LINKS?= yes 49215226Sadrian 50215226SadrianCLEANFILES+= $(CONF) *.o *.lo *.c *.mk *.cache *.a *.h 51215226Sadrian 52251512Semaste# Don't try to extract debug info from ${PROG}. 53270291SemasteMK_DEBUG_FILES=no 54251512Semaste 55215226Sadrian# Program names and their aliases contribute hardlinks to 'rescue' executable, 56215226Sadrian# except for those that get suppressed. 57215226Sadrian.for D in $(CRUNCH_SRCDIRS) 58215226Sadrian.for P in $(CRUNCH_PROGS_$(D)) 59215226Sadrian.ifdef CRUNCH_SRCDIR_${P} 60215226Sadrian$(OUTPUTS): $(CRUNCH_SRCDIR_${P})/Makefile 61215226Sadrian.else 62215226Sadrian$(OUTPUTS): $(.CURDIR)/../../$(D)/$(P)/Makefile 63215226Sadrian.endif 64229658Sadrian.if ${CRUNCH_GENERATE_LINKS} == "yes" 65215413Sadrian.ifndef CRUNCH_SUPPRESS_LINK_${P} 66215413SadrianLINKS+= $(BINDIR)/$(PROG) $(BINDIR)/$(P) 67215413Sadrian.endif 68215413Sadrian.for A in $(CRUNCH_ALIAS_$(P)) 69215413Sadrian.ifndef CRUNCH_SUPPRESS_LINK_${A} 70215413SadrianLINKS+= $(BINDIR)/$(PROG) $(BINDIR)/$(A) 71215413Sadrian.endif 72215226Sadrian.endfor 73229658Sadrian.endif 74215226Sadrian.endfor 75215413Sadrian.endfor 76215226Sadrian 77215226Sadrianall: $(PROG) 78215226Sadrianexe: $(PROG) 79215226Sadrian 80215226Sadrian$(CONF): Makefile 81215226Sadrian echo \# Auto-generated, do not edit >$(.TARGET) 82215226Sadrian.ifdef CRUNCH_BUILDOPTS 83215226Sadrian echo buildopts $(CRUNCH_BUILDOPTS) >>$(.TARGET) 84215226Sadrian.endif 85215226Sadrian.ifdef CRUNCH_LIBS 86215226Sadrian echo libs $(CRUNCH_LIBS) >>$(.TARGET) 87215226Sadrian.endif 88215226Sadrian.ifdef CRUNCH_SHLIBS 89215226Sadrian echo libs_so $(CRUNCH_SHLIBS) >>$(.TARGET) 90215226Sadrian.endif 91215226Sadrian.for D in $(CRUNCH_SRCDIRS) 92215226Sadrian.for P in $(CRUNCH_PROGS_$(D)) 93215226Sadrian echo progs $(P) >>$(.TARGET) 94215226Sadrian.ifdef CRUNCH_SRCDIR_${P} 95215226Sadrian echo special $(P) srcdir $(CRUNCH_SRCDIR_${P}) >>$(.TARGET) 96215226Sadrian.else 97215226Sadrian echo special $(P) srcdir $(.CURDIR)/../../$(D)/$(P) >>$(.TARGET) 98215226Sadrian.endif 99215226Sadrian.ifdef CRUNCH_BUILDOPTS_${P} 100215226Sadrian echo special $(P) buildopts DIRPRFX=${DIRPRFX}${P}/ \ 101215226Sadrian $(CRUNCH_BUILDOPTS_${P}) >>$(.TARGET) 102215226Sadrian.else 103215226Sadrian echo special $(P) buildopts DIRPRFX=${DIRPRFX}${P}/ >>$(.TARGET) 104215226Sadrian.endif 105215226Sadrian.for A in $(CRUNCH_ALIAS_$(P)) 106215226Sadrian echo ln $(P) $(A) >>$(.TARGET) 107215226Sadrian.endfor 108215226Sadrian.endfor 109215226Sadrian.endfor 110215226Sadrian 111215226Sadrian# XXX Make sure we don't pass -P to crunchgen(1). 112215226Sadrian.MAKEFLAGS:= ${.MAKEFLAGS:N-P} 113215226Sadrian.ORDER: $(OUTPUTS) objs 114215226Sadrian$(OUTPUTS): $(CONF) 115237574Sobrien MAKE=${MAKE} MAKEOBJDIRPREFIX=${CRUNCHOBJS} crunchgen -fq -m $(OUTMK) \ 116215226Sadrian -c $(OUTC) $(CONF) 117215226Sadrian 118215226Sadrian$(PROG): $(OUTPUTS) objs 119215226Sadrian MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) exe 120215226Sadrian 121215226Sadrianobjs: $(OUTMK) 122215226Sadrian MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) objs 123215226Sadrian 124215226Sadrian# <sigh> Someone should replace the bin/csh and bin/sh build-tools with 125215226Sadrian# shell scripts so we can remove this nonsense. 126215226Sadrianbuild-tools: 127215226Sadrian.for _tool in $(CRUNCH_BUILDTOOLS) 128215226Sadrian cd $(.CURDIR)/../../${_tool}; \ 129215226Sadrian MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \ 130215226Sadrian MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools 131215226Sadrian.endfor 132215226Sadrian 133215226Sadrian# Use a separate build tree to hold files compiled for this crunchgen binary 134215226Sadrian# Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't 135215226Sadrian# get that to cooperate with bsd.prog.mk. Besides, many of the standard 136215226Sadrian# targets should NOT be propagated into the components. 137215226Sadriancleandepend cleandir obj objlink: 138215226Sadrian.for D in $(CRUNCH_SRCDIRS) 139215226Sadrian.for P in $(CRUNCH_PROGS_$(D)) 140215226Sadrian.ifdef CRUNCH_SRCDIR_${P} 141215226Sadrian cd ${CRUNCH_SRCDIR_$(P)} && \ 142215226Sadrian MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 143215226Sadrian DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} 144215226Sadrian.else 145215226Sadrian cd $(.CURDIR)/../../${D}/${P} && \ 146215226Sadrian MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 147215226Sadrian DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} 148215226Sadrian.endif 149215226Sadrian.endfor 150215226Sadrian.endfor 151215226Sadrian 152215226Sadrianclean: 153215226Sadrian rm -f ${CLEANFILES} 154215226Sadrian if [ -e ${.OBJDIR}/$(OUTMK) ]; then \ 155215226Sadrian MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) clean; \ 156215226Sadrian fi 157215226Sadrian.for D in $(CRUNCH_SRCDIRS) 158215226Sadrian.for P in $(CRUNCH_PROGS_$(D)) 159215226Sadrian.ifdef CRUNCH_SRCDIR_${P} 160215226Sadrian cd ${CRUNCH_SRCDIR_$(P)} && \ 161215226Sadrian MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 162215226Sadrian DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} 163215226Sadrian.else 164215226Sadrian cd $(.CURDIR)/../../${D}/${P} && \ 165215226Sadrian MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ 166215226Sadrian DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} 167215226Sadrian.endif 168215226Sadrian.endfor 169215226Sadrian.endfor 170