xref: /OK3568_Linux_fs/buildroot/package/pkg-autotools.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1################################################################################
2# Autotools package infrastructure
3#
4# This file implements an infrastructure that eases development of
5# package .mk files for autotools packages. It should be used for all
6# packages that use the autotools as their build system.
7#
8# See the Buildroot documentation for details on the usage of this
9# infrastructure
10#
11# In terms of implementation, this autotools infrastructure requires
12# the .mk file to only specify metadata information about the
13# package: name, version, download URL, etc.
14#
15# We still allow the package .mk file to override what the different
16# steps are doing, if needed. For example, if <PKG>_BUILD_CMDS is
17# already defined, it is used as the list of commands to perform to
18# build the package, instead of the default autotools behaviour. The
19# package can also define some post operation hooks.
20#
21################################################################################
22
23
24#
25# Utility function to upgrade config.sub and config.guess files
26#
27# argument 1 : directory into which config.guess and config.sub need
28# to be updated. Note that config.sub and config.guess are searched
29# recursively in this directory.
30#
31define CONFIG_UPDATE
32	for file in config.guess config.sub; do \
33		for i in $$(find $(1) -name $$file); do \
34			cp support/gnuconfig/$$file $$i; \
35		done; \
36	done
37endef
38
39# This function generates the ac_cv_file_<foo> value for a given
40# filename. This is needed to convince configure script doing
41# AC_CHECK_FILE() tests that the file actually exists, since such
42# tests cannot be done in a cross-compilation context. This function
43# takes as argument the path of the file. An example usage is:
44#
45#  FOOBAR_CONF_ENV = \
46#	$(call AUTOCONF_AC_CHECK_FILE_VAL,/dev/random)=yes
47AUTOCONF_AC_CHECK_FILE_VAL = ac_cv_file_$(subst -,_,$(subst /,_,$(subst .,_,$(1))))
48
49#
50# Hook to update config.sub and config.guess if needed
51#
52define UPDATE_CONFIG_HOOK
53	@$(call MESSAGE,"Updating config.sub and config.guess")
54	$(call CONFIG_UPDATE,$(@D))
55endef
56
57#
58# Hook to patch libtool to make it work properly for cross-compilation
59#
60define LIBTOOL_PATCH_HOOK
61	@$(call MESSAGE,"Patching libtool")
62	$(Q)for i in `find $($(PKG)_DIR) -name ltmain.sh`; do \
63		ltmain_version=`sed -n '/^[ \t]*VERSION=/{s/^[ \t]*VERSION=//;p;q;}' $$i | \
64		sed -e 's/\([0-9]*\.[0-9]*\).*/\1/' -e 's/\"//'`; \
65		ltmain_patchlevel=`sed -n '/^[ \t]*VERSION=/{s/^[ \t]*VERSION=//;p;q;}' $$i | \
66		sed -e 's/\([0-9]*\.[0-9]*\.*\)\([0-9]*\).*/\2/' -e 's/\"//'`; \
67		if test $${ltmain_version} = '1.5'; then \
68			patch -i support/libtool/buildroot-libtool-v1.5.patch $${i}; \
69		elif test $${ltmain_version} = "2.2"; then\
70			patch -i support/libtool/buildroot-libtool-v2.2.patch $${i}; \
71		elif test $${ltmain_version} = "2.4"; then\
72			if test $${ltmain_patchlevel:-0} -gt 2; then\
73				patch -i support/libtool/buildroot-libtool-v2.4.4.patch $${i}; \
74			else \
75				patch -i support/libtool/buildroot-libtool-v2.4.patch $${i}; \
76			fi \
77		fi \
78	done
79endef
80
81#
82# Hook to patch common issue with configure on powerpc64{,le} failing
83# to detect shared library support:
84#
85define CONFIGURE_FIX_POWERPC64_HOOK
86	@$(call MESSAGE,"Checking configure (powerpc64/powerpc64le)")
87	support/scripts/fix-configure-powerpc64.sh $($(PKG)_DIR)
88endef
89
90#
91# Hook to gettextize the package if needed
92#
93define GETTEXTIZE_HOOK
94	@$(call MESSAGE,"Gettextizing")
95	$(Q)cd $($(PKG)_SRCDIR) && $(GETTEXTIZE) $($(PKG)_GETTEXTIZE_OPTS)
96endef
97
98#
99# Hook to autoreconf the package if needed
100#
101define AUTORECONF_HOOK
102	@$(call MESSAGE,"Autoreconfiguring")
103	$(Q)cd $($(PKG)_SRCDIR) && $($(PKG)_AUTORECONF_ENV) $(AUTORECONF) $($(PKG)_AUTORECONF_OPTS)
104endef
105
106################################################################################
107# inner-autotools-package -- defines how the configuration, compilation and
108# installation of an autotools package should be done, implements a
109# few hooks to tune the build process for autotools specifities and
110# calls the generic package infrastructure to generate the necessary
111# make targets
112#
113#  argument 1 is the lowercase package name
114#  argument 2 is the uppercase package name, including a HOST_ prefix
115#             for host packages
116#  argument 3 is the uppercase package name, without the HOST_ prefix
117#             for host packages
118#  argument 4 is the type (target or host)
119################################################################################
120
121define inner-autotools-package
122
123ifndef $(2)_LIBTOOL_PATCH
124 ifdef $(3)_LIBTOOL_PATCH
125  $(2)_LIBTOOL_PATCH = $$($(3)_LIBTOOL_PATCH)
126 else
127  $(2)_LIBTOOL_PATCH ?= YES
128 endif
129endif
130
131ifndef $(2)_MAKE
132 ifdef $(3)_MAKE
133  $(2)_MAKE = $$($(3)_MAKE)
134 else
135  $(2)_MAKE ?= $$(MAKE)
136 endif
137endif
138
139ifndef $(2)_AUTORECONF
140 ifdef $(3)_AUTORECONF
141  $(2)_AUTORECONF = $$($(3)_AUTORECONF)
142 else
143  $(2)_AUTORECONF ?= NO
144 endif
145endif
146
147ifndef $(2)_GETTEXTIZE
148 ifdef $(3)_GETTEXTIZE
149  $(2)_GETTEXTIZE = $$($(3)_GETTEXTIZE)
150 else
151  $(2)_GETTEXTIZE ?= NO
152 endif
153endif
154
155ifeq ($(4),host)
156 $(2)_GETTEXTIZE_OPTS ?= $$($(3)_GETTEXTIZE_OPTS)
157endif
158
159ifeq ($(4),host)
160 $(2)_AUTORECONF_OPTS ?= $$($(3)_AUTORECONF_OPTS)
161endif
162
163$(2)_CONF_ENV			?=
164$(2)_CONF_OPTS			?=
165$(2)_MAKE_ENV			?=
166$(2)_MAKE_OPTS			?=
167$(2)_INSTALL_OPTS                ?= install
168$(2)_INSTALL_STAGING_OPTS	?= DESTDIR=$$(STAGING_DIR) install
169$(2)_INSTALL_TARGET_OPTS		?= DESTDIR=$$(TARGET_DIR) install
170
171#
172# Configure step. Only define it if not already defined by the package
173# .mk file. And take care of the differences between host and target
174# packages.
175#
176ifndef $(2)_CONFIGURE_CMDS
177ifeq ($(4),target)
178
179# Configure package for target
180define $(2)_CONFIGURE_CMDS
181	(cd $$($$(PKG)_SRCDIR) && rm -rf config.cache && \
182	$$(TARGET_CONFIGURE_OPTS) \
183	$$(TARGET_CONFIGURE_ARGS) \
184	$$($$(PKG)_CONF_ENV) \
185	CONFIG_SITE=/dev/null \
186	./configure \
187		--target=$$(GNU_TARGET_NAME) \
188		--host=$$(GNU_TARGET_NAME) \
189		--build=$$(GNU_HOST_NAME) \
190		--prefix=/usr \
191		--exec-prefix=/usr \
192		--sysconfdir=/etc \
193		--localstatedir=/var \
194		--program-prefix="" \
195		--disable-gtk-doc \
196		--disable-gtk-doc-html \
197		--disable-doc \
198		--disable-docs \
199		--disable-documentation \
200		--with-xmlto=no \
201		--with-fop=no \
202		$$(if $$($$(PKG)_OVERRIDE_SRCDIR),,--disable-dependency-tracking) \
203		--enable-ipv6 \
204		$$(NLS_OPTS) \
205		$$(SHARED_STATIC_LIBS_OPTS) \
206		$$(QUIET) $$($$(PKG)_CONF_OPTS) \
207	)
208endef
209else
210
211# Configure package for host
212# disable all kind of documentation generation in the process,
213# because it often relies on host tools which may or may not be
214# installed.
215define $(2)_CONFIGURE_CMDS
216	(cd $$($$(PKG)_SRCDIR) && rm -rf config.cache; \
217	$$(HOST_CONFIGURE_OPTS) \
218	CFLAGS="$$(HOST_CFLAGS)" \
219	LDFLAGS="$$(HOST_LDFLAGS)" \
220	$$($$(PKG)_CONF_ENV) \
221	CONFIG_SITE=/dev/null \
222	./configure \
223		--prefix="$$(HOST_DIR)" \
224		--sysconfdir="$$(HOST_DIR)/etc" \
225		--localstatedir="$$(HOST_DIR)/var" \
226		--enable-shared --disable-static \
227		--disable-gtk-doc \
228		--disable-gtk-doc-html \
229		--disable-doc \
230		--disable-docs \
231		--disable-documentation \
232		--disable-debug \
233		--with-xmlto=no \
234		--with-fop=no \
235		--disable-nls \
236		$$(if $$($$(PKG)_OVERRIDE_SRCDIR),,--disable-dependency-tracking) \
237		$$(QUIET) $$($$(PKG)_CONF_OPTS) \
238	)
239endef
240endif
241endif
242
243$(2)_POST_PATCH_HOOKS += UPDATE_CONFIG_HOOK
244
245ifeq ($$($(2)_AUTORECONF),YES)
246
247# This has to come before autoreconf
248ifeq ($$($(2)_GETTEXTIZE),YES)
249$(2)_PRE_CONFIGURE_HOOKS += GETTEXTIZE_HOOK
250$(2)_DEPENDENCIES += host-gettext
251endif
252$(2)_PRE_CONFIGURE_HOOKS += AUTORECONF_HOOK
253# default values are not evaluated yet, so don't rely on this defaulting to YES
254ifneq ($$($(2)_LIBTOOL_PATCH),NO)
255$(2)_PRE_CONFIGURE_HOOKS += LIBTOOL_PATCH_HOOK
256endif
257$(2)_DEPENDENCIES += host-automake host-autoconf host-libtool
258
259else # ! AUTORECONF = YES
260
261# default values are not evaluated yet, so don't rely on this defaulting to YES
262ifneq ($$($(2)_LIBTOOL_PATCH),NO)
263$(2)_POST_PATCH_HOOKS += LIBTOOL_PATCH_HOOK
264endif
265
266endif
267
268# Append a configure hook if building for a powerpc64 (or powerpc64le) arch.
269# Must be added after other pre-configure hooks that might regenerate the
270# configure script and overwrite the changes made here.
271ifneq ($$(filter powerpc64%,$$(if $$(filter target,$(4)),$$(ARCH),$$(HOSTARCH))),)
272$(2)_PRE_CONFIGURE_HOOKS += CONFIGURE_FIX_POWERPC64_HOOK
273endif
274
275#
276# Build step. Only define it if not already defined by the package .mk
277# file.
278#
279ifndef $(2)_BUILD_CMDS
280ifeq ($(4),target)
281define $(2)_BUILD_CMDS
282	$$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_SRCDIR)
283endef
284else
285define $(2)_BUILD_CMDS
286	$$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_MAKE_OPTS) -C $$($$(PKG)_SRCDIR)
287endef
288endif
289endif
290
291#
292# Host installation step. Only define it if not already defined by the
293# package .mk file.
294#
295ifndef $(2)_INSTALL_CMDS
296define $(2)_INSTALL_CMDS
297	$$(HOST_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_OPTS) -C $$($$(PKG)_SRCDIR)
298endef
299endif
300
301#
302# Staging installation step. Only define it if not already defined by
303# the package .mk file.
304#
305ifndef $(2)_INSTALL_STAGING_CMDS
306define $(2)_INSTALL_STAGING_CMDS
307	$$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_STAGING_OPTS) -C $$($$(PKG)_SRCDIR)
308endef
309endif
310
311#
312# Target installation step. Only define it if not already defined by
313# the package .mk file.
314#
315ifndef $(2)_INSTALL_TARGET_CMDS
316define $(2)_INSTALL_TARGET_CMDS
317	$$(TARGET_MAKE_ENV) $$($$(PKG)_MAKE_ENV) $$($$(PKG)_MAKE) $$($$(PKG)_INSTALL_TARGET_OPTS) -C $$($$(PKG)_SRCDIR)
318endef
319endif
320
321# Call the generic package infrastructure to generate the necessary
322# make targets
323$(call inner-generic-package,$(1),$(2),$(3),$(4))
324
325endef
326
327################################################################################
328# autotools-package -- the target generator macro for autotools packages
329################################################################################
330
331autotools-package = $(call inner-autotools-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
332host-autotools-package = $(call inner-autotools-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
333