1 #################################################################
3 # Generate crunched binaries using crunchgen(1).
7 # A number of Make variables are used to generate the crunchgen config file.
9 # CRUNCH_SRCDIRS: lists directories to search for included programs
10 # CRUNCH_PROGS: lists programs to be included
11 # CRUNCH_LIBS: libraries to statically link with
12 # CRUNCH_SHLIBS: libraries to dynamically link with
13 # CRUNCH_BUILDOPTS: generic build options to be added to every program
14 # CRUNCH_BUILDTOOLS: lists programs that need build tools built in the
17 # Special options can be specified for individual programs
18 # CRUNCH_SRCDIR_${P}: base source directory for program ${P}
19 # CRUNCH_BUILDOPTS_${P}: additional build options for ${P}
20 # CRUNCH_ALIAS_${P}: additional names to be used for ${P}
22 # By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P}
23 # will be used to generate a hard link to the resulting binary.
24 # Specific links can be suppressed by setting
25 # CRUNCH_SUPPRESS_LINK_${NAME} to 1.
27 # If CRUNCH_GENERATE_LINKS is set to no, no links will be generated.
30 # $FreeBSD: head/share/mk/bsd.crunchgen.mk 305257 2016-09-01 23:52:20Z bdrewery $
32 ##################################################################
33 # The following is pretty nearly a generic crunchgen-handling makefile
39 OUTPUTS
=${OUTMK} ${OUTC} ${PROG}.cache
40 CRUNCHOBJS
= ${.OBJDIR
}
41 CRUNCH_GENERATE_LINKS?
= yes
43 CLEANFILES
+= ${CONF} *.o
*.lo
*.c
*.mk
*.cache
*.a
*.h
45 # Set a default SRCDIR for each for simpler handling below.
46 .for D in
${CRUNCH_SRCDIRS}
47 .for P in
${CRUNCH_PROGS_
${D}}
48 CRUNCH_SRCDIR_
${P}?
= ${.CURDIR
}/..
/..
/..
/${D}/${P}
52 # Program names and their aliases contribute hardlinks to 'rescue' executable,
53 # except for those that get suppressed.
54 .for D in
${CRUNCH_SRCDIRS}
55 .for P in
${CRUNCH_PROGS_
${D}}
56 ${OUTPUTS}: ${CRUNCH_SRCDIR_
${P}}/Makefile
57 .if
${CRUNCH_GENERATE_LINKS} == "yes"
58 .
ifndef CRUNCH_SUPPRESS_LINK_
${P}
59 LINKS
+= ${BINDIR}/${PROG} ${BINDIR}/${P}
61 .for A in
${CRUNCH_ALIAS_
${P}}
62 .
ifndef CRUNCH_SUPPRESS_LINK_
${A}
63 LINKS
+= ${BINDIR}/${PROG} ${BINDIR}/${A}
70 .if
!defined
(_SKIP_BUILD
)
76 echo \
# Auto-generated, do not edit >${.TARGET}
77 .
ifdef CRUNCH_BUILDOPTS
78 echo buildopts
${CRUNCH_BUILDOPTS} >>${.TARGET
}
81 echo libs
${CRUNCH_LIBS} >>${.TARGET
}
84 echo libs_so
${CRUNCH_SHLIBS} >>${.TARGET
}
86 .for D in
${CRUNCH_SRCDIRS}
87 .for P in
${CRUNCH_PROGS_
${D}}
88 echo progs
${P} >>${.TARGET
}
89 echo special
${P} srcdir ${CRUNCH_SRCDIR_
${P}} >>${.TARGET
}
90 .
ifdef CRUNCH_BUILDOPTS_
${P}
91 echo special
${P} buildopts DIRPRFX
=${DIRPRFX}${P}/ \
92 ${CRUNCH_BUILDOPTS_
${P}} >>${.TARGET
}
94 echo special
${P} buildopts DIRPRFX
=${DIRPRFX}${P}/ >>${.TARGET
}
96 .
ifdef CRUNCH_KEEP_
${P}
97 echo special
${P} keep
${CRUNCH_KEEP_
${P}} >>${.TARGET
}
99 .for A in
${CRUNCH_ALIAS_
${P}}
100 echo ln
${P} ${A} >>${.TARGET
}
105 CRUNCHGEN?
= crunchgen
107 .ORDER
: ${OUTPUTS} objs
108 ${OUTPUTS
:[1]}: .META
109 ${OUTPUTS
:[2..
-1]}: .NOMETA
111 MAKE
=${MAKE} ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} \
112 ${CRUNCHGEN} -fq
-m
${OUTMK} -c
${OUTC} ${CONF}
113 # Avoid redundantly calling 'make objs' which we've done by our
115 sed
-i
'' -e
"s/^\(${PROG}:.*\) \$$(SUBMAKE_TARGETS)/\1/" ${OUTMK}
117 # These 2 targets cannot use .MAKE since they depend on the generated
119 ${PROG}: ${OUTPUTS} objs .NOMETA .PHONY
120 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} \
121 ${MAKE} .MAKE.MODE
="${.MAKE.MODE} curdirOk=yes" \
122 .MAKE.META.IGNORE_PATHS
="${.MAKE.META.IGNORE_PATHS}" \
126 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} \
127 ${MAKE} -f
${OUTMK} objs
129 # <sigh> Someone should replace the bin/csh build-tools with
130 # shell scripts so we can remove this nonsense.
131 .for _tool in
${CRUNCH_BUILDTOOLS}
132 build-tools-
${_tool}:
133 ${_
+_
}cd
${.CURDIR
}/..
/..
/..
/${_tool}; \
134 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} ${MAKE} obj
; \
135 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} ${MAKE} build-tools
136 build-tools
: build-tools-
${_tool}
139 # Use a separate build tree to hold files compiled for this crunchgen binary
140 # Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't
141 # get that to cooperate with bsd.prog.mk. Besides, many of the standard
142 # targets should NOT be propagated into the components.
143 .for __target in
clean cleandepend cleandir obj objlink
144 .for D in
${CRUNCH_SRCDIRS}
145 .for P in
${CRUNCH_PROGS_
${D}}
146 ${__target}_crunchdir_
${P}: .PHONY .MAKE
147 ${_
+_
}cd
${CRUNCH_SRCDIR_
${P}} && \
148 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CANONICALOBJDIR} ${MAKE} \
149 DIRPRFX
=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${__target}
150 ${__target}: ${__target}_crunchdir_
${P}
157 ${_
+_
}if
[ -e
${.OBJDIR
}/${OUTMK} ]; then \
158 ${CRUNCHENV} MAKEOBJDIRPREFIX
=${CRUNCHOBJS} \
159 ${MAKE} -f
${OUTMK} clean; \