mirror of
https://github.com/pmmp/musl-cross-make.git
synced 2024-11-24 10:46:11 +00:00
3398364d6e
I overlooked that GCC was not doing this by default for musl, since binutils ld automatically converts the .ctors/.dtors GCC emits to init/fini arrays at link time. unfortunately lld does not do the same, so without --enable-initfini-array, GCC produces object files that lld will mislink unless it was configured with support for legacy GCC ctors.
285 lines
7.7 KiB
Makefile
285 lines
7.7 KiB
Makefile
|
|
OUTPUT = $(CURDIR)/output
|
|
|
|
BINUTILS_SRCDIR = BINUTILS_SRCDIR_not_set
|
|
GCC_SRCDIR = GCC_SRCDIR_not_set
|
|
MUSL_SRCDIR = MUSL_SRCDIR_not_set
|
|
|
|
GCC_CONFIG_FOR_TARGET =
|
|
COMMON_CONFIG =
|
|
GCC_CONFIG =
|
|
TOOLCHAIN_CONFIG =
|
|
|
|
XGCC_DIR = ../obj_gcc/gcc
|
|
XGCC = $(XGCC_DIR)/xgcc -B $(XGCC_DIR)
|
|
|
|
-include config.mak
|
|
|
|
ifneq ($(findstring fdpic,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --enable-fdpic
|
|
endif
|
|
|
|
ifneq ($(filter x86_64%x32,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-abi=x32
|
|
endif
|
|
|
|
ifneq ($(findstring powerpc64,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-abi=elfv2
|
|
endif
|
|
|
|
ifneq ($(findstring mips64,$(TARGET))$(findstring mipsisa64,$(TARGET)),)
|
|
ifneq ($(findstring n32,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-abi=n32
|
|
else
|
|
GCC_CONFIG_FOR_TARGET += --with-abi=64
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(findstring s390x,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-long-double-128
|
|
endif
|
|
|
|
ifneq ($(filter %sf,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-float=soft
|
|
endif
|
|
|
|
ifneq ($(filter %hf,$(TARGET)),)
|
|
GCC_CONFIG_FOR_TARGET += --with-float=hard
|
|
endif
|
|
|
|
ifneq ($(LIBTOOL),)
|
|
LIBTOOL_ARG = LIBTOOL=$(LIBTOOL)
|
|
endif
|
|
|
|
MAKE += MULTILIB_OSDIRNAMES=
|
|
MAKE += INFO_DEPS= infodir=
|
|
MAKE += ac_cv_prog_lex_root=lex.yy
|
|
MAKE += MAKEINFO=false
|
|
|
|
FULL_BINUTILS_CONFIG = \
|
|
--disable-separate-code \
|
|
$(COMMON_CONFIG) $(BINUTILS_CONFIG) $(TOOLCHAIN_CONFIG) \
|
|
--disable-werror \
|
|
--target=$(TARGET) --prefix= \
|
|
--libdir=/lib --disable-multilib \
|
|
--with-sysroot=$(SYSROOT) \
|
|
--enable-deterministic-archives
|
|
|
|
FULL_GCC_CONFIG = --enable-languages=c,c++ \
|
|
$(GCC_CONFIG_FOR_TARGET) \
|
|
$(COMMON_CONFIG) $(GCC_CONFIG) $(TOOLCHAIN_CONFIG) \
|
|
--disable-bootstrap \
|
|
--disable-assembly \
|
|
--disable-werror \
|
|
--target=$(TARGET) --prefix= \
|
|
--libdir=/lib --disable-multilib \
|
|
--with-sysroot=$(SYSROOT) \
|
|
--enable-tls \
|
|
--disable-libmudflap --disable-libsanitizer \
|
|
--disable-gnu-indirect-function \
|
|
--disable-libmpx \
|
|
--enable-initfini-array \
|
|
--enable-libstdcxx-time=rt
|
|
|
|
FULL_MUSL_CONFIG = $(MUSL_CONFIG) \
|
|
--prefix= --host=$(TARGET)
|
|
|
|
ifneq ($(NATIVE),)
|
|
HOST:=$(TARGET)
|
|
endif
|
|
|
|
ifeq ($(BUILD),)
|
|
GUESS = $(shell cd $(GCC_SRCDIR) && ./config.guess)
|
|
TARGET_CANON = $(shell cd $(GCC_SRCDIR) && ./config.sub $(TARGET))
|
|
BUILD = $(GUESS)$(if $(subst $(TARGET_CANON),,$(GUESS)),,xx)
|
|
endif
|
|
|
|
ifeq ($(HOST),)
|
|
SYSROOT = /$(TARGET)
|
|
FULL_BINUTILS_CONFIG += --build=$(BUILD) --host=$(BUILD)
|
|
FULL_GCC_CONFIG += --with-build-sysroot=$(CURDIR)/obj_sysroot \
|
|
AR_FOR_TARGET=$(PWD)/obj_binutils/binutils/ar \
|
|
AS_FOR_TARGET=$(PWD)/obj_binutils/gas/as-new \
|
|
LD_FOR_TARGET=$(PWD)/obj_binutils/ld/ld-new \
|
|
NM_FOR_TARGET=$(PWD)/obj_binutils/binutils/nm-new \
|
|
OBJCOPY_FOR_TARGET=$(PWD)/obj_binutils/binutils/objcopy \
|
|
OBJDUMP_FOR_TARGET=$(PWD)/obj_binutils/binutils/objdump \
|
|
RANLIB_FOR_TARGET=$(PWD)/obj_binutils/binutils/ranlib \
|
|
READELF_FOR_TARGET=$(PWD)/obj_binutils/binutils/readelf \
|
|
STRIP_FOR_TARGET=$(PWD)/obj_binutils/binutils/strip-new \
|
|
--build=$(BUILD) --host=$(BUILD) \
|
|
# end
|
|
FULL_MUSL_CONFIG += CC="$(XGCC)" LIBCC="../obj_gcc/$(TARGET)/libgcc/libgcc.a"
|
|
MUSL_VARS = AR=../obj_binutils/binutils/ar RANLIB=../obj_binutils/binutils/ranlib
|
|
obj_musl/.lc_configured: | obj_gcc/gcc/.lc_built
|
|
obj_musl/.lc_built: | obj_gcc/$(TARGET)/libgcc/libgcc.a
|
|
obj_gcc/gcc/.lc_built: | obj_sysroot/usr obj_sysroot/lib32 obj_sysroot/lib64 obj_sysroot/include
|
|
obj_gcc/.lc_built: | obj_sysroot/.lc_libs obj_sysroot/.lc_headers
|
|
obj_gcc/.lc_configured: obj_binutils/.lc_built
|
|
else
|
|
SYSROOT = /
|
|
FULL_BINUTILS_CONFIG += --build=$(BUILD) --host=$(HOST)
|
|
FULL_GCC_CONFIG += --build=$(BUILD) --host=$(HOST)
|
|
MUSL_VARS =
|
|
endif
|
|
|
|
ifeq ($(TARGET),)
|
|
|
|
all:
|
|
@echo TARGET must be set.
|
|
@exit 1
|
|
|
|
install: all
|
|
|
|
else
|
|
|
|
all: musl gcc binutils
|
|
|
|
install: install-musl install-gcc install-binutils
|
|
|
|
musl: obj_musl/.lc_built
|
|
|
|
toolchain: gcc binutils
|
|
|
|
install-toolchain: install-gcc install-binutils
|
|
|
|
gcc: obj_gcc/.lc_built
|
|
|
|
binutils: obj_binutils/.lc_built
|
|
|
|
.PHONY: all musl toolchain install-musl install-toolchain clean
|
|
|
|
src_binutils: | $(BINUTILS_SRCDIR)
|
|
ln -sf $(BINUTILS_SRCDIR) $@
|
|
|
|
src_gcc_base: | $(GCC_SRCDIR)
|
|
ln -sf $(GCC_SRCDIR) $@
|
|
|
|
src_musl: | $(MUSL_SRCDIR)
|
|
ln -sf $(MUSL_SRCDIR) $@
|
|
|
|
ifneq ($(GMP_SRCDIR),)
|
|
src_gcc: src_gmp
|
|
src_gmp: | $(GMP_SRCDIR)
|
|
ln -sf "$(GMP_SRCDIR)" $@
|
|
endif
|
|
|
|
ifneq ($(MPC_SRCDIR),)
|
|
src_gcc: src_mpc
|
|
src_mpc: | $(MPC_SRCDIR)
|
|
ln -sf "$(MPC_SRCDIR)" $@
|
|
endif
|
|
|
|
ifneq ($(MPFR_SRCDIR),)
|
|
src_gcc: src_mpfr
|
|
src_mpfr: | $(MPFR_SRCDIR)
|
|
ln -sf "$(MPFR_SRCDIR)" $@
|
|
endif
|
|
|
|
ifneq ($(ISL_SRCDIR),)
|
|
src_gcc: src_isl
|
|
src_isl: | $(ISL_SRCDIR)
|
|
ln -sf "$(ISL_SRCDIR)" $@
|
|
endif
|
|
|
|
src_gcc: src_gcc_base
|
|
rm -rf $@ $@.tmp
|
|
mkdir $@.tmp
|
|
cd $@.tmp && ln -sf ../src_gcc_base/* .
|
|
$(if $(GMP_SRCDIR),cd $@.tmp && ln -sf ../src_gmp gmp)
|
|
$(if $(MPC_SRCDIR),cd $@.tmp && ln -sf ../src_mpc mpc)
|
|
$(if $(MPFR_SRCDIR),cd $@.tmp && ln -sf ../src_mpfr mpfr)
|
|
$(if $(ISL_SRCDIR),cd $@.tmp && ln -sf ../src_isl isl)
|
|
mv $@.tmp $@
|
|
|
|
obj_%:
|
|
mkdir -p $@
|
|
|
|
obj_sysroot/include:
|
|
mkdir -p $@
|
|
|
|
obj_sysroot/usr: | obj_sysroot
|
|
ln -sf . $@
|
|
|
|
obj_sysroot/lib32: | obj_sysroot
|
|
ln -sf lib $@
|
|
|
|
obj_sysroot/lib64: | obj_sysroot
|
|
ln -sf lib $@
|
|
|
|
obj_binutils/.lc_configured: | obj_binutils src_binutils
|
|
cd obj_binutils && ../src_binutils/configure $(FULL_BINUTILS_CONFIG)
|
|
touch $@
|
|
|
|
obj_binutils/.lc_built: | obj_binutils/.lc_configured
|
|
cd obj_binutils && $(MAKE) MAKE="$(MAKE) $(LIBTOOL_ARG)" all
|
|
touch $@
|
|
|
|
obj_gcc/.lc_configured: | obj_gcc src_gcc
|
|
cd obj_gcc && ../src_gcc/configure $(FULL_GCC_CONFIG)
|
|
touch $@
|
|
|
|
obj_gcc/gcc/.lc_built: | obj_gcc/.lc_configured
|
|
cd obj_gcc && $(MAKE) MAKE="$(MAKE) $(LIBTOOL_ARG)" all-gcc
|
|
touch $@
|
|
|
|
obj_musl/.lc_configured: | obj_musl src_musl
|
|
cd obj_musl && ../src_musl/configure $(FULL_MUSL_CONFIG)
|
|
touch $@
|
|
|
|
obj_sysroot/.lc_headers: | obj_musl/.lc_configured obj_sysroot
|
|
cd obj_musl && $(MAKE) DESTDIR=$(CURDIR)/obj_sysroot install-headers
|
|
touch $@
|
|
|
|
obj_gcc/$(TARGET)/libgcc/libgcc.a: | obj_sysroot/.lc_headers
|
|
cd obj_gcc && $(MAKE) MAKE="$(MAKE) enable_shared=no $(LIBTOOL_ARG)" all-target-libgcc
|
|
|
|
obj_musl/.lc_built: | obj_musl/.lc_configured
|
|
cd obj_musl && $(MAKE) $(MUSL_VARS)
|
|
touch $@
|
|
|
|
obj_sysroot/.lc_libs: | obj_musl/.lc_built
|
|
cd obj_musl && $(MAKE) $(MUSL_VARS) DESTDIR=$(CURDIR)/obj_sysroot install
|
|
touch $@
|
|
|
|
obj_gcc/.lc_built: | obj_gcc/.lc_configured obj_gcc/gcc/.lc_built
|
|
cd obj_gcc && $(MAKE) MAKE="$(MAKE) $(LIBTOOL_ARG)"
|
|
touch $@
|
|
|
|
install-musl: | obj_musl/.lc_built
|
|
cd obj_musl && $(MAKE) $(MUSL_VARS) DESTDIR=$(DESTDIR)$(OUTPUT)$(SYSROOT) install
|
|
|
|
install-binutils: | obj_binutils/.lc_built
|
|
cd obj_binutils && $(MAKE) MAKE="$(MAKE) $(LIBTOOL_ARG)" DESTDIR=$(DESTDIR)$(OUTPUT) install
|
|
|
|
install-gcc: | obj_gcc/.lc_built
|
|
cd obj_gcc && $(MAKE) MAKE="$(MAKE) $(LIBTOOL_ARG)" DESTDIR=$(DESTDIR)$(OUTPUT) install
|
|
ln -sf $(TARGET)-gcc $(DESTDIR)$(OUTPUT)/bin/$(TARGET)-cc
|
|
|
|
ifneq ($(LINUX_SRCDIR),)
|
|
TARGET_ARCH = $(firstword $(subst -, ,$(TARGET)))
|
|
TARGET_ARCH_MANGLED = $(patsubst i%86,x86,$(patsubst aarch64%,arm64%,$(TARGET_ARCH)))
|
|
LINUX_ARCH_LIST = $(sort $(notdir $(wildcard $(LINUX_SRCDIR)/arch/*)))
|
|
LINUX_ARCH = $(lastword $(foreach a,$(LINUX_ARCH_LIST),$(if $(filter $(a)%,$(TARGET_ARCH_MANGLED)),$(a))))
|
|
ifneq ($(LINUX_ARCH),)
|
|
all: kernel-headers
|
|
install: install-kernel-headers
|
|
kernel-headers: | obj_kernel_headers/.lc_built
|
|
src_kernel_headers: | $(LINUX_SRCDIR)
|
|
ln -sf "$(LINUX_SRCDIR)" $@
|
|
obj_kernel_headers/.lc_built: | src_kernel_headers
|
|
mkdir -p $(CURDIR)/obj_kernel_headers/staged
|
|
cd src_kernel_headers && $(MAKE) ARCH=$(LINUX_ARCH) O=$(CURDIR)/obj_kernel_headers INSTALL_HDR_PATH=$(CURDIR)/obj_kernel_headers/staged headers_install
|
|
find obj_kernel_headers/staged/include '(' -name .install -o -name ..install.cmd ')' -exec rm {} +
|
|
touch $@
|
|
install-kernel-headers: | obj_kernel_headers/.lc_built
|
|
mkdir -p $(DESTDIR)$(OUTPUT)$(SYSROOT)/include
|
|
cp -R obj_kernel_headers/staged/include/* $(DESTDIR)$(OUTPUT)$(SYSROOT)/include
|
|
endif
|
|
endif
|
|
|
|
endif
|
|
|
|
clean:
|
|
rm -rf src_* obj_*
|