diff mbox

[OpenWrt-Devel,RFC] build: use gcc-provided ar, nm and ranlib where appropriate

Message ID dfc49147e88ea0510f4bd51eac34b4729b589eb3.1419534230.git.mschiffer@universe-factory.net
State Accepted
Headers show

Commit Message

Matthias Schiffer Dec. 25, 2014, 7:09 p.m. UTC
Since GCC 4.7, GCC provides its own wrappers around ar, nm and ranlib, which
should be used for builds with link-time optimization. Since GCC 4.9, using them
actually necessary for LTO builds using convenience libraries to succeed.

There are some packages which try to automatically detect if gcc-{ar,nm,ranlib}
exist (one example is my package "fastd" in the package repository, which tries
to use LTO). This breaks because the OpenWrt build system explicitly sets the
binutils versions of these tools.

As it doesn't cause any issues to use gcc-{ar,nm,ranlib} instead of
{ar,nm,ranlib} even without LTO, this patch just makes OpenWrt use the
GCC-provided versions by default, which fixes the build of such packages with
GCC 4.9.

(I know that builds fail though when clang is used with -flto and
gcc-{ar,nm,ranlib}, but as all OpenWrt toolchains are based on GCC, this isn't
a real issue.)

Completely cleaning the tree (or at least `make clean toolchain/clean`) is
necessary to get a consistent state after the binutils plugins support patch and
this one (as trying to use gcc-{ar,nm,ranlib} with a binutils built without
plugin support will definitely lead to a build failure).

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
---
This RFC is a followup to my previous patch "binutils: enable plugin support"
which actually fixes the build of my package "fastd" with GCC 4.9.

I've checked that it doesn't cause any build regressions with any of the GCC
versions 4.6, 4.8 and 4.9 in the default build on ar71xx; I didn't test other
architectures or an all-package build though.

 include/cmake.mk |  6 ++++--
 rules.mk         | 18 +++++++++++++-----
 2 files changed, 17 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/include/cmake.mk b/include/cmake.mk
index 9a5e311..6ab628e 100644
--- a/include/cmake.mk
+++ b/include/cmake.mk
@@ -27,8 +27,9 @@  else
   CMAKE_CXX_COMPILER:=$(CCACHE)
   CMAKE_CXX_COMPILER_ARG1:=$(TARGET_CXX_NOCACHE)
 endif
-CMAKE_AR:=$(call cmake_tool,$(TARGET_CROSS)ar)
-CMAKE_RANLIB:=$(call cmake_tool,$(TARGET_CROSS)ranlib)
+CMAKE_AR:=$(call cmake_tool,$(TARGET_AR))
+CMAKE_NM:=$(call cmake_tool,$(TARGET_NM))
+CMAKE_RANLIB:=$(call cmake_tool,$(TARGET_RANLIB))
 
 define Build/Configure/Default
 	(cd $(PKG_BUILD_DIR); \
@@ -50,6 +51,7 @@  define Build/Configure/Default
 			-DCMAKE_MODULE_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS)" \
 			-DCMAKE_SHARED_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS)" \
 			-DCMAKE_AR="$(CMAKE_AR)" \
+			-DCMAKE_NM="$(CMAKE_NM)" \
 			-DCMAKE_RANLIB="$(CMAKE_RANLIB)" \
 			-DCMAKE_FIND_ROOT_PATH="$(STAGING_DIR);$(TOOLCHAIN_DIR)" \
 			-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \
diff --git a/rules.mk b/rules.mk
index 0822979..8f42fe3 100644
--- a/rules.mk
+++ b/rules.mk
@@ -192,9 +192,17 @@  HOST_CPPFLAGS:=-I$(STAGING_DIR_HOST)/include -I$(STAGING_DIR_HOST)/usr/include
 HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS)
 HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib -L$(STAGING_DIR_HOST)/usr/lib
 
+ifeq ($(CONFIG_GCC_VERSION_4_4)$(CONFIG_GCC_VERSION_4_6),)
+  TARGET_AR:=$(TARGET_CROSS)gcc-ar
+  TARGET_RANLIB:=$(TARGET_CROSS)gcc-ranlib
+  TARGET_NM:=$(TARGET_CROSS)gcc-nm
+else
+  TARGET_AR:=$(TARGET_CROSS)ar
+  TARGET_RANLIB:=$(TARGET_CROSS)ranlib
+  TARGET_NM:=$(TARGET_CROSS)nm
+endif
+
 TARGET_CC:=$(TARGET_CROSS)gcc
-TARGET_AR:=$(TARGET_CROSS)ar
-TARGET_RANLIB:=$(TARGET_CROSS)ranlib
 TARGET_CXX:=$(TARGET_CROSS)g++
 KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh
 SED:=$(STAGING_DIR_HOST)/bin/sed -i -e
@@ -223,14 +231,14 @@  ifneq ($(CONFIG_CCACHE),)
 endif
 
 TARGET_CONFIGURE_OPTS = \
-  AR=$(TARGET_CROSS)ar \
+  AR="$(TARGET_AR)" \
   AS="$(TARGET_CC) -c $(TARGET_ASFLAGS)" \
   LD=$(TARGET_CROSS)ld \
-  NM=$(TARGET_CROSS)nm \
+  NM="$(TARGET_NM)" \
   CC="$(TARGET_CC)" \
   GCC="$(TARGET_CC)" \
   CXX="$(TARGET_CXX)" \
-  RANLIB=$(TARGET_CROSS)ranlib \
+  RANLIB="$(TARGET_RANLIB)" \
   STRIP=$(TARGET_CROSS)strip \
   OBJCOPY=$(TARGET_CROSS)objcopy \
   OBJDUMP=$(TARGET_CROSS)objdump \