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