bash: set cache-file to /dev/null, breaks cross-compiling otherwise
[openadk.git] / mk / package.mk
blob3d7353a519008224e98bd14c934870eff20a7fd6
1 # This file is part of the OpenADK project. OpenADK is copyrighted
2 # material, please see the LICENCE file in the top-level directory.
4 all: build-all-pkgs
6 TCFLAGS:= ${TARGET_CFLAGS}
7 TCXXFLAGS:= ${TARGET_CFLAGS}
8 TCPPFLAGS:= ${TARGET_CPPFLAGS}
9 TLDFLAGS:= ${TARGET_LDFLAGS} -Wl,-rpath -Wl,/usr/lib \
10 -Wl,-rpath-link -Wl,${STAGING_TARGET_DIR}/usr/lib \
11 -L${STAGING_TARGET_DIR}/lib -L${STAGING_TARGET_DIR}/usr/lib
12 ifeq ($(ADK_STATIC),y)
13 TCFLAGS:= ${TARGET_CFLAGS} -static
14 TCXXFLAGS:= ${TARGET_CFLAGS} -static
15 TCPPFLAGS:= ${TARGET_CPPFLAGS} -static
16 TLDFLAGS:= ${TARGET_LDFLAGS} -Wl,-rpath -Wl,/usr/lib \
17 -Wl,-rpath-link -Wl,${STAGING_TARGET_DIR}/usr/lib \
18 -L${STAGING_TARGET_DIR}/lib -L${STAGING_TARGET_DIR}/usr/lib \
19 -static
20 endif
21 ifeq ($(ADK_NATIVE),y)
22 TCFLAGS:= $(TARGET_CFLAGS_ARCH) $(TARGET_DEBUGGING) -fwrapv
23 TCXXFLAGS:=
24 TCPPFLAGS:=
25 TLDFLAGS:=
26 endif
28 ifeq ($(ADK_DEBUG),)
29 TCPPFLAGS+= -DNDEBUG
30 endif
32 # does not change CONFIGURE_ARGS in minimal mode
33 ifeq ($(filter minimal,${CONFIG_STYLE}),)
34 ifneq ($(ADK_DEBUG),)
35 CONFIGURE_ARGS+= --enable-debug
36 endif
37 endif
39 CONFIGURE_ENV+= CONFIG_SHELL='$(strip ${SHELL})' \
40 CFLAGS='$(strip ${TCFLAGS})' \
41 CXXFLAGS='$(strip ${TCXXFLAGS})' \
42 CPPFLAGS='$(strip ${TCPPFLAGS})' \
43 LDFLAGS='$(strip ${TLDFLAGS})' \
44 PKG_CONFIG_LIBDIR='${STAGING_TARGET_DIR}/usr/lib/pkgconfig'
45 ifeq ($(ADK_NATIVE),)
46 CONFIGURE_ENV+= ${TARGET_CONFIGURE_OPTS} \
47 ${HOST_CONFIGURE_OPTS} \
48 ac_cv_func_realloc_0_nonnull=yes \
49 ac_cv_func_malloc_0_nonnull=yes
50 endif
52 CONFIGURE_PROG?= configure
53 MAKE_FILE?= Makefile
54 # this is environment for 'make all' and 'make install'
55 MAKE_ENV?=
56 # this is arguments for 'make all' and 'make install'
57 XAKE_FLAGS?=
58 # this is arguments for 'make all' ONLY
59 MAKE_FLAGS?=
60 # this is arguments for 'make install' ONLY
61 FAKE_FLAGS?=
62 ALL_TARGET?= all
63 INSTALL_TARGET?= install
65 MAKE_ENV+= WRKDIR='${WRKDIR}' WRKDIST='${WRKDIST}' \
66 WRKSRC='${WRKSRC}' WRKBUILD='${WRKBUILD}' \
67 CFLAGS='$(strip ${TCFLAGS})' \
68 CXXFLAGS='$(strip ${TCXXFLAGS})' \
69 CPPFLAGS='$(strip ${TCPPFLAGS})' \
70 LDFLAGS='$(strip ${TLDFLAGS})'
71 MAKE_ENV+= PKG_CONFIG_LIBDIR='${STAGING_TARGET_DIR}/usr/lib/pkgconfig'
72 ifeq ($(ADK_NATIVE),)
73 MAKE_ENV+= PATH='${TARGET_PATH}' \
74 ${HOST_CONFIGURE_OPTS} \
75 CC='${TARGET_CC}' \
76 CXX='${TARGET_CXX}' \
77 AR='${TARGET_CROSS}ar' \
78 RANLIB='${TARGET_CROSS}ranlib' \
79 NM='${TARGET_CROSS}nm' \
80 STRIP='${TARGET_CROSS}strip' \
81 CROSS="$(TARGET_CROSS)"
82 endif
84 MAKE_FLAGS+= ${XAKE_FLAGS} V=1
85 FAKE_FLAGS+= ${XAKE_FLAGS}
87 ifeq ($(strip ${WRKDIR_BSD}),)
88 WRKDIR_BASE:= ${BUILD_DIR}
89 else
90 WRKDIR_BASE:= $(shell pwd)
91 endif
93 _EXTRACT_COOKIE= ${WRKDIST}/.extract_done
94 _PATCH_COOKIE= ${WRKDIST}/.prepared
95 _CONFIGURE_COOKIE= ${WRKBUILD}/.configure_done
96 _BUILD_COOKIE= ${WRKBUILD}/.build_done
97 _FAKE_COOKIE= ${WRKINST}/.fake_done
98 _IPKGS_COOKIE= ${PACKAGE_DIR}/.stamps/${PKG_NAME}\x01${PKG_VERSION}-${PKG_RELEASE}
100 _IN_PACKAGE:= 1
101 include ${TOPDIR}/mk/buildhlp.mk
103 # defined in buildhlp.mk ('extract' can fail, use 'patch' then)
104 extract: ${_EXTRACT_COOKIE}
105 patch: ${_PATCH_COOKIE}
107 # defined below (will be moved to pkg-bottom.mk!)
108 configure: ${_CONFIGURE_COOKIE}
109 build: ${_BUILD_COOKIE}
110 fake: ${_FAKE_COOKIE}
111 rebuild:
112 @if [ -f ${TOPDIR}/.rebuild.${PKG_NAME} ];then \
113 $(MAKE) clean; \
114 rm -f ${TOPDIR}/.rebuild.${PKG_NAME}; \
117 # our recursive build entry point
118 build-all-pkgs: ${_IPKGS_COOKIE}
120 # there are some parameters to the PKG_template function
121 # 1.) Config.in identifier ADK_PACKAGE_$(1)
122 # 2.) name of the package, for single package mostly $(PKG_NAME)
123 # 3.) package version (upstream version) and package release (adk version),
124 # always $(PKG_VERSION)-$(PKG_RELEASE)
125 # 4.) dependencies to other packages, $(PKG_DEPENDS)
126 # 5.) description for the package, $(PKG_DESCR)
127 # 6.) section of the package, $(PKG_SECTION)
128 # 7.) special package options
129 # noscripts -> do not install scripts to $(STAGING_TARGET_DIR)/target/scripts
130 # (needed for example for autoconf/automake)
131 # noremove -> do not remove files from $(STAGING_TARGET_DIR)/target while
132 # cleaning (needed for toolchain packages like glibc/eglibc)
133 # should be package format independent and modular in the future
134 define PKG_template
135 ALL_PKGOPTS+= $(1)
136 PKGNAME_$(1)= $(2)
137 PKGDEPS_$(1)= $(4)
138 PKGDESC_$(1)= $(5)
139 PKGSECT_$(1)= $(6)
140 IPKG_$(1)= $(PACKAGE_DIR)/$(2)_$(3)_${CPU_ARCH}.${PKG_SUFFIX}
141 IDIR_$(1)= $(WRKDIR)/fake-${CPU_ARCH}/pkg-$(2)
142 ifneq (${ADK_PACKAGE_$(1)}${DEVELOPER},)
143 ALL_IPKGS+= $$(IPKG_$(1))
144 ALL_IDIRS+= $${IDIR_$(1)}
145 endif
146 INFO_$(1)= $(PKG_STATE_DIR)/info/$(2).list
148 ifeq ($(ADK_PACKAGE_$(1)),y)
149 install-targets: $$(INFO_$(1))
150 endif
152 IDEPEND_$(1):= $$(strip $(4))
154 _ALL_CONTROLS+= $$(IDIR_$(1))/CONTROL/control
155 ICONTROL_$(1)?= $(WRKDIR)/.$(2).control
156 $$(IDIR_$(1))/CONTROL/control: ${_PATCH_COOKIE}
157 @echo "Package: $$(shell echo $(2) | tr '_' '-')" > $(WRKDIR)/.$(2).control
158 @echo "Section: $(6)" >> $(WRKDIR)/.$(2).control
159 @echo "Description: $(5)" >> $(WRKDIR)/.$(2).control
160 ${BASH} ${SCRIPT_DIR}/make-ipkg-dir.sh $${IDIR_$(1)} $${ICONTROL_$(1)} $(3) ${CPU_ARCH}
161 @adeps='$$(strip $${IDEPEND_$(1)})'; if [[ -n $$$$adeps ]]; then \
162 comma=; \
163 deps=; \
164 last=; \
165 for dep in $$$$adeps; do \
166 if [[ $$$$last = kernel && $$$$dep = \(* ]]; then \
167 deps="$$$$deps $$$$dep"; \
168 else \
169 deps="$$$$deps$$$$comma$$$$dep"; \
170 fi; \
171 comma=", "; \
172 last=$$$$dep; \
173 done; \
174 echo "Depends: $$$$deps" | tr '_' '-' >>$${IDIR_$(1)}/CONTROL/control; \
176 @for file in conffiles preinst postinst prerm postrm; do \
177 [ ! -f ./files/$(2).$$$$file ] || cp ./files/$(2).$$$$file $$(IDIR_$(1))/CONTROL/$$$$file; \
178 done
180 $$(IPKG_$(1)): $$(IDIR_$(1))/CONTROL/control $${_FAKE_COOKIE}
181 ifeq ($(ADK_DEBUG),)
182 $${RSTRIP} $${IDIR_$(1)} $(MAKE_TRACE)
183 endif
184 ifeq (${ADK_INSTALL_PACKAGE_INIT_SCRIPTS},y)
185 @for file in $$$$(ls ./files/*.init 2>/dev/null); do \
186 fname=$$$$(echo $$$$file| sed -e "s#.*/##" -e "s#.init##"); \
187 check=$$$$(grep PKG $$$$file|cut -d ' ' -f 2); \
188 if [ "$$$$check" == $(2) ];then \
189 mkdir -p $$(IDIR_$(1))/etc/init.d && cp $$$$file $$(IDIR_$(1))/etc/init.d/$$$$fname; \
190 fi; \
191 done
192 @cd $${IDIR_$(1)}; for script in etc/init.d/*; do \
193 [[ -e $$$$script ]] || continue; \
194 chmod 0755 "$$$$script"; \
195 done
196 endif
197 @mkdir -p $${PACKAGE_DIR} '$${STAGING_PKG_DIR}' \
198 '$${STAGING_TARGET_DIR}/scripts'
199 ifeq (,$(filter noremove,$(7)))
200 @if test -s '$${STAGING_PKG_DIR}/$(1)'; then \
201 cd '$${STAGING_TARGET_DIR}'; \
202 while read fn; do \
203 rm -f "$$$$fn"; \
204 done <'$${STAGING_PKG_DIR}/$(1)'; \
206 endif
207 @rm -f '$${STAGING_PKG_DIR}/$(1)'
208 @-cd $${IDIR_$(1)}; \
209 x=$$$$(find tmp var -mindepth 1 2>/dev/null); if [[ -n $$$$x ]]; then \
210 echo 'WARNING: $${IPKG_$(1)} installs files into a' \
211 'ramdisk location:' >&2; \
212 echo "$$$$x" | sed 's/^/- /' >&2; \
213 fi; \
214 if [ "${PKG_NAME}" != "uClibc" -a "${PKG_NAME}" != "glibc" -a "${PKG_NAME}" != "eglibc" -a "${PKG_NAME}" != "libpthread" -a "${PKG_NAME}" != "libstdcxx" -a "${PKG_NAME}" != "libgcc" -a "${PKG_NAME}" != "libthread-db" ];then \
215 find lib \( -name lib\*.so\* -o -name lib\*.a \) \
216 -exec echo 'WARNING: $${IPKG_$(1)} installs files in /lib -' \
217 ' fix this!' >&2 \; -quit 2>/dev/null; fi; \
218 find usr ! -type d 2>/dev/null | \
219 grep -v -e '^usr/share' -e '^usr/man' -e '^usr/info' -e '^usr/lib/libc.so' | \
220 tee '$${STAGING_PKG_DIR}/$(1)' | \
221 $(TOPDIR)/bin/tools/cpio -padlmu '$${STAGING_TARGET_DIR}'
222 @cd '$${STAGING_TARGET_DIR}'; grep 'usr/lib/.*\.la$$$$' \
223 '$${STAGING_PKG_DIR}/$(1)' | while read fn; do \
224 chmod u+w $$$$fn; \
225 $(SED) "s,\(^libdir='\| \|-L\|^dependency_libs='\)/usr/lib,\1$(STAGING_TARGET_DIR)/usr/lib,g" $$$$fn; \
226 done
227 ifeq (,$(filter noscripts,$(7)))
228 @cd '$${STAGING_TARGET_DIR}'; grep 'usr/s*bin/' \
229 '$${STAGING_PKG_DIR}/$(1)' | \
230 while read fn; do \
231 b="$$$$(dd if="$$$$fn" bs=2 count=1 2>/dev/null)"; \
232 [[ $$$$b = '#!' ]] || continue; \
233 cp "$$$$fn" scripts/; \
234 echo "scripts/$$$$(basename "$$$$fn")" \
235 >>'$${STAGING_PKG_DIR}/$(1)'; \
236 done
237 endif
238 ifeq (,$(filter libmix,$(7)))
239 ifeq (,$(filter libonly,$(7)))
240 $${PKG_BUILD} $${IDIR_$(1)} $${PACKAGE_DIR} $(MAKE_TRACE)
241 endif
242 endif
244 clean-targets: clean-dev-$(1)
246 clean-dev-$(1):
247 ifeq (,$(filter noremove,$(7)))
248 @if test -s '$${STAGING_PKG_DIR}/$(1)'; then \
249 cd '$${STAGING_TARGET_DIR}'; \
250 while read fn; do \
251 rm -f "$$$$fn"; \
252 done <'$${STAGING_PKG_DIR}/$(1)'; \
254 endif
255 @rm -f '$${STAGING_PKG_DIR}/$(1)'
257 $$(INFO_$(1)): $$(IPKG_$(1))
258 $(PKG_INSTALL) $$(IPKG_$(1))
259 endef
261 install-targets:
262 install:
263 @$(CMD_TRACE) "installing... "
264 @$(MAKE) install-targets $(MAKE_TRACE)
266 clean-targets:
267 clean:
268 @$(CMD_TRACE) "cleaning... "
269 @$(MAKE) clean-targets $(MAKE_TRACE)
270 rm -rf ${WRKDIR} ${ALL_IPKGS} ${PACKAGE_DIR}/.stamps/${PKG_NAME}\x01*
272 distclean: clean
273 rm -f ${FULLDISTFILES}
275 .PHONY: all refetch extract patch configure \
276 build rebuild fake package install clean build-all-pkgs