From b328a326b1af0844fc8bc9bb3453f5a3115abbfd Mon Sep 17 00:00:00 2001 From: Mikael Vidstedt Date: Wed, 3 Jun 2026 19:48:32 +0000 Subject: [PATCH] 8385552: Improve devkit/sysroot creation Reviewed-by: erikj --- doc/building.html | 28 ++-- doc/building.md | 27 ++- make/devkit/Common.gmk | 107 ++++++++++++ make/devkit/Makefile | 33 ++-- make/devkit/Sysroot.gmk | 208 +++++++++++++++++++++++ make/devkit/Tars.gmk | 6 +- make/devkit/Tools.gmk | 362 +++++++++++----------------------------- 7 files changed, 456 insertions(+), 315 deletions(-) create mode 100644 make/devkit/Common.gmk create mode 100644 make/devkit/Sysroot.gmk diff --git a/doc/building.html b/doc/building.html index 86ee3390ead..be3c8c364d7 100644 --- a/doc/building.html +++ b/doc/building.html @@ -394,11 +394,11 @@ to date at the time of writing.

Linux/x64 -Oracle Enterprise Linux 6.4 / 8.x +Oracle Linux 6.4 / 8.x Linux/aarch64 -Oracle Enterprise Linux 7.6 / 8.x +Oracle Linux 7.6 / 8.x macOS @@ -1495,26 +1495,24 @@ following targets are known to work:

-

BASE_OS must be one of OL for Oracle -Enterprise Linux or Fedora. If the base OS is -Fedora the corresponding Fedora release can be specified -with the help of the BASE_OS_VERSION option. If the build -is successful, the new devkits can be found in the +

BASE_OS must be one of OL for Oracle Linux +or Fedora. The release/version of the base OS can be +specified using the BASE_OS_VERSION option. If the build is +successful, the new devkits can be found in the build/devkit/result subdirectory:

cd make/devkit
-make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21
+make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora
 ls -1 ../../build/devkit/result/
 x86_64-linux-gnu-to-aarch64-linux-gnu
 x86_64-linux-gnu-to-ppc64le-linux-gnu

Notice that devkits are not only useful for targeting different build platforms. Because they contain the full build dependencies for a system -(i.e. compiler and root file system), they can easily be used to build -well-known, reliable and reproducible build environments. You can for -example create and use a devkit with GCC 7.3 and a Fedora 12 sysroot -environment (with glibc 2.11) on Ubuntu 14.04 (which doesn't have GCC -7.3 by default) to produce JDK binaries which will run on all Linux -systems with runtime libraries newer than the ones from Fedora 12 (e.g. -Ubuntu 16.04, SLES 11 or RHEL 6).

+(i.e., compiler and root file system/sysroot), they can easily be used +to build well-known, reliable, and reproducible build environments. You +can, for example, create and use a devkit with a version of the GCC +compiler not provided by the host OS, using a sysroot from an older +Linux distribution to produce JDK binaries which will run on all Linux +systems with newer runtime libraries.

Using Debian debootstrap

On Debian (or a derivative like Ubuntu), you can create sysroots for foreign architectures with tools provided by the OS. You can use diff --git a/doc/building.md b/doc/building.md index 93ab386ee8e..adf116764fa 100644 --- a/doc/building.md +++ b/doc/building.md @@ -195,8 +195,8 @@ time of writing. | Operating system | Vendor/version used | | ----------------- | ---------------------------------- | -| Linux/x64 | Oracle Enterprise Linux 6.4 / 8.x | -| Linux/aarch64 | Oracle Enterprise Linux 7.6 / 8.x | +| Linux/x64 | Oracle Linux 6.4 / 8.x | +| Linux/aarch64 | Oracle Linux 7.6 / 8.x | | macOS | macOS 14.x | | Windows | Windows Server 2016 | @@ -1288,27 +1288,26 @@ at least the following targets are known to work: | riscv64-linux-gnu | | s390x-linux-gnu | -`BASE_OS` must be one of `OL` for Oracle Enterprise Linux or `Fedora`. If the -base OS is `Fedora` the corresponding Fedora release can be specified with the -help of the `BASE_OS_VERSION` option. If the build is successful, the new -devkits can be found in the `build/devkit/result` subdirectory: +`BASE_OS` must be one of `OL` for Oracle Linux or `Fedora`. The release/version +of the base OS can be specified using the `BASE_OS_VERSION` option. If the build +is successful, the new devkits can be found in the `build/devkit/result` +subdirectory: ``` cd make/devkit -make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21 +make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora ls -1 ../../build/devkit/result/ x86_64-linux-gnu-to-aarch64-linux-gnu x86_64-linux-gnu-to-ppc64le-linux-gnu ``` Notice that devkits are not only useful for targeting different build -platforms. Because they contain the full build dependencies for a system (i.e. -compiler and root file system), they can easily be used to build well-known, -reliable and reproducible build environments. You can for example create and -use a devkit with GCC 7.3 and a Fedora 12 sysroot environment (with glibc 2.11) -on Ubuntu 14.04 (which doesn't have GCC 7.3 by default) to produce JDK binaries -which will run on all Linux systems with runtime libraries newer than the ones -from Fedora 12 (e.g. Ubuntu 16.04, SLES 11 or RHEL 6). +platforms. Because they contain the full build dependencies for a system (i.e., +compiler and root file system/sysroot), they can easily be used to build +well-known, reliable, and reproducible build environments. You can, for example, +create and use a devkit with a version of the GCC compiler not provided by the +host OS, using a sysroot from an older Linux distribution to produce JDK +binaries which will run on all Linux systems with newer runtime libraries. #### Using Debian debootstrap diff --git a/make/devkit/Common.gmk b/make/devkit/Common.gmk new file mode 100644 index 00000000000..f9c42350103 --- /dev/null +++ b/make/devkit/Common.gmk @@ -0,0 +1,107 @@ +# +# Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +ARCH := $(word 1,$(subst -, ,$(TARGET))) + +ifeq ($(TARGET), arm-linux-gnueabihf) + ARCH=armhfp +endif + +$(info ARCH=$(ARCH)) + +ifeq ($(PREFIX),) + $(error PREFIX not set) +endif + +BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET) +TARGETDIR := $(PREFIX)/$(TARGET) +SYSROOT := $(TARGETDIR)/sysroot + +# Base OS information and repositories +# +# BASE_OS_REPOS is a space-separated set of repositories. Each entry +# is of the format , where is a unique +# identifier across the set of repositories. + +ifeq ($(BASE_OS), OL) + ifeq ($(filter aarch64 x86_64, $(ARCH)), ) + $(error Only "aarch64 x86_64" architectures are supported for OL, but "$(ARCH)" was requested) + endif + BASE_OS_VERSION ?= 7 + ifeq ($(BASE_OS_VERSION), 6) + ifeq ($(filter x86_64, $(ARCH)), ) + $(error Only "x86_64" architectures are supported for OL6, but "$(ARCH)" was requested) + endif + BASE_OS_DESCRIPTION_VERSION := 6.4 + REPO_BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL6/4 + BASE_OS_REPOS := base,$(REPO_BASE_URL)/base/$(ARCH) + else ifeq ($(BASE_OS_VERSION), 7) + BASE_OS_DESCRIPTION_VERSION := 7.6 + REPO_BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL7/6 + BASE_OS_REPOS := base,$(REPO_BASE_URL)/base/$(ARCH) + else + REPO_BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL$(BASE_OS_VERSION) + BASE_OS_REPOS := baseos,$(REPO_BASE_URL)/baseos/latest/$(ARCH) appstream,$(REPO_BASE_URL)/appstream/$(ARCH) + BASE_OS_DESCRIPTION_VERSION := $(BASE_OS_VERSION) + endif + BASE_OS_DESCRIPTION := OL$(BASE_OS_DESCRIPTION_VERSION) +else ifeq ($(BASE_OS), Fedora) + ifeq ($(filter aarch64 armhfp ppc64le riscv64 s390x x86_64, $(ARCH)), ) + $(error Only "aarch64 armhfp ppc64le riscv64 s390x x86_64" architectures are supported for Fedora, but "$(ARCH)" was requested) + endif + ifeq ($(ARCH), riscv64) + BASE_OS_VERSION ?= 43 + BASE_OS_BUILD := 6640 + REPO_BASE_URL := https://riscv-koji.fedoraproject.org/repos-dist/f$(BASE_OS_VERSION)/$(BASE_OS_BUILD)/riscv64 + BASE_OS_REPOS := riscv64,$(REPO_BASE_URL) + else + ifeq ($(ARCH), armhfp) + BASE_OS_VERSION ?= 36 + else + BASE_OS_VERSION ?= 41 + endif + ifeq ($(ARCH), armhfp) + ifneq ($(BASE_OS_VERSION), 36) + $(error Fedora 36 is the last release supporting "armhfp", but $(BASE_OS_VERSION) was requested) + endif + endif + LATEST_ARCHIVED_OS_VERSION := 41 + ifeq ($(filter aarch64 x86_64 armhfp, $(ARCH)), ) + FEDORA_TYPE := fedora-secondary + else + FEDORA_TYPE := fedora/linux + endif + NOT_ARCHIVED := $(shell [ $(BASE_OS_VERSION) -gt $(LATEST_ARCHIVED_OS_VERSION) ] && echo true) + ifeq ($(NOT_ARCHIVED),true) + RPM_REPO_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os + else + RPM_REPO_URL := https://archives.fedoraproject.org/pub/archive/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os + endif + BASE_OS_REPOS := os,$(RPM_REPO_URL) + endif + BASE_OS_DESCRIPTION := Fedora_$(BASE_OS_VERSION) +else + $(error Unknown base OS $(BASE_OS)) +endif diff --git a/make/devkit/Makefile b/make/devkit/Makefile index 30e0dce0839..41ebb8b980c 100644 --- a/make/devkit/Makefile +++ b/make/devkit/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ # # make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora # or -# make TARGETS="arm-linux-gnueabihf ppc64le-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=17 +# make TARGETS="aarch64-linux-gnu ppc64le-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=41 # # to build several devkits for a specific OS version at once. # You can find the final results under ../../build/devkit/result/-to- @@ -50,7 +50,7 @@ # makefile again for cross compilation. Ex: # # PATH=$PWD/../../build/devkit/result/x86_64-linux-gnu-to-x86_64-linux-gnu/bin:$PATH \ -# make TARGETS="arm-linux-gnueabihf ppc64le-linux-gnu" BASE_OS=Fedora +# make TARGETS="aarch64-linux-gnu ppc64le-linux-gnu" BASE_OS=Fedora # # This is the makefile which iterates over all host and target platforms. # @@ -79,10 +79,10 @@ TARGET_PLATFORMS := $(PLATFORMS) $(info HOST_PLATFORMS $(HOST_PLATFORMS)) $(info TARGET_PLATFORMS $(TARGET_PLATFORMS)) -all compile : $(PLATFORMS) +all compile: $(PLATFORMS) ifeq ($(SKIP_ME), ) - $(foreach p,$(filter-out $(ME),$(PLATFORMS)),$(eval $(p) : $$(ME))) + $(foreach p,$(filter-out $(ME),$(PLATFORMS)),$(eval $(p): $$(ME))) endif OUTPUT_ROOT = $(abspath ../../build/devkit) @@ -90,38 +90,39 @@ RESULT = $(OUTPUT_ROOT)/result SUBMAKEVARS = HOST=$@ BUILD=$(ME) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT) -$(HOST_PLATFORMS) : +$(HOST_PLATFORMS): @echo 'Building compilers for $@' @echo 'Targets: $(TARGET_PLATFORMS)' for p in $(filter $@, $(TARGET_PLATFORMS)) $(filter-out $@, $(TARGET_PLATFORMS)); do \ - $(MAKE) -f Tools.gmk download-rpms $(SUBMAKEVARS) \ + $(MAKE) -f Sysroot.gmk sysroot $(SUBMAKEVARS) \ TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \ $(MAKE) -f Tools.gmk all $(SUBMAKEVARS) \ TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \ $(MAKE) -f Tools.gmk ccache $(SUBMAKEVARS) \ - TARGET=$@ PREFIX=$(RESULT)/$@-to-$$p || exit 1 ; \ + TARGET=$@ PREFIX=$(RESULT)/$@-to-$$p || exit 1; \ done - @echo 'All done"' + @echo 'All done' TODAY := $(shell date +%Y%m%d) define Mktar $(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(TODAY).tar.gz - $$($(1)-to-$(2)_tar) : PLATFORM = $(1)-to-$(2) + $$($(1)-to-$(2)_tar): PLATFORM = $(1)-to-$(2) TARFILES += $$($(1)-to-$(2)_tar) endef $(foreach p,$(HOST_PLATFORMS),$(foreach t,$(TARGET_PLATFORMS),$(eval $(call Mktar,$(p),$(t))))) -tars : all $(TARFILES) -onlytars : $(TARFILES) -%.tar.gz : +tars: all $(TARFILES) +onlytars: $(TARFILES) + +%.tar.gz: $(MAKE) -r -f Tars.gmk SRC_DIR=$(RESULT)/$(PLATFORM) TAR_FILE=$@ -clean : +clean: rm -rf $(addprefix ../../build/devkit/, result $(HOST_PLATFORMS)) + dist-clean: clean rm -rf $(addprefix ../../build/devkit/, src download) -FORCE : -.PHONY : all compile tars $(HOST_PLATFORMS) clean dist-clean +.PHONY: all compile tars $(HOST_PLATFORMS) clean dist-clean diff --git a/make/devkit/Sysroot.gmk b/make/devkit/Sysroot.gmk new file mode 100644 index 00000000000..fd3d8c1b891 --- /dev/null +++ b/make/devkit/Sysroot.gmk @@ -0,0 +1,208 @@ +# +# Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include Common.gmk + +$(info TARGET=$(TARGET)) +$(info HOST=$(HOST)) +$(info BUILD=$(BUILD)) + +ifeq ($(BASE_OS)-$(BASE_OS_VERSION)-$(ARCH), OL-7-aarch64) + KERNEL_HEADERS_RPM := kernel-uek-headers +else + KERNEL_HEADERS_RPM := kernel-headers +endif + +ifneq ($(BASE_OS)-$(BASE_OS_VERSION), OL-6) + WAYLAND_RPMS := wayland-devel wayland-protocols-devel +endif + +ZLIB_RPMS := zlib zlib-devel +ifeq ($(BASE_OS), Fedora) + ifneq ($(ARCH), armhfp) + ZLIB_RPMS := zlib-ng zlib-ng-devel + endif +endif + + +################################################################################ + +# RPMs to include +RPM_LIST := \ + filesystem \ + $(KERNEL_HEADERS_RPM) \ + glibc glibc-devel \ + cups-libs cups-devel \ + libX11 libX11-devel \ + libxcb xorg-x11-proto-devel \ + alsa-lib alsa-lib-devel \ + libXext libXext-devel \ + libXtst libXtst-devel \ + libXrender libXrender-devel \ + libXrandr libXrandr-devel \ + freetype freetype-devel \ + libXt libXt-devel \ + libSM libSM-devel \ + libICE libICE-devel \ + libXi libXi-devel \ + libXau libXau-devel \ + libgcc \ + $(ZLIB_RPMS) \ + libffi libffi-devel \ + fontconfig fontconfig-devel \ + systemtap-sdt-devel \ + $(WAYLAND_RPMS) \ + # + +################################################################################ +# Define common directories and files + +DOWNLOAD := $(OUTPUT_ROOT)/download +DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(BASE_OS)-$(BASE_OS_VERSION) +SRCDIR := $(OUTPUT_ROOT)/src + +################################################################################ +# Marker files + +DOWNLOAD_RPMS_MARKER := $(BUILDDIR)/download-rpms.marker +RPMS_UNPACKED_MARKER := $(BUILDDIR)/rpms_unpacked.marker +UNPATCHED_SYSROOT_MARKER := $(BUILDDIR)/sysroot_unpatched.marker +PATCHED_SYSROOT_MARKER := $(BUILDDIR)/sysroot_patched.marker + +################################################################################ +# Download RPMs + +ifeq ($(ARCH), armhfp) + RPM_ARCH := armv7hl +else + RPM_ARCH := $(ARCH) +endif + +RPM_ARCHS := $(RPM_ARCH) noarch +ifeq ($(ARCH), x86_64) + # Enable mixed mode. + RPM_ARCHS += i386 i686 +endif + +EMPTY := +SPACE := $(EMPTY) $(EMPTY) +COMMA := , +DNF_ARCHS := $(subst $(SPACE),$(COMMA),$(RPM_ARCHS)) + +# Specify a dummy installation root, otherwise dnf will run into +# problems trying to reconcile with the local/system state +DNF_DUMMY_INSTALL_ROOT := $(BUILDDIR)/dnf-dummy-install-root + +DNF_REPOS := $(foreach repo, $(BASE_OS_REPOS), \ + --repofrompath $(repo) \ + --enablerepo $(word 1,$(subst $(COMMA),$(SPACE),$(repo)))) + +DNF_DOWNLOAD_FLAGS := \ + --disablerepo='*' \ + $(DNF_REPOS) \ + --resolve \ + --archlist $(DNF_ARCHS) \ + --forcearch $(RPM_ARCH) \ + --installroot $(DNF_DUMMY_INSTALL_ROOT) \ + --releasever $(BASE_OS_VERSION) \ + # + +$(DOWNLOAD_RPMS_MARKER): + @mkdir -p $(@D) + mkdir -p $(DOWNLOAD_RPMS) + echo $(RPM_LIST) | \ + xargs dnf download $(DNF_DOWNLOAD_FLAGS) --destdir $(DOWNLOAD_RPMS) + touch $@ + +################################################################################ +# Unpack RPMS + +RPM_PATTERNS := $(foreach arch,$(RPM_ARCHS),$(DOWNLOAD_RPMS)/*.$(arch).rpm) + +CPIO_EXCLUDES := \ + "./usr/share/doc/*" \ + "./usr/share/man/*" \ + "./usr/X11R6/man/*" \ + "*/X11/locale/*" \ + # + +$(RPMS_UNPACKED_MARKER): $(DOWNLOAD_RPMS_MARKER) + if [ -d $(SYSROOT) ]; then echo "WARNING: Sysroot directory ($(SYSROOT)) already exists, proceeding anyway..."; fi + @mkdir -p $(SYSROOT) + # The -e test below is needed to skip unmatched glob patterns + ( \ + cd $(SYSROOT); \ + for rpm in $(RPM_PATTERNS); do \ + if [ ! -e "$$rpm" ]; then continue; fi; \ + echo Extracting $$rpm...; \ + rpm2cpio $$rpm | \ + cpio --extract --make-directories -f $(CPIO_EXCLUDES) \ + || exit 1; \ + done \ + ) + touch $@ + +################################################################################ + +$(UNPATCHED_SYSROOT_MARKER): $(RPMS_UNPACKED_MARKER) + touch $@ + +################################################################################ +# Patch sysroot + +# Note: MUST create a /usr/lib even if not really needed. +# gcc will use a path relative to it to resolve lib64. (x86_64). +# we're creating multi-lib compiler with 32bit libc as well, so we should +# have it anyway, but just to make sure... +# Patch GNU ld scripts to force linking against libraries in the sysroot +# and not the ones installed on the build machine. + +LD_SCRIPT_PATCHES := \ + -e 's|/usr/lib64/||g' \ + -e 's|/usr/lib/||g' \ + -e 's|/lib64/||g' \ + -e 's|/lib/||g' \ + # + +$(PATCHED_SYSROOT_MARKER): $(UNPATCHED_SYSROOT_MARKER) + @echo Patching GNU ld scripts + @( \ + for f in $$(find $(SYSROOT) -name "*.so" -type f 2>/dev/null); do \ + if grep -Iq 'GNU ld script' "$$f"; then \ + sed $(LD_SCRIPT_PATCHES) "$$f" > "$$f.tmp" && \ + mv "$$f.tmp" "$$f"; \ + fi; \ + done \ + ) + @mkdir -p $(SYSROOT)/usr/lib + @touch $@ + +################################################################################ + +download-rpms: $(DOWNLOAD_RPMS_MARKER) +unpatched-sysroot: $(UNPATCHED_SYSROOT_MARKER) +sysroot: $(PATCHED_SYSROOT_MARKER) + +.PHONY: download-rpms unpatched-sysroot sysroot diff --git a/make/devkit/Tars.gmk b/make/devkit/Tars.gmk index 80bba3d0242..c4d1e1f4dc5 100644 --- a/make/devkit/Tars.gmk +++ b/make/devkit/Tars.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,9 +39,9 @@ endif default: tars -tars : $(TAR_FILE) +tars: $(TAR_FILE) -$(TAR_FILE): $(shell find $(SRC_DIR) -type f) +$(TAR_FILE): $(shell find $(SRC_DIR) -type f | sed 's/ /\\ /g') @echo 'Creating compiler package $@' cd $(dir $(SRC_DIR)) && tar -czf $@ $(notdir $(SRC_DIR))/* touch $@ diff --git a/make/devkit/Tools.gmk b/make/devkit/Tools.gmk index 74c6d861777..835ada3a082 100644 --- a/make/devkit/Tools.gmk +++ b/make/devkit/Tools.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,68 +39,14 @@ # Fix this... # +include Common.gmk + lowercase = $(shell echo $1 | tr A-Z a-z) $(info TARGET=$(TARGET)) $(info HOST=$(HOST)) $(info BUILD=$(BUILD)) -ARCH := $(word 1,$(subst -, ,$(TARGET))) - -ifeq ($(TARGET), arm-linux-gnueabihf) - ARCH=armhfp -endif - -$(info ARCH=$(ARCH)) - -KERNEL_HEADERS_RPM := kernel-headers - -ifeq ($(BASE_OS), OL) - ifeq ($(ARCH), aarch64) - BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL7/6/base/$(ARCH)/ - LINUX_VERSION := OL7.6 - KERNEL_HEADERS_RPM := kernel-uek-headers - else - BASE_URL := https://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/ - LINUX_VERSION := OL6.4 - endif -else ifeq ($(BASE_OS), Fedora) - DEFAULT_OS_VERSION := 41 - ifeq ($(BASE_OS_VERSION), ) - BASE_OS_VERSION := $(DEFAULT_OS_VERSION) - endif - ifeq ($(filter aarch64 armhfp ppc64le riscv64 s390x x86_64, $(ARCH)), ) - $(error Only "aarch64 armhfp ppc64le riscv64 s390x x86_64" architectures are supported for Fedora, but "$(ARCH)" was requested) - endif - ifeq ($(ARCH), riscv64) - ifeq ($(filter 38 39 40 41, $(BASE_OS_VERSION)), ) - $(error Only Fedora 38-41 are supported for "$(ARCH)", but Fedora $(BASE_OS_VERSION) was requested) - endif - BASE_URL := http://fedora.riscv.rocks/repos-dist/f$(BASE_OS_VERSION)/latest/$(ARCH)/Packages/ - else - LATEST_ARCHIVED_OS_VERSION := 41 - ifeq ($(filter aarch64 armhfp x86_64, $(ARCH)), ) - FEDORA_TYPE := fedora-secondary - else - FEDORA_TYPE := fedora/linux - endif - ifeq ($(ARCH), armhfp) - ifneq ($(BASE_OS_VERSION), 36) - $(error Fedora 36 is the last release supporting "armhfp", but $(BASE_OS) was requested) - endif - endif - NOT_ARCHIVED := $(shell [ $(BASE_OS_VERSION) -gt $(LATEST_ARCHIVED_OS_VERSION) ] && echo true) - ifeq ($(NOT_ARCHIVED),true) - BASE_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/ - else - BASE_URL := https://archives.fedoraproject.org/pub/archive/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/ - endif - endif - LINUX_VERSION := Fedora_$(BASE_OS_VERSION) -else - $(error Unknown base OS $(BASE_OS)) -endif - ################################################################################ # Define external dependencies @@ -156,32 +102,6 @@ ifneq ($(REQUIRED_MIN_MAKE_MAJOR_VERSION),) endif endif -# RPMs used by all BASE_OS -RPM_LIST := \ - $(KERNEL_HEADERS_RPM) \ - glibc glibc-headers glibc-devel \ - cups-libs cups-devel \ - libX11 libX11-devel \ - libxcb xorg-x11-proto-devel \ - alsa-lib alsa-lib-devel \ - libXext libXext-devel \ - libXtst libXtst-devel \ - libXrender libXrender-devel \ - libXrandr libXrandr-devel \ - freetype freetype-devel \ - libXt libXt-devel \ - libSM libSM-devel \ - libICE libICE-devel \ - libXi libXi-devel \ - libXdmcp libXdmcp-devel \ - libXau libXau-devel \ - libgcc libxcrypt \ - zlib zlib-devel \ - libffi libffi-devel \ - fontconfig fontconfig-devel \ - systemtap-sdt-devel \ - # - ################################################################################ # Define common directories and files @@ -194,28 +114,11 @@ else endif # Define directories -BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET) -TARGETDIR := $(PREFIX)/$(TARGET) -SYSROOT := $(TARGETDIR)/sysroot DOWNLOAD := $(OUTPUT_ROOT)/download -DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(LINUX_VERSION) SRCDIR := $(OUTPUT_ROOT)/src -# Marker file for unpacking rpms -RPMS := $(SYSROOT)/rpms_unpacked - -# Need to patch libs that are linker scripts to use non-absolute paths -LIBS := $(SYSROOT)/libs_patched - -################################################################################ -# Download RPMs -download-rpms: - mkdir -p $(DOWNLOAD_RPMS) - # Only run this if rpm dir is empty. - ifeq ($(wildcard $(DOWNLOAD_RPMS)/*.rpm), ) - cd $(DOWNLOAD_RPMS) && \ - wget -r -np -nd $(patsubst %, -A "*%*.rpm", $(RPM_LIST)) $(BASE_URL) - endif +# Marker files +LINK_LIBS_MARKER := $(BUILDDIR)/link_libs.marker ################################################################################ # Unpack source packages @@ -236,24 +139,24 @@ define DownloadVerify endif $(1)_FILE = $(DOWNLOAD)/$(notdir $($(1)_URL)) - $$($(1)_SRC_MARKER) : $$($(1)_FILE) + $$($(1)_SRC_MARKER): $$($(1)_FILE) mkdir -p $$(SRCDIR) tar -C $$(SRCDIR) -xf $$< $$(foreach p,$$(abspath $$(wildcard patches/$$(ARCH)-$$(notdir $$($(1)_DIR)).patch)), \ - echo PATCHING $$(p) ; \ - patch -d $$($(1)_DIR) -p1 -i $$(p) ; \ + echo PATCHING $$(p); \ + patch -d $$($(1)_DIR) -p1 -i $$(p); \ ) touch $$@ - $$($(1)_FILE) : + $$($(1)_FILE): mkdir -p $$(@D) wget -O - $$($(1)_URL) > $$@.tmp sha512_actual="$$$$(sha512sum $$@.tmp | awk '{ print $$$$1; }')"; \ if [ x"$$$${sha512_actual}" != x"$$($(1)_SHA512)" ]; then \ - echo "Checksum mismatch for $$@.tmp"; \ - echo " Expected: $$($(1)_SHA512)"; \ - echo " Actual: $$$${sha512_actual}"; \ - exit 1; \ + echo "Checksum mismatch for $$@.tmp"; \ + echo " Expected: $$($(1)_SHA512)"; \ + echo " Actual: $$$${sha512_actual}"; \ + exit 1; \ fi mv $$@.tmp $$@ endef @@ -261,89 +164,17 @@ endef # Download and unpack all source packages $(foreach dep,$(DEPENDENCIES),$(eval $(call DownloadVerify,$(dep)))) -################################################################################ -# Unpack RPMS - -RPM_ARCHS := $(ARCH) noarch -ifeq ($(ARCH),x86_64) - # Enable mixed mode. - RPM_ARCHS += i386 i686 -else ifeq ($(ARCH),i686) - RPM_ARCHS += i386 -else ifeq ($(ARCH), armhfp) - RPM_ARCHS += armv7hl -endif - -RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \ - $(wildcard $(patsubst %,$(DOWNLOAD_RPMS)/%*$a.rpm,$(RPM_LIST))) \ -)) - -# Note. For building linux you should install rpm2cpio. -define unrpm - $(SYSROOT)/$(notdir $(1)).unpacked : $(1) - $$(RPMS) : $(SYSROOT)/$(notdir $(1)).unpacked -endef - -%.unpacked : - $(info Unpacking target rpms and libraries from $<) - @(mkdir -p $(@D); \ - cd $(@D); \ - rpm2cpio $< | \ - cpio --extract --make-directories \ - -f \ - "./usr/share/doc/*" \ - "./usr/share/man/*" \ - "./usr/X11R6/man/*" \ - "*/X11/locale/*" \ - || die ; ) - touch $@ - -$(foreach p,$(RPM_FILE_LIST),$(eval $(call unrpm,$(p)))) - -################################################################################ - -# Note: MUST create a /usr/lib even if not really needed. -# gcc will use a path relative to it to resolve lib64. (x86_64). -# we're creating multi-lib compiler with 32bit libc as well, so we should -# have it anyway, but just to make sure... -# Patch libc.so and libpthread.so to force linking against libraries in sysroot -# and not the ones installed on the build machine. -$(LIBS) : $(RPMS) - @echo Patching libc and pthreads - @(for f in `find $(SYSROOT) -name libc.so -o -name libpthread.so`; do \ - (cat $$f | sed -e 's|/usr/lib64/||g' \ - -e 's|/usr/lib/||g' \ - -e 's|/lib64/||g' \ - -e 's|/lib/||g' ) > $$f.tmp ; \ - mv $$f.tmp $$f ; \ - done) - @mkdir -p $(SYSROOT)/usr/lib - @touch $@ - -################################################################################ -# Create links for ffi header files so that they become visible by default when using the -# devkit. -ifeq ($(ARCH), x86_64) - $(SYSROOT)/usr/include/ffi.h: $(RPMS) - cd $(@D) && rm -f $(@F) && ln -s ../lib/libffi-*/include/$(@F) . - - $(SYSROOT)/usr/include/ffitarget.h: $(RPMS) - cd $(@D) && rm -f $(@F) && ln -s ../lib/libffi-*/include/$(@F) . - - SYSROOT_LINKS += $(SYSROOT)/usr/include/ffi.h $(SYSROOT)/usr/include/ffitarget.h -endif - -################################################################################ - # Define marker files for each source package to be compiled $(foreach dep,$(DEPENDENCIES),$(eval $(dep) = $(TARGETDIR)/$($(dep)_VER).done)) ################################################################################ # Default base config -CONFIG = --target=$(TARGET) \ +CONFIG = \ + --target=$(TARGET) \ --host=$(HOST) --build=$(BUILD) \ - --prefix=$(PREFIX) + --prefix=$(PREFIX) \ + # CMAKE_CONFIG = -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(PREFIX) @@ -357,7 +188,6 @@ BUILDPAR = -j$(NUM_CORES) MAKECMD = INSTALLCMD = install - declare_tools = CC$(1)=$(2)gcc LD$(1)=$(2)ld AR$(1)=$(2)ar AS$(1)=$(2)as RANLIB$(1)=$(2)ranlib CXX$(1)=$(2)g++ OBJDUMP$(1)=$(2)objdump ifeq ($(HOST),$(BUILD)) @@ -376,10 +206,10 @@ TOOLS ?= $(call declare_tools,_FOR_TARGET,$(TARGET)-) # CFLAG_ to most likely -m32. define mk_bfd $$(info Libs for $(1)) - $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile \ - : CFLAGS += $$(CFLAGS_$(1)) - $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile \ - : LIBDIRS = --libdir=$(TARGETDIR)/$(1) + $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile: \ + CFLAGS += $$(CFLAGS_$(1)) + $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile: \ + LIBDIRS = --libdir=$(TARGETDIR)/$(1) BFDLIB += $$(TARGETDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1)).done BFDMAKES += $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile @@ -389,18 +219,18 @@ endef $(foreach l,$(LIBDIRS),$(eval $(call mk_bfd,$(l)))) # Only build these two libs. -$(BFDLIB) : MAKECMD = all-libiberty all-bfd -$(BFDLIB) : INSTALLCMD = install-libiberty install-bfd +$(BFDLIB): MAKECMD = all-libiberty all-bfd +$(BFDLIB): INSTALLCMD = install-libiberty install-bfd # Building targets libbfd + libiberty. HOST==TARGET, i.e not # for a cross env. -$(BFDMAKES) : CONFIG = --target=$(TARGET) \ +$(BFDMAKES): CONFIG = --target=$(TARGET) \ --host=$(TARGET) --build=$(BUILD) \ --prefix=$(TARGETDIR) \ --with-sysroot=$(SYSROOT) \ $(LIBDIRS) -$(BFDMAKES) : TOOLS = $(call declare_tools,_FOR_TARGET,$(TARGET)-) $(call declare_tools,,$(TARGET)-) +$(BFDMAKES): TOOLS = $(call declare_tools,_FOR_TARGET,$(TARGET)-) $(call declare_tools,,$(TARGET)-) ################################################################################ @@ -410,50 +240,52 @@ $(GCC) \ $(MPFR) \ $(MPC) \ $(BFDMAKES) \ - $(CCACHE) : ENVS += $(TOOLS) + $(CCACHE): ENVS += $(TOOLS) # libdir to work around hateful bfd stuff installing into wrong dirs... # ensure we have 64 bit bfd support in the HOST library. I.e our # compiler on i686 will know 64 bit symbols, BUT later # we build just the libs again for TARGET, then with whatever the arch # wants. -$(BUILDDIR)/$(BINUTILS_VER)/Makefile : CONFIG += --enable-64-bit-bfd --libdir=$(PREFIX)/$(word 1,$(LIBDIRS)) +$(BUILDDIR)/$(BINUTILS_VER)/Makefile: CONFIG += --enable-64-bit-bfd --libdir=$(PREFIX)/$(word 1,$(LIBDIRS)) ifeq ($(filter $(ARCH), s390x riscv64 ppc64le), ) # gold compiles but cannot link properly on s390x @ gcc 13.2 and Fedore 41 # gold is not available for riscv64 and ppc64le, # and subsequent linking will fail if we try to enable it. - LINKER_CONFIG := --enable-gold=default + LINKER_CONFIG_ENABLE_GOLD := --enable-gold=default +endif + +ifeq ($(filter riscv64 ppc64le s390x armhfp, $(ARCH)), ) + ENABLE_MULTILIB := --enable-multilib endif # Makefile creation. Simply run configure in build dir. # Setting CFLAGS to -O2 generates a much faster ld. $(BFDMAKES) \ -$(BUILDDIR)/$(BINUTILS_VER)/Makefile \ - : $(BINUTILS_CFG) +$(BUILDDIR)/$(BINUTILS_VER)/Makefile: $(BINUTILS_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) CFLAGS="-O2 $(CFLAGS)" \ $(BINUTILS_CFG) \ $(CONFIG) \ - $(LINKER_CONFIG) \ + $(LINKER_CONFIG_ENABLE_GOLD) \ --with-sysroot=$(SYSROOT) \ --disable-nls \ --program-prefix=$(TARGET)- \ - --enable-multilib \ + $(ENABLE_MULTILIB) \ --enable-threads \ --enable-plugins \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(MPFR_VER)/Makefile \ - : $(MPFR_CFG) +$(BUILDDIR)/$(MPFR_VER)/Makefile: $(MPFR_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) CFLAGS="$(CFLAGS)" \ $(MPFR_CFG) \ $(CONFIG) \ @@ -463,12 +295,11 @@ $(BUILDDIR)/$(MPFR_VER)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(GMP_VER)/Makefile \ - : $(GMP_CFG) +$(BUILDDIR)/$(GMP_VER)/Makefile: $(GMP_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) CFLAGS="$(CFLAGS)" \ $(GMP_CFG) \ --host=$(HOST) --build=$(BUILD) \ @@ -480,12 +311,11 @@ $(BUILDDIR)/$(GMP_VER)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(MPC_VER)/Makefile \ - : $(MPC_CFG) +$(BUILDDIR)/$(MPC_VER)/Makefile: $(MPC_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) CFLAGS="$(CFLAGS)" \ $(MPC_CFG) \ $(CONFIG) \ @@ -499,14 +329,18 @@ $(BUILDDIR)/$(MPC_VER)/Makefile \ # Only valid if glibc target -> linux # proper destructor handling for c++ ifneq (,$(findstring linux,$(TARGET))) - $(BUILDDIR)/$(GCC_VER)/Makefile : CONFIG += --enable-__cxa_atexit + $(BUILDDIR)/$(GCC_VER)/Makefile: CONFIG += --enable-__cxa_atexit endif +$(BUILDDIR)/$(GCC_VER)/Makefile: CONFIG += --disable-libgomp ifeq ($(ARCH), armhfp) - $(BUILDDIR)/$(GCC_VER)/Makefile : CONFIG += --with-float=hard + $(BUILDDIR)/$(GCC_VER)/Makefile: CONFIG += --with-float=hard +endif +ifeq ($(ARCH), riscv64) + $(BUILDDIR)/$(GCC_VER)/Makefile: CONFIG += --disable-libsanitizer endif -ifneq ($(filter riscv64 ppc64le s390x, $(ARCH)), ) +ifneq ($(filter riscv64 ppc64le s390x armhfp, $(ARCH)), ) # We only support 64-bit on these platforms anyway CONFIG += --disable-multilib endif @@ -518,12 +352,11 @@ endif # skip native language. # and link and assemble with the binutils we created # earlier, so --with-gnu* -$(BUILDDIR)/$(GCC_VER)/Makefile \ - : $(GCC_CFG) +$(BUILDDIR)/$(GCC_VER)/Makefile: $(GCC_CFG) $(info Configuring $@. Log in $(@D)/log.config) mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) $(GCC_CFG) $(EXTRA_CFLAGS) \ $(CONFIG) \ --with-sysroot=$(SYSROOT) \ @@ -540,12 +373,12 @@ $(BUILDDIR)/$(GCC_VER)/Makefile \ @echo 'done' # need binutils for gcc -$(GCC) : $(BINUTILS) +$(GCC): $(BINUTILS) # as of 4.3 or so need these for doing config -$(BUILDDIR)/$(GCC_VER)/Makefile : $(GMP) $(MPFR) $(MPC) -$(MPFR) : $(GMP) -$(MPC) : $(GMP) $(MPFR) +$(BUILDDIR)/$(GCC_VER)/Makefile: $(GMP) $(MPFR) $(MPC) +$(MPFR): $(GMP) +$(MPC): $(GMP) $(MPFR) ################################################################################ # Build gdb but only where host and target match @@ -554,7 +387,7 @@ ifeq ($(HOST), $(TARGET)) $(info Configuring $@. Log in $(@D)/log.config) mkdir -p $(@D) ( \ - cd $(@D) ; \ + cd $(@D); \ $(PATHPRE) $(ENVS) CFLAGS="$(CFLAGS)" $(GDB_CFG) \ $(CONFIG) \ --with-sysroot=$(SYSROOT) \ @@ -574,14 +407,12 @@ endif ################################################################################ # very straightforward. just build a ccache. it is only for host. -$(BUILDDIR)/$(CCACHE_VER)/Makefile \ - : $(CCACHE_SRC_MARKER) +$(BUILDDIR)/$(CCACHE_VER)/Makefile: $(CCACHE_SRC_MARKER) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @( \ - cd $(@D) ; \ - $(PATHPRE) $(ENVS) $(CCACHE_CFG) \ - $(CCACHE_CONFIG) \ + cd $(@D); \ + $(PATHPRE) $(ENVS) $(CCACHE_CFG) $(CCACHE_CONFIG) \ ) > $(@D)/log.config 2>&1 @echo 'done' @@ -590,13 +421,12 @@ GCC_PATCHED = $(TARGETDIR)/gcc-patched ################################################################################ # For some reason cpp is not created as a target-compiler ifeq ($(HOST),$(TARGET)) - $(GCC_PATCHED) : $(GCC) link_libs + $(GCC_PATCHED): $(LINK_LIBS_MARKER) @echo -n 'Creating compiler symlinks...' @for f in cpp; do \ - if [ ! -e $(PREFIX)/bin/$(TARGET)-$$f ]; \ - then \ + if [ ! -e $(PREFIX)/bin/$(TARGET)-$$f ]; then \ cd $(PREFIX)/bin && \ - ln -fs $$f $(TARGET)-$$f ; \ + ln -fs $$f $(TARGET)-$$f; \ fi \ done @touch $@ @@ -606,19 +436,21 @@ ifeq ($(HOST),$(TARGET)) # Ugly at best. Seems that when we compile host->host compiler, that are NOT # the BUILD compiler, the result will not try searching for libs in package root. # "Solve" this by create links from the target libdirs to where they are. - link_libs: + $(LINK_LIBS_MARKER): $(GCC) @echo -n 'Creating library symlinks...' - @$(foreach l,$(LIBDIRS), \ - for f in `cd $(PREFIX)/$(l) && ls`; do \ - if [ ! -e $(TARGETDIR)/$(l)/$$f ]; then \ - mkdir -p $(TARGETDIR)/$(l) && \ - cd $(TARGETDIR)/$(l)/ && \ - ln -fs $(if $(findstring /,$(l)),../,)../../$(l)/$$f $$f; \ - fi \ - done;) + @for l in $(LIBDIRS); do \ + for f in `cd $(PREFIX)/$$l && ls`; do \ + if [ ! -e $(TARGETDIR)/$$l/$$f ]; then \ + mkdir -p $(TARGETDIR)/$$l && \ + cd $(TARGETDIR)/$$l/ && \ + ln -fs ../../$$l/$$f $$f; \ + fi \ + done \ + done + @touch $@ @echo 'done' else - $(GCC_PATCHED) : + $(GCC_PATCHED): @echo 'done' endif @@ -628,7 +460,7 @@ endif # make install. # Use path to our build hosts cross tools # Always need to build cross tools for build host self. -$(TARGETDIR)/%.done : $(BUILDDIR)/%/Makefile +$(TARGETDIR)/%.done: $(BUILDDIR)/%/Makefile $(info Building $(basename $@). Log in $( $(&1 @echo -n 'installing...' @@ -646,26 +478,20 @@ $(PREFIX)/devkit.info: echo '# This file describes to configure how to interpret the contents of this' >> $@ echo '# devkit' >> $@ echo '' >> $@ - echo 'DEVKIT_NAME="$(GCC_VER) - $(LINUX_VERSION)"' >> $@ + echo 'DEVKIT_NAME="$(GCC_VER) - $(BASE_OS_DESCRIPTION)"' >> $@ echo 'DEVKIT_TOOLCHAIN_PATH="$$DEVKIT_ROOT/bin"' >> $@ echo 'DEVKIT_SYSROOT="$$DEVKIT_ROOT/$(TARGET)/sysroot"' >> $@ echo 'DEVKIT_EXTRA_PATH="$$DEVKIT_ROOT/bin"' >> $@ ################################################################################ # Copy these makefiles into the root of the kit -$(PREFIX)/Makefile: ./Makefile - rm -rf $@ - cp $< $@ -$(PREFIX)/Tools.gmk: ./Tools.gmk - rm -rf $@ - cp $< $@ +THESE_MAKEFILES := Makefile $(wildcard *.gmk) patches +COPIED_MAKEFILES := $(addprefix $(PREFIX)/, $(THESE_MAKEFILES)) -$(PREFIX)/Tars.gmk: ./Tars.gmk +$(PREFIX)/%: ./% rm -rf $@ - cp $< $@ - -THESE_MAKEFILES := $(PREFIX)/Makefile $(PREFIX)/Tools.gmk $(PREFIX)/Tars.gmk + cp -r $< $@ ################################################################################ @@ -682,9 +508,14 @@ ifeq ($(TARGET), $(HOST)) @echo 'Creating missing $* soft link' ln -s $(TARGET)-$* $@ - MISSING_LINKS := $(addprefix $(PREFIX)/bin/, \ + MISSING_LINK_NAMES = \ addr2line ar as c++ c++filt dwp elfedit g++ gcc gcc-$(GCC_VER_ONLY) gprof ld ld.bfd \ - ld.gold nm objcopy objdump ranlib readelf size strings strip) + nm objcopy objdump ranlib readelf size strings strip + ifneq ($(LINKER_CONFIG_ENABLE_GOLD), ) + MISSING_LINK_NAMES += ld.gold + endif + + MISSING_LINKS := $(addprefix $(PREFIX)/bin/, $(MISSING_LINK_NAMES)) endif # Add link to work around "plugin needed to handle lto object" (JDK-8344272) @@ -697,17 +528,14 @@ MISSING_LINKS += $(PREFIX)/lib/bfd-plugins/liblto_plugin.so ################################################################################ -bfdlib : $(BFDLIB) -binutils : $(BINUTILS) -rpms : $(RPMS) -libs : $(LIBS) -sysroot : rpms libs -gcc : sysroot $(GCC) $(GCC_PATCHED) -gdb : $(GDB) -all : binutils gcc bfdlib $(PREFIX)/devkit.info $(MISSING_LINKS) $(SYSROOT_LINKS) \ - $(THESE_MAKEFILES) gdb +bfdlib: $(BFDLIB) +binutils: $(BINUTILS) +gcc: $(GCC) $(GCC_PATCHED) +gdb: $(GDB) +all: binutils gcc bfdlib gdb \ + $(MISSING_LINKS) $(COPIED_MAKEFILES) $(PREFIX)/devkit.info # this is only built for host. so separate. -ccache : $(CCACHE) +ccache: $(CCACHE) -.PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot +.PHONY: bfdlib binutils gcc gdb all ccache