summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2021-10-29 20:17:48 +0200
committerToni Uhlig <matzeton@googlemail.com>2021-10-29 23:55:28 +0200
commit67f055022462ddfa416b8ff68874326138ca4978 (patch)
tree51a82a7bfdba9b45ccd1e80893dd139959262378
parent6949e0bc14ae91914ab42f393f5ac4096fbb17a8 (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.yml1
-rw-r--r--.gitignore12
-rw-r--r--.gitlab-ci.yml33
-rw-r--r--Makefile5
-rw-r--r--Makefile.deps82
-rw-r--r--Makefile.inc32
-rw-r--r--Makefile.native.inc128
m---------mingw-w64-build28
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/
diff --git a/.gitignore b/.gitignore
index 6268bcf..40f8e1c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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:
diff --git a/Makefile b/Makefile
index de851e0..7d1a022 100644
--- a/Makefile
+++ b/Makefile
@@ -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