diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2021-10-29 20:17:48 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2021-10-29 23:55:28 +0200 |
commit | 67f055022462ddfa416b8ff68874326138ca4978 (patch) | |
tree | 51a82a7bfdba9b45ccd1e80893dd139959262378 | |
parent | 6949e0bc14ae91914ab42f393f5ac4096fbb17a8 (diff) |
Support HOSTCC builds for EASTL.
* set parallel jobs for mingw-w64-build via Makefile.deps
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r-- | .circleci/config.yml | 1 | ||||
-rw-r--r-- | .gitignore | 12 | ||||
-rw-r--r-- | .gitlab-ci.yml | 33 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | Makefile.deps | 82 | ||||
-rw-r--r-- | Makefile.inc | 32 | ||||
-rw-r--r-- | Makefile.native.inc | 128 | ||||
m--------- | mingw-w64-build | 28 |
8 files changed, 253 insertions, 68 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml index 22934cd..655a282 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,5 +19,6 @@ jobs: make install \ WERROR=1 Q= \ CC=/usr/bin/x86_64-w64-mingw32-gcc \ + CXX=/usr/bin/x86_64-w64-mingw32-g++ \ DDK_INCLUDE_DIR=/usr/x86_64-w64-mingw32/include/ddk \ DESTDIR=_install/ @@ -1,7 +1,9 @@ /include /codesign-* -/.deps-built -/EASTL-build -/x86_64-w64-mingw32 -*.o -*.opp +/EASTL-build/ +/EASTL-native-build/ +/w64-mingw32-sysroot/ +/*.o +/*.opp +/CRT/*.o +/CRT/*.opp diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 256bef6..a844f50 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ stages: cache: key: toolchain paths: - - x86_64-w64-mingw32/ + - w64-mingw32-sysroot/ before_script: - export DEBIAN_FRONTEND=noninteractive @@ -19,12 +19,12 @@ before_script: makedeps: script: - - if [ "x${FORCE_TOOLCHAIN_REBUILD:-}" != "x" ]; then rm -rf x86_64-w64-mingw32/; fi + - if [ "x${FORCE_TOOLCHAIN_REBUILD:-}" != "x" ]; then rm -rf w64-mingw32-sysroot/; fi - pwd - > - { test -x x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc && \ - test -x x86_64-w64-mingw32/bin/x86_64-w64-mingw32-g++; } || \ - { make deps || { cat bld/build.log; false; }; } + { test -x w64-mingw32-sysroot/x86_64/bin/x86_64-w64-mingw32-gcc && \ + test -x w64-mingw32-sysroot/x86_64/bin/x86_64-w64-mingw32-g++; } || \ + { make -C . -f Makefile.deps -j "${BUILDJOBS:-4}" || { cat bld/build.log; false; }; } stage: deps only: - master @@ -34,8 +34,7 @@ makedeps-again: - git clean -df . - git clean -dfX . - git checkout . - - > - make deps || { cat bld/build.log; false; } + - make -C . -f Makefile.deps -j "${BUILDJOBS:-4}" || { cat bld/build.log; false; } stage: deps only: - master @@ -43,18 +42,16 @@ makedeps-again: build: script: - - ls -alh x86_64-w64-mingw32/ - - ls -alh x86_64-w64-mingw32/bin/ + - ls -alh w64-mingw32-sysroot/x86_64/ + - ls -alh w64-mingw32-sysroot/x86_64/bin/ - pwd - - > - make all WERROR=1 Q= \ - CC=x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc \ - DDK_INCLUDE_DIR=x86_64-w64-mingw32/x86_64-w64-mingw32/include/ddk - - > - make install WERROR=1 Q= \ - CC=x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc \ - DDK_INCLUDE_DIR=x86_64-w64-mingw32/x86_64-w64-mingw32/include/ddk \ - DESTDIR=_install/ + - mkdir -p ./mingw-w64-build && touch ./mingw-w64-build/mingw-w64-build + - touch -m ./w64-mingw32-sysroot/x86_64/bin/x86_64-w64-mingw32-gcc + - make -C . -f Makefile.deps -j1 all BUILD_NATIVE= WERROR=1 Q= + - make -j1 all WERROR=1 Q= + - make -j1 install WERROR=1 Q= DESTDIR=_install + - ls -alh _install + - make -C . -f Makefile.deps -j1 all BUILD_NATIVE=1 WERROR=1 Q= artifacts: expire_in: 1 week paths: @@ -13,13 +13,10 @@ DPP_ROOT = . INSTALL = install -all: deps $(1_TARGET) $(2_TARGET) $(3_TARGET) +all: $(1_TARGET) $(2_TARGET) $(3_TARGET) include $(DPP_ROOT)/Makefile.inc -deps: - $(call CHECK_DPP) - %.o: %.c $(call BUILD_C_OBJECT,$<,$@) diff --git a/Makefile.deps b/Makefile.deps index 0dabe15..d3bc94d 100644 --- a/Makefile.deps +++ b/Makefile.deps @@ -1,17 +1,39 @@ DPP_ROOT = . -ACTIVATE_SH = ./x86_64-w64-mingw32/activate.sh +ACTIVATE_SH = ./w64-mingw32-sysroot/x86_64/activate.sh + +MAKE_PID := $(shell echo $$PPID) +JOBS := $(shell ps T | sed -n 's/.*$(MAKE_PID).*$(MAKE).* \(-j\|--jobs=\) *\([0-9][0-9]*\).*/\2/p') + +ifndef JOBS +JOBS := 1 +endif + +ifndef BUILD_NATIVE include Makefile.inc +else +include Makefile.native.inc +endif all: deps -%.o: %.c - $(Q)$(CC) -std=c99 $(CFLAGS) -c $< -o $@ +$(DPP_ROOT)/CRT/kcrt$(NAME_SUFFIX).o: $(CC) $(DPP_ROOT)/CRT/kcrt.c + $(Q)$(CC) -std=c99 $(CFLAGS) -c CRT/kcrt.c -o $@ @echo 'CC $@' -%.opp: %.cpp - $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c $< -o $@ +$(DPP_ROOT)/CRT/kcrt$(NAME_SUFFIX).opp: $(CXX) $(DPP_ROOT)/CRT/kcrt.cpp + $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c CRT/kcrt.cpp -o $@ + @echo 'CXX $@' + +$(DPP_ROOT)/CRT/ucrt$(NAME_SUFFIX).opp: $(CXX) $(DPP_ROOT)/CRT/ucrt.cpp + $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c CRT/ucrt.cpp -o $@ @echo 'CXX $@' +$(DPP_ROOT)/CRT/DriverThread$(NAME_SUFFIX).opp: $(CXX) $(DPP_ROOT)/CRT/DriverThread.cpp $(DPP_ROOT)/CRT/DriverThread.hpp + $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c CRT/DriverThread.cpp -o $@ + @echo 'CXX $@' + +ifndef BUILD_NATIVE + deps-print-local-notice: $(CC) ifeq ($(CC),$(LOCAL_MINGW64_CC)) @echo @@ -35,18 +57,22 @@ endif $(LOCAL_MINGW64_CC): $(LOCAL_MINGW64_BUILD_SCRIPT) ifeq ($(CC),$(LOCAL_MINGW64_CC)) @echo - @echo "----------------------------------------------------------------------------------------" - @echo "-- ./x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc does not exist, building toolchain --" - @echo "----------------------------------------------------------------------------------------" + @echo "------------------------------------------------------------------------------------------------" + @echo "-- ./w64-mingw32-sysroot/x86_64/bin/x86_64-w64-mingw32-gcc does not exist, building toolchain --" + @echo "------------------------------------------------------------------------------------------------" @echo - env -i ./mingw-w64-build/mingw-w64-build x86_64 + env -i ./mingw-w64-build/mingw-w64-build --root-path="$(shell realpath ./w64-mingw32-sysroot)" --disable-threads --jobs $(JOBS) x86_64 @echo '#!/usr/bin/env bash' >$(ACTIVATE_SH) @echo >>$(ACTIVATE_SH) @echo 'MYDIR="$$(realpath $$(dirname $${BASH_SOURCE[0]}))"' >>$(ACTIVATE_SH) - @echo 'export PATH="$${MYDIR}/x86_64-w64-mingw32/bin:$${MYDIR}/bin:${PATH}"' >>$(ACTIVATE_SH) + @echo 'export PATH="$${MYDIR}/w64-mingw32-sysroot/x86_64/bin:$${MYDIR}/bin:${PATH}"' >>$(ACTIVATE_SH) @chmod +x $(ACTIVATE_SH) endif +ifeq ($(CC),$(LOCAL_MINGW64_CC)) +$(LOCAL_MINGW64_CXX): $(LOCAL_MINGW64_CC) +endif + deps-build: \ $(LOCAL_MINGW64_BUILD_SCRIPT) \ $(LOCAL_MINGW64_CC) \ @@ -59,9 +85,9 @@ deps-build: \ deps: deps-print-local-notice deps-build -$(EASTL_STATIC_LIB): $(EASTL_DEPS) - mkdir -p EASTL-build - cd EASTL-build && \ +$(EASTL_STATIC_LIB): $(CXX) $(EASTL_DEPS) + mkdir -p $(EASTL_BUILDDIR) + cd $(EASTL_BUILDDIR) && \ $(CMAKE) ../EASTL \ -DCMAKE_CXX_COMPILER="$(realpath $(CXX))" \ -DCMAKE_SYSTEM_NAME="Windows" \ @@ -79,10 +105,36 @@ distclean: clean rm -rf $(LOCAL_MINGW64_BUILD_DIR) git submodule deinit --all -clean: +clean: $(EASTL_STATIC_LIB) rm -f $(DRIVER_CRT) $(DRIVER_CRTPLUSPLUS) $(USER_CRT) $(EASTL_STATIC_LIB) rm -f $(DRIVER_ADDITIONAL_OBJS) - rm -rf EASTL-build + rm -rf $(EASTL_BUILDDIR) + +else + +deps-build: \ + $(EASTL_STATIC_LIB) \ + $(USER_CRT) + +deps: deps-build + +$(EASTL_STATIC_LIB): $(CXX) $(EASTL_DEPS) + mkdir -p $(EASTL_BUILDDIR) + cd $(EASTL_BUILDDIR) && \ + $(CMAKE) ../EASTL \ + -DCMAKE_CXX_COMPILER="$(realpath $(CXX))" \ + -DCMAKE_SYSTEM_NAME="Linux" \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ + -DCMAKE_CXX_FLAGS='$(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS)' && \ + $(MAKE) $(CMAKE_Q) + +distclean: clean + +clean: $(EASTL_STATIC_LIB) + rm -f $(USER_CRT) $(EASTL_STATIC_LIB) + rm -rf $(EASTL_BUILDDIR) + +endif .PHONY: all deps-print-local-notice deps-build deps distclean clean .DEFAULT_GOAL := all diff --git a/Makefile.inc b/Makefile.inc index 9d59196..2f99ffd 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -2,21 +2,30 @@ ifndef DPP_ROOT $(error DPP_ROOT is undefined) endif +ifdef BUILD_NATIVE +$(error BUILD_NATIVE is defined, include Makefile.native.inc) +endif + +NAME_SUFFIX := + Q = @ ifeq ($(Q),) CMAKE_Q = VERBOSE=1 endif DPP_ROOT = $(realpath .) LOCAL_MINGW64_BUILD_SCRIPT := $(DPP_ROOT)/mingw-w64-build/mingw-w64-build -LOCAL_MINGW64_BUILD_DIR := $(DPP_ROOT)/x86_64-w64-mingw32 +LOCAL_MINGW64_BUILD_DIR := $(DPP_ROOT)/w64-mingw32-sysroot/x86_64 LOCAL_MINGW64_CC := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-gcc +LOCAL_MINGW64_CXX := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-g++ SIGNTOOL := osslsigncode SIGNTOOL_PREFIX := codesign +DDK_GLOBAL_DEPS := deps $(LOCAL_MINGW64_BUILD_SCRIPT) $(LOCAL_MINGW64_BUILD_DIR) $(LOCAL_MINGW64_CC) $(LOCAL_MINGW64_CXX) + INSTALL = install CMAKE = cmake CC = $(LOCAL_MINGW64_CC) -CXX = $(dir $(CC))x86_64-w64-mingw32-g++ +CXX = $(LOCAL_MINGW64_CXX) DDK_INCLUDE_DIR = $(dir $(CC))../x86_64-w64-mingw32/include/ddk CFLAGS := -Wall -Wextra -Wno-sign-compare -Wno-strict-aliasing \ -m64 -fPIC -fvisibility=hidden \ @@ -24,9 +33,11 @@ CFLAGS := -Wall -Wextra -Wno-sign-compare -Wno-strict-aliasing \ -I$(DPP_ROOT)/CRT -I$(DDK_INCLUDE_DIR) \ -D__INTRINSIC_DEFINED_InterlockedBitTestAndSet \ -D__INTRINSIC_DEFINED_InterlockedBitTestAndReset + ifneq ($(WERROR),) CFLAGS += -Werror endif + CXXFLAGS := -fno-exceptions -fno-rtti -fuse-cxa-atexit EASTL_CXXFLAGS := -I$(DPP_ROOT)/EASTL/include -I$(DPP_ROOT)/EASTL/test/packages/EABase/include/Common \ -DEASTL_THREAD_SUPPORT_AVAILABLE=0 \ @@ -51,19 +62,20 @@ DRIVER_LIBS := -lntoskrnl -lhal USER_LDFLAGS := -Wl,--dynamicbase -Wl,--nxcompat -Wl,--gc-sections DRIVER_ADDITIONAL_DEPS := $(DPP_ROOT)/CRT/DriverThread.cpp $(DPP_ROOT)/CRT/DriverThread.hpp -DRIVER_ADDITIONAL_OBJS := $(DPP_ROOT)/CRT/DriverThread.opp +DRIVER_ADDITIONAL_OBJS := $(DPP_ROOT)/CRT/DriverThread$(NAME_SUFFIX).opp EASTL_DEPS := $(wildcard $(DPP_ROOT)/EASTL/source/*.cpp) $(wildcard $(DPP_ROOT)/EASTL/include/EASTL/*.h) -EASTL_STATIC_LIB := $(DPP_ROOT)/EASTL-build/libEASTL.a +EASTL_BUILDDIR := EASTL-build +EASTL_STATIC_LIB := $(DPP_ROOT)/$(EASTL_BUILDDIR)/libEASTL.a DRIVER_CRT_DEPS := $(DPP_ROOT)/CRT/kcrt.c -DRIVER_CRT := $(DPP_ROOT)/CRT/kcrt.o +DRIVER_CRT := $(DPP_ROOT)/CRT/kcrt$(NAME_SUFFIX).o DRIVER_CRTPLUSPLUS_DEPS := $(DPP_ROOT)/CRT/kcrt.cpp $(DPP_ROOT)/CRT/kcrt.c -DRIVER_CRTPLUSPLUS := $(DPP_ROOT)/CRT/kcrt.opp $(DPP_ROOT)/CRT/kcrt.o +DRIVER_CRTPLUSPLUS := $(DPP_ROOT)/CRT/kcrt$(NAME_SUFFIX).opp $(DPP_ROOT)/CRT/kcrt$(NAME_SUFFIX).o USER_CRT_DEPS := $(DPP_ROOT)/CRT/ucrt.cpp -USER_CRT := $(DPP_ROOT)/CRT/ucrt.opp +USER_CRT := $(DPP_ROOT)/CRT/ucrt$(NAME_SUFFIX).opp is_set = \ $(if $1,, \ @@ -71,7 +83,7 @@ is_set = \ path_exists = \ $(if $(realpath $1),, \ - $(error ERROR: $1 does not exist, run `make -C $(DPP_ROOT) deps` first.)) + $(error ERROR: $1 does not exist, run `make -C $(DPP_ROOT) -f Makefile.deps` first.)) define CHECK_REQUIRED_PATHS $(call path_exists,$(CC)) @@ -190,7 +202,3 @@ define INSTALL_EXEC_SIGN done $(INSTALL) "$(DPP_ROOT)/$(SIGNTOOL_PREFIX)-ca-cert.pem" '$(DESTDIR)/$(SIGNTOOL_PREFIX)-ca-cert.crt' endef - -define CHECK_DPP - $(MAKE) -C $(DPP_ROOT) -f Makefile.deps all -endef diff --git a/Makefile.native.inc b/Makefile.native.inc new file mode 100644 index 0000000..c10e34e --- /dev/null +++ b/Makefile.native.inc @@ -0,0 +1,128 @@ +ifndef DPP_ROOT +$(error DPP_ROOT is undefined) +endif + +ifndef BUILD_NATIVE +$(error BUILD_NATIVE is _NOT_ defined, include Makefile.inc) +endif + +NAME_SUFFIX := -native + +Q = @ +ifeq ($(Q),) +CMAKE_Q = VERBOSE=1 +endif +DPP_ROOT = $(realpath .) + +INSTALL = install +CMAKE = cmake +CC = /usr/bin/cc +CXX = /usr/bin/c++ +CFLAGS := -Wall -Wextra -Wno-sign-compare -Wno-strict-aliasing \ + -m64 -fPIC -fvisibility=hidden \ + -ffunction-sections -fdata-sections -fno-builtin -ffreestanding \ + -I$(DPP_ROOT)/CRT +ifneq ($(WERROR),) +CFLAGS += -Werror +endif +CXXFLAGS := -fno-exceptions -fno-rtti -fuse-cxa-atexit +EASTL_CXXFLAGS := -I$(DPP_ROOT)/EASTL/include -I$(DPP_ROOT)/EASTL/test/packages/EABase/include/Common \ + -DEASTL_THREAD_SUPPORT_AVAILABLE=0 \ + -DEASTL_EXCEPTIONS_ENABLED=0 \ + -DEASTL_ASSERT_ENABLED=0 \ + -DEA_COMPILER_NO_EXCEPTIONS=1 \ + -DEA_COMPILER_MANAGED_CPP=1 \ + -Wno-unknown-pragmas \ + -Wno-deprecated-copy +USER_LDFLAGS := -Wl,--gc-sections + +EASTL_DEPS := $(wildcard $(DPP_ROOT)/EASTL/source/*.cpp) $(wildcard $(DPP_ROOT)/EASTL/include/EASTL/*.h) +EASTL_BUILDDIR := EASTL-native-build +EASTL_STATIC_LIB := $(DPP_ROOT)/$(EASTL_BUILDDIR)/libEASTL.a + +USER_CRT_DEPS := $(DPP_ROOT)/CRT/ucrt.cpp +USER_CRT := $(DPP_ROOT)/CRT/ucrt$(NAME_SUFFIX).opp + +is_set = \ + $(if $1,, \ + $(error ERROR: $(if $2,$2))) + +path_exists = \ + $(if $(realpath $1),, \ + $(error ERROR: $1 does not exist, run `make -C $(DPP_ROOT) deps` first.)) + +define CHECK_REQUIRED_PATHS + $(call path_exists,$(CC)) + $(call path_exists,$(CXX)) + $(call path_exists,$(EASTL_STATIC_LIB)) + $(call path_exists,$(USER_CRT)) +endef + +define BUILD_C_OBJECT + $(call CHECK_REQUIRED_PATHS) + $(call is_set,$(1),First argument: Source file missing) + $(call is_set,$(2),Second argument: Output object file missing) + $(Q)$(CC) -std=c99 $(CFLAGS) -c $(1) -o $(2) + @echo 'CC $(2)' +endef + +define BUILD_CPP_OBJECT + $(call CHECK_REQUIRED_PATHS) + $(call is_set,$(1),First argument: Source file missing) + $(call is_set,$(2),Second argument: Output object file missing) + $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c $(1) -o $(2) + @echo 'CXX $@' +endef + +define LINK_C_KERNEL_TARGET + $(error BUILD_NATIVE does not support kernel targets.) +endef + +define LINK_C_USER_TARGET + $(call CHECK_REQUIRED_PATHS) + $(call is_set,$(1),First argument: Object files missing) + $(call is_set,$(2),Second argument: Output object file missing) + $(Q)$(CC) \ + $(CFLAGS) \ + -o '$(2)' \ + $(1) \ + $(EASTL_STATIC_LIB) \ + @echo 'LD $(2)' +endef + +define LINK_CPP_KERNEL_TARGET + $(error BUILD_NATIVE does not support kernel targets.) +endef + +define LINK_CPP_USER_TARGET + $(call CHECK_REQUIRED_PATHS) + $(call is_set,$(1),First argument: Object files missing) + $(call is_set,$(2),Second argument: Output object file missing) + $(Q)$(CXX) \ + $(CFLAGS) \ + $(CXXFLAGS) \ + $(EASTL_CXXFLAGS) \ + $(USER_LDFLAGS) \ + -o '$(2)' \ + $(1) \ + $(USER_CRT) \ + $(EASTL_STATIC_LIB) + @echo 'LD $(2)' +endef + +define INSTALL_EXEC + $(call is_set,$(1),First argument: Executables to install missing) + $(call is_set,$(DESTDIR),DESTDIR missing) + $(INSTALL) -d '$(DESTDIR)/' + for target in $(1); do \ + $(INSTALL) -s "$$target" '$(DESTDIR)'; \ + done +endef + +define INSTALL_EXEC_SIGN + $(error BUILD_NATIVE does not support code signing.) +endef + +define CHECK_DPP + $(MAKE) -C $(DPP_ROOT) -f Makefile.deps all +endef diff --git a/mingw-w64-build b/mingw-w64-build -Subproject 22d81ca8180ede401661557be81ee1b416f8422 +Subproject 4095ad70913a739eb704ccb33c4d1537d470113 |