[Crash-utility] [PATCH 3/4] Add cross compilation support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently, the cross compilation is not supported in
crash-utility, let's add this feature.

Tested(ubuntu-24.04) on: X86_64, X86, aarch64, s390x,
powerpc64, alpha, sparc64, mips, riscv64

E.g: cross build crash-utility for aarch64 on X86_64
 make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
or
 make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc` warn

Note: there are still some limitations for cross
compilation because some dependency libs that are not
cross-compiled, for example: snappy, lzo, zstd

Link: https://lists.crash-utility.osci.io/archives/list/devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx/thread/Y27LRU3D2PA7OZ2N3A3EJNQGFEY4A7NS/
Signed-off-by: Lianbo Jiang <lijiang@xxxxxxxxxx>
---
 Makefile    | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 README      |  5 +++++
 configure.c |  6 ++++++
 help.c      |  5 +++++
 4 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 60dad1870a92..3e7853ad94a0 100644
--- a/Makefile
+++ b/Makefile
@@ -27,11 +27,57 @@ PROGRAM=crash
 TARGET=
 GDB_CONF_FLAGS=
 
-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+# Supported arches for cross compilation: x86_64, x86, aarch64, s390x,
+# powerpc64, alpha, sparc64, mips, riscv64
+# E.g: cross compile crash-utility for aarch64 on X86_64
+# make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
+# or
+# make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc` warn
+#
+ifneq ($(CROSS_COMPILE),)
+ARCH := $(shell echo $(CROSS_COMPILE) | sed 's:^.*/::g' | cut -d- -f1)
+else
+ARCH := $(shell uname -m)
+endif
+
+ARCH := $(shell echo $(ARCH) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+
+CC     = $(CROSS_COMPILE)gcc
+CXX    = $(CROSS_COMPILE)g++
+HOSTCC = gcc
+
 ifeq (${ARCH}, ppc64)
 CONF_FLAGS = -m64
 endif
 
+ifneq ($(CROSS_COMPILE),)
+ifeq (${ARCH}, x86_64)
+CONF_TARGET_ARCH := X86_64
+else ifeq (${ARCH}, aarch64)
+CONF_TARGET_ARCH := ARM64
+else ifeq (${ARCH}, s390x)
+CONF_TARGET_ARCH := S390X
+else ifeq (${ARCH}, powerpc64)
+CONF_TARGET_ARCH := PPC64
+else ifeq (${ARCH}, ppc64le)
+CONF_TARGET_ARCH := PPC64
+else ifeq (${ARCH}, alpha)
+CONF_TARGET_ARCH := ALPHA
+else ifeq (${ARCH}, i386)
+CONF_TARGET_ARCH := X86
+else ifeq (${ARCH}, mips)
+CONF_TARGET_ARCH := MIPS
+else ifeq (${ARCH}, sparc64)
+CONF_TARGET_ARCH := SPARC64
+else ifeq (${ARCH}, riscv64)
+CONF_TARGET_ARCH := RISCV64
+else
+$(error The current Arch(${ARCH}) does not support cross compilation)
+endif
+CONF_FLAGS += -DCONF_TARGET_ARCH=${CONF_TARGET_ARCH}
+CONF_FLAGS += -DGDB_TARGET_DEFAULT="\"GDB_CONF_FLAGS=--host=$(shell echo $(CROSS_COMPILE) | sed -e 's:^.*/::g' -e 's/-$$//')\""
+endif
+
 #
 # GDB, GDB_FILES, GDB_OFILES and GDB_PATCH_FILES will be configured automatically by configure 
 #
@@ -310,7 +356,7 @@ force:
 
 make_configure: force
 	@rm -f configure
-	@${CC} ${CONF_FLAGS} -o configure configure.c ${WARNING_ERROR} ${WARNING_OPTIONS}
+	@${HOSTCC} ${CONF_FLAGS} -o configure configure.c ${WARNING_ERROR} ${WARNING_OPTIONS}
 
 clean: make_configure
 	@./configure ${CONF_TARGET_FLAG} -q -b
diff --git a/README b/README
index d7e7d9b97899..4ce55626e501 100644
--- a/README
+++ b/README
@@ -84,6 +84,11 @@
     $ cd crash-8.0.6
     $ make
 
+  To cross compile the crash utility for aarch64 on x86_64:
+    $ make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`
+
+  Supported arches for cross compilation: x86_64, x86, aarch64, s390x, powerpc64, alpha, sparc64, mips, riscv64
+
   The initial build will take several minutes  because the embedded gdb module
   must be configured and built.  Alternatively, the crash source RPM file
   may be installed and built, and the resultant crash binary RPM file installed.
diff --git a/configure.c b/configure.c
index 4668c9a4e20b..7303ebb5c483 100644
--- a/configure.c
+++ b/configure.c
@@ -169,7 +169,9 @@ void add_extra_lib(char *);
 #define TARGET_CFLAGS_LOONGARCH64     "TARGET_CFLAGS="
 #define TARGET_CFLAGS_LOONGARCH64_ON_X86_64	"TARGET_CFLAGS="
 
+#ifndef GDB_TARGET_DEFAULT
 #define GDB_TARGET_DEFAULT        "GDB_CONF_FLAGS="
+#endif
 #define GDB_TARGET_ARM_ON_X86     "GDB_CONF_FLAGS=--target=arm-elf-linux"
 #define GDB_TARGET_ARM_ON_X86_64  "GDB_CONF_FLAGS=--target=arm-elf-linux CFLAGS=-m32 CXXFLAGS=-m32"
 #define GDB_TARGET_X86_ON_X86_64  "GDB_CONF_FLAGS=--target=i686-pc-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32"
@@ -376,6 +378,7 @@ get_current_configuration(struct supported_gdb_version *sp)
 	static char buf[512];
 	char *p;
 
+#ifndef CONF_TARGET_ARCH
 #ifdef __alpha__
         target_data.target = ALPHA;
 #endif
@@ -422,6 +425,9 @@ get_current_configuration(struct supported_gdb_version *sp)
 #ifdef __loongarch64
 	target_data.target = LOONGARCH64;
 #endif
+#else
+	target_data.target = CONF_TARGET_ARCH;
+#endif
 
 	set_initial_target(sp);
 
diff --git a/help.c b/help.c
index 87eb9eed2eef..c1d8eca44f22 100644
--- a/help.c
+++ b/help.c
@@ -9618,6 +9618,11 @@ char *README[] = {
 README_ENTER_DIRECTORY,
 "    $ make",
 "",
+"  To cross compile the crash utility for aarch64 on x86_64: ",
+"    $ make CROSS_COMPILE=aarch64-linux-gnu- -j`nproc`",
+"",
+"  Supported arches for cross compilation: x86_64, x86, aarch64, s390x, powerpc64, alpha, sparc64, mips, riscv64",
+"",
 "  The initial build will take several minutes  because the embedded gdb module",
 "  must be configured and built.  Alternatively, the crash source RPM file",
 "  may be installed and built, and the resultant crash binary RPM file installed.",
-- 
2.47.1
--
Crash-utility mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux