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