1ifeq ($(RUMPRUN_MKCONF),)
2$(error RUMPRUN_MKCONF missing)
3endif
4
5include ${RUMPRUN_MKCONF}
6ifeq (${BUILDRUMP_TOOLFLAGS},)
7$(error invalid config file ${RUMPRUN_MKCONF})
8endif
9include ${BUILDRUMP_TOOLFLAGS}
10
11TOOLOBJ:= ${RROBJ}/app-tools
12
13_CCVARIANT:=$(shell ${RUMPMAKE} -f bsd.own.mk -V '$${HAVE_LLVM:Dclang:Ugcc}')
14_CXXVARIANT:=$(shell ${RUMPMAKE} -f bsd.own.mk -V '$${HAVE_LLVM:Dclang++:Ug++}')
15MACHINE_GNU_PLATFORM:=\
16    $(shell ${RUMPMAKE} -f bsd.own.mk -V '$${MACHINE_GNU_PLATFORM}')
17
18_FILES=	toolchain.cmake recipe.s
19FILES=	$(_FILES:%=$(TOOLTUPLE)-%)
20
21SPECS_ARCH:= specs-compile_or_ferment specs-stub
22SPECS_MACH:= specs-bake
23SPECS:= ${SPECS_ARCH} ${SPECS_MACH}
24
25_BIN_G=	ar as cpp ld nm objcopy objdump ranlib readelf size strings strip
26BIN_G=	$(_BIN_G:%=$(TOOLTUPLE)-%)
27BIN_G+=	$(TOOLTUPLE)-$(_CCVARIANT)
28CCWRP=	${CC}
29ifeq (${CONFIG_CXX},yes)
30BIN_G+=	$(TOOLTUPLE)-$(_CXXVARIANT)
31CCWRP+=	${CXX}
32endif
33BIN_G+=	rumprun-bake
34BIN_G+= $(TOOLTUPLE)-cookfs
35STATICBIN= rumprun rumpstop
36
37GENS.bin=	${BIN_G:%=${TOOLOBJ}/%}
38GENS.files=	${FILES:%=${TOOLOBJ}/%}
39GENS.archspecs=	${SPECS_ARCH:%=${TOOLOBJ}/%}
40GENS.machspecs=	${SPECS_MACH:%=${TOOLOBJ}/%}
41GENS=		${GENS.bin} ${GENS.files} ${GENS.archspecs} ${GENS.machspecs}
42
43.PHONY: app-tools
44app-tools: ${GENS}
45
46include ../global.mk
47LDFLAGS_BAKE:= ${LDFLAGS.${MACHINE_GNU_ARCH}.${PLATFORM}}
48
49BRSOURCEDIR:=$(dir ${AR})
50BRLIBEXECINST:= ${INSTALLDIR}/libexec/rumprun-${MACHINE_GNU_ARCH}-${PLATFORM}/
51BRLIBEXECDEST:= ${RRDEST}/libexec/rumprun-${MACHINE_GNU_ARCH}-${PLATFORM}/
52
53INSTALLDIR_ARCH:= ${INSTALLDIR}/rumprun-${MACHINE_GNU_ARCH}
54
55ARCHDIR:= rumprun-${MACHINE_GNU_ARCH}
56MACHDIR:= rumprun-${MACHINE_GNU_ARCH}-${PLATFORM}
57
58LIBEXEC_CC:= $(subst ${BRSOURCEDIR},${BRLIBEXECDEST},${CC})
59LIBEXEC_CXX:= $(subst ${BRSOURCEDIR},${BRLIBEXECDEST},${CXX})
60LIBEXEC_OBJCOPY:= ${BRLIBEXECDEST}/${MACHINE_GNU_PLATFORM}-objcopy
61LIBEXEC_SIZE:= ${BRLIBEXECDEST}/${MACHINE_GNU_PLATFORM}-size
62LIBEXEC_READELF:= ${BRLIBEXECDEST}/${MACHINE_GNU_PLATFORM}-readelf
63
64TOOLS_CC := ${RRDEST}/bin/$(TOOLTUPLE)-${_CCVARIANT}
65TOOLS_CXX := ${RRDEST}/bin/$(TOOLTUPLE)-${_CXXVARIANT}
66
67${TOOLOBJ}:
68	mkdir -p "$@"
69
70define templ
71${TOOLOBJ}/${2}: ${1} Makefile ${TOOLOBJ}
72	sed <$$< > $$@							\
73		-e 's#!LIBEXEC_CC!#$(LIBEXEC_CC)#g;'			\
74		-e 's#!LIBEXEC_CXX!#$(LIBEXEC_CXX)#g;'			\
75		-e 's#!LIBEXEC_OBJCOPY!#$(LIBEXEC_OBJCOPY)#g;'		\
76		-e 's#!LIBEXEC_READELF!#$(LIBEXEC_READELF)#g;'		\
77		-e 's#!LIBEXEC_SIZE!#$(LIBEXEC_SIZE)#g;'		\
78		-e 's#!TOOLS_CC!#$(TOOLS_CC)#g;'			\
79		-e 's#!TOOLS_CXX!#$(TOOLS_CXX)#g;'			\
80		-e 's#!MACHINE_GNU_ARCH!#$(MACHINE_GNU_ARCH)#g;'	\
81		-e 's#!TOOLTUPLE!#$(TOOLTUPLE)#g;'			\
82		-e 's#!DESTDIR!#$(RRDEST)#g;'				\
83		-e 's#!PLATFORM!#$(PLATFORM)#g;'			\
84		-e 's#!CPPFLAGS!#$(BUILDRUMP_TOOL_CPPFLAGS)#g;'		\
85		-e 's#!CFLAGS!#$(BUILDRUMP_TOOL_CFLAGS)#g;'		\
86		-e 's#!EXTRACCFLAGS!#$(EXTRACCFLAGS)#g;'		\
87		-e 's#!CXXFLAGS!#$(BUILDRUMP_TOOL_CXXFLAGS)#g;'		\
88		-e 's#!LDFLAGS_BAKE!#$(LDFLAGS_BAKE)#g;'
89	chmod 755 $$@
90endef
91$(foreach file,${_FILES},$(eval $(call templ,${file}.in,${TOOLTUPLE}-${file})))
92$(foreach spec,${SPECS},$(eval $(call templ,${spec}.in,${spec})))
93$(eval $(call templ,cc.in,$(TOOLTUPLE)-${_CCVARIANT}))
94$(eval $(call templ,cc.in,$(TOOLTUPLE)-${_CXXVARIANT}))
95$(eval $(call templ,specs-bake.in,specs-bake-$(TOOLTUPLE)-$(PLATFORM)))
96$(eval $(call templ,rumprun-bake.in,rumprun-bake))
97$(eval $(call templ,cookfs.in,$(TOOLTUPLE)-cookfs))
98
99define binwrapper
100uptool_$1=$(shell echo $1 | tr '[:lower:]' '[:upper:]')
101toolval_$1=$${$${uptool_$1}}
102${TOOLOBJ}/$(TOOLTUPLE)-$1: ${TOOLOBJ}
103	printf '#!/bin/sh\n\nexec %s "$$$${@}"\n' \
104	    $$(subst ${BRSOURCEDIR},${BRLIBEXECDEST},$${toolval_${1}}) > $$@
105	chmod 755 $$@
106
107BRTOOLS+= $${toolval_${1}}
108endef
109$(foreach t,${_BIN_G},$(eval $(call binwrapper,${t})))
110
111${BRLIBEXECINST}:
112	mkdir -p $@
113
114${INSTALLDIR}/etc:
115	mkdir -p $@
116
117${INSTALLDIR_ARCH}/share:
118	mkdir -p $@
119
120install-buildrumpwrappers: ${BRLIBEXECINST} ${BRTOOLS}
121	install -m 0755 ${BRTOOLS} ${CCWRP} ${BRLIBEXECINST}
122	install -m 0755 ${BRSOURCEDIR}/brprintmetainfo ${BRLIBEXECINST}
123
124install-bins: ${GENS.bin} ${STATICBIN}
125	install -m 0755 ${GENS.bin} ${INSTALLDIR}/bin
126	install -m 0755 ${STATICBIN} ${INSTALLDIR}/bin
127	ln -f ${INSTALLDIR}/bin/rumprun-bake ${INSTALLDIR}/bin/rumpbake
128
129install-files: ${GENS.files} ${GENS.archspecs} ${GENS.machspecs} \
130    ${INSTALLDIR}/etc ${INSTALLDIR_ARCH}/share
131	install -m 0644 ${GENS.files} ${INSTALLDIR_ARCH}/share
132	install -m 0644 ${GENS.archspecs} ${INSTALLDIR_ARCH}/lib
133	install -m 0644 ${GENS.machspecs} ${INSTALLDIR_ARCH}/lib/rumprun-${PLATFORM}
134	install -m 0644 rumprun-bake.conf ${INSTALLDIR}/etc
135
136install: install-buildrumpwrappers install-bins install-files
137
138clean:
139	rm -f ${GENS}
140