aboutsummaryrefslogtreecommitdiff
path: root/Makefile.inc
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile.inc')
-rw-r--r--Makefile.inc291
1 files changed, 291 insertions, 0 deletions
diff --git a/Makefile.inc b/Makefile.inc
new file mode 100644
index 0000000..15a4bbb
--- /dev/null
+++ b/Makefile.inc
@@ -0,0 +1,291 @@
+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 .)
+ifeq ($(LOCAL_MINGW64_CC),)
+LOCAL_MINGW64_BUILD_SCRIPT := $(DPP_ROOT)/mingw-w64-build/mingw-w64-build
+LOCAL_MINGW64_BUILD_DIR := $(DPP_ROOT)/mingw-w64-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++
+LOCAL_MINGW64_AR := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-ar
+LOCAL_MINGW64_RC := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-windres
+else
+ifeq ($(LOCAL_MINGW64_CXX),)
+$(error LOCAL_MINGW64_CC was set, missing required LOCAL_MINGW64_CXX)
+endif
+ifeq ($(LOCAL_MINGW64_RC),)
+$(error LOCAL_MINGW64_CC was set, missing required LOCAL_MINGW64_RC)
+endif
+endif
+
+ifeq ($(SIGNTOOL),)
+SIGNTOOL := osslsigncode
+endif
+
+ifeq ($(SIGNTOOL_PREFIX),)
+SIGNTOOL_PREFIX := codesign
+endif
+
+DDK_GLOBAL_DEPS := deps $(LOCAL_MINGW64_BUILD_SCRIPT) $(LOCAL_MINGW64_BUILD_DIR) $(LOCAL_MINGW64_CC) $(LOCAL_MINGW64_CXX) $(LOCAL_MINGW64_AR) $(LOCAL_MINGW64_RC)
+
+INSTALL = install
+SED = sed
+CMAKE = cmake
+CC = $(LOCAL_MINGW64_CC)
+CXX = $(LOCAL_MINGW64_CXX)
+AR = $(LOCAL_MINGW64_AR)
+RC = $(LOCAL_MINGW64_RC)
+DDK_INCLUDE_DIR = $(dir $(CC))../x86_64-w64-mingw32/include/ddk
+CFLAGS := -Wall -Wextra -Wno-sign-compare -Wno-strict-aliasing \
+ -m64 -fPIC -fvisibility=hidden \
+ -fno-builtin -ffreestanding \
+ -fno-stack-protector -mno-stack-arg-probe \
+ -I$(DPP_ROOT)/CRT -I$(DDK_INCLUDE_DIR) \
+ -D__INTRINSIC_DEFINED_InterlockedBitTestAndSet \
+ -D__INTRINSIC_DEFINED_InterlockedBitTestAndReset
+
+ifneq ($(WERROR),)
+CFLAGS += -Werror
+endif
+
+#PRINT_LDSCRIPT = -Wl,--verbose
+
+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_USER_CONFIG_HEADER="<eastl_user_config.hpp>" \
+ -DEASTL_EABASE_DISABLED=1 \
+ -DEASTL_THREAD_SUPPORT_AVAILABLE=0 \
+ -DEASTL_EXCEPTIONS_ENABLED=0 \
+ -DEASTL_ASSERT_ENABLED=0 \
+ -DEASTL_EASTDC_VSNPRINTF=0 \
+ -DEA_COMPILER_NO_EXCEPTIONS=1 \
+ -DEA_COMPILER_MANAGED_CPP=1 \
+ -Wno-unknown-pragmas \
+ -Wno-deprecated-copy
+DRIVER_LDFLAGS := -shared \
+ -Wl,--subsystem,native \
+ -Wl,--image-base,0x140000000 \
+ -Wl,--dynamicbase -Wl,--nxcompat \
+ -Wl,--file-alignment,0x200 \
+ -Wl,--section-alignment,0x1000 \
+ -Wl,--stack,0x100000 \
+ -Wl,--gc-sections \
+ -Wl,--exclude-all-symbols \
+ -Wl,--entry,_CRT_DriverEntry \
+ $(PRINT_LDSCRIPT) \
+ -nostartfiles -nodefaultlibs -nostdlib
+DRIVER_LIBS := -lntoskrnl -lhal
+USER_LDFLAGS := -Wl,--dynamicbase -Wl,--nxcompat -Wl,--gc-sections
+USER_LIBS :=
+
+EASTL_BUILDDIR := EASTL-build
+EASTL_STATIC_LIB := $(DPP_ROOT)/$(EASTL_BUILDDIR)/libEASTL.a
+
+LIBCRT_BUILD_DIR := $(DPP_ROOT)/CRT-build
+LIBCRT_OBJECTS := \
+ $(LIBCRT_BUILD_DIR)/kcrt$(NAME_SUFFIX).o
+LIBCXXRT_OBJECTS := \
+ $(LIBCRT_BUILD_DIR)/eastl_compat$(NAME_SUFFIX).opp \
+ $(LIBCRT_BUILD_DIR)/kcrt$(NAME_SUFFIX).opp \
+ $(LIBCRT_BUILD_DIR)/DriverThread$(NAME_SUFFIX).opp
+LIBCNATIVE_OBJECTS := \
+ $(LIBCRT_BUILD_DIR)/ntdll_zw_functions$(NAME_SUFFIX).o
+LIBCXXNATIVE_OBJECTS := \
+ $(LIBCRT_BUILD_DIR)/ntdll_zw_functions$(NAME_SUFFIX).opp
+
+LIBUSERCRT_OBJECTS := $(LIBCRT_BUILD_DIR)/ucrt$(NAME_SUFFIX).opp $(LIBCRT_BUILD_DIR)/eastl_compat$(NAME_SUFFIX).opp
+LIBCRT_STATIC_LIB := $(LIBCRT_BUILD_DIR)/libcrt.a
+LIBCXXRT_STATIC_LIB := $(LIBCRT_BUILD_DIR)/libcxxrt.a
+LIBCNATIVE_STATIC_LIB := $(LIBCRT_BUILD_DIR)/libcnative.a
+LIBCXXNATIVE_STATIC_LIB := $(LIBCRT_BUILD_DIR)/libcxxnative.a
+LIBUSERCRT_STATIC_LIB := $(LIBCRT_BUILD_DIR)/libusercrt.a
+
+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 is_set,$(CC),Makefile argument CC missing)
+ $(call is_set,$(CXX),Makefile argument CXX missing)
+ $(call is_set,$(RC),Makefile argument RC missing)
+ $(call is_set,$(AR),Makefile argument AR missing)
+ $(call is_set,$(DDK_INCLUDE_DIR),Makefile argument DDK_INCLUDE_DIR missing)
+ $(call is_set,$(EASTL_STATIC_LIB),Makefile argument EASTL_STATIC_LIB missing)
+ $(call is_set,$(LIBCRT_STATIC_LIB),Makefile argument LIBCRT_STATIC_LIB missing)
+ $(call is_set,$(LIBCXXRT_STATIC_LIB),Makefile argument LIBCXXRT_STATIC_LIB missing)
+ $(call is_set,$(LIBCNATIVE_STATIC_LIB),Makefile argument LIBCNATIVE_STATIC_LIB missing)
+ $(call is_set,$(LIBCXXNATIVE_STATIC_LIB),Makefile argument LIBCXXNATIVE_STATIC_LIB missing)
+ $(call is_set,$(LIBUSERCRT_STATIC_LIB),Makefile argument LIBUSERCRT_STATIC_LIB missing)
+ $(call path_exists,$(CC))
+ $(call path_exists,$(CXX))
+ $(call path_exists,$(RC))
+ $(call path_exists,$(AR))
+ $(call path_exists,$(DDK_INCLUDE_DIR))
+ $(call path_exists,$(EASTL_STATIC_LIB))
+ $(call path_exists,$(LIBCRT_STATIC_LIB))
+ $(call path_exists,$(LIBCXXRT_STATIC_LIB))
+ $(call path_exists,$(LIBCNATIVE_STATIC_LIB))
+ $(call path_exists,$(LIBCXXNATIVE_STATIC_LIB))
+ $(call path_exists,$(LIBUSERCRT_STATIC_LIB))
+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=gnu99 $(CFLAGS) $(CUSTOM_CFLAGS) $(CFLAGS_$(2)) -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) $(CUSTOM_CFLAGS) $(CFLAGS_$(2)) $(CXXFLAGS) $(EASTL_CXXFLAGS) $(CUSTOM_CXXFLAGS) -c $(1) -o $(2)
+ @echo 'CXX $@'
+endef
+
+define LINK_C_KERNEL_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) \
+ $(DRIVER_LDFLAGS) \
+ -Wl,-Map='$(2).map' \
+ -o '$(2)' \
+ $(1) \
+ $(LIBCRT_STATIC_LIB) \
+ $(LIBCNATIVE_STATIC_LIB) \
+ $(DRIVER_LIBS) \
+ $(LDFLAGS_$(2))
+ @echo 'LD $(2)'
+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) \
+ $(LIBUSERCRT_STATIC_LIB) \
+ $(LDFLAGS_$(2))
+ @echo 'LD $(2)'
+endef
+
+define LINK_CPP_KERNEL_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) \
+ $(DRIVER_LDFLAGS) \
+ -Wl,-Map='$(2).map' \
+ -o '$(2)' \
+ $(1) \
+ $(EASTL_STATIC_LIB) \
+ $(LIBCRT_STATIC_LIB) \
+ $(LIBCXXNATIVE_STATIC_LIB) \
+ $(LIBCXXRT_STATIC_LIB) \
+ $(DRIVER_LIBS) \
+ $(LDFLAGS_$(2))
+ @echo 'LD $(2)'
+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) \
+ $(EASTL_STATIC_LIB) \
+ $(LIBUSERCRT_STATIC_LIB) \
+ $(USER_LIBS) \
+ $(LDFLAGS_$(2))
+ @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 --strip-program='$(dir $(CC))/x86_64-w64-mingw32-strip' "$$target" '$(DESTDIR)'; \
+ done
+endef
+
+define INSTALL_EXEC_SIGN
+ $(call is_set,$(1),First argument: Executables to install missing)
+ $(call is_set,$(DESTDIR),DESTDIR missing)
+ $(MAKE) -C '$(DPP_ROOT)' -f Makefile.deps $(SIGNTOOL_PREFIX)
+ $(INSTALL) -d '$(DESTDIR)/'
+ test -x '$(shell which $(SIGNTOOL))' || { \
+ printf '\n *** %s ***\n\n' "$(SIGNTOOL) does not exist / not in your PATH / not executable."; \
+ false; \
+ }
+ for target in $(1); do \
+ rm -f "$(DESTDIR)/$$target"; \
+ $(dir $(CC))/x86_64-w64-mingw32-strip -s "$$target"; \
+ $(SIGNTOOL) sign -pkcs12 '$(DPP_ROOT)/$(SIGNTOOL_PREFIX)-code.p12' \
+ -in "$$target" \
+ -out "$(DESTDIR)/$$target"; \
+ $(INSTALL) "$(DPP_ROOT)/sign-driver-on-windows.bat.in" "$(DESTDIR)/$$(basename $$target .sys)-sign-driver-on-windows.bat"; \
+ $(SED) -i -e "s/{{\s*DRIVER_NAME\s*}}/$$target/g" "$(DESTDIR)/$$(basename $$target .sys)-sign-driver-on-windows.bat"; \
+ done
+ $(INSTALL) "$(DPP_ROOT)/$(SIGNTOOL_PREFIX)-ca-cert.pem" '$(DESTDIR)/$(SIGNTOOL_PREFIX)-ca-cert.crt'
+ $(INSTALL) "$(DPP_ROOT)/create_codesign_ca.bat" '$(DESTDIR)/create-codesign-ca-on-windows.bat'
+endef
+
+define INSTALL_HEADERS
+ $(call is_set,$(1),First argument: Header subdirectory missing)
+ $(call is_set,$(2),Second argument: Header files missing)
+ $(call is_set,$(3),Third argument: Output directory missing)
+ for header in $(2); do \
+ mkdir -p '$(3)/include/$(1)/'; \
+ $(INSTALL) -m0644 "$$header" '$(3)/include/$(1)/'; \
+ done
+endef
+
+define PACKAGE
+ $(call is_set,$(1),First argument: Library name missing)
+ $(call is_set,$(2),Second argument: Object files missing)
+ $(call is_set,$(3),Third argument: Output directory missing)
+ mkdir -p '$(3)/lib'
+ $(AR) -rsv '$(3)/lib/lib$(1).a' $(2)
+ tar --no-acls --no-selinux --no-xattrs --transform 's,^$(3),deps,' -cvjf '$(1).dpp' '$(3)'
+endef
+
+define HELP_MAKE_OPTIONS
+ @echo 'Common make options for Makefile.inc:'
+ @echo -e '\tBUILD_NATIVE = no'
+ @echo -e '\tCC = $(CC)'
+ @echo -e '\tCXX = $(CXX)'
+ @echo -e '\tRC = $(RC)'
+ @echo -e '\tDDK_INCLUDE_DIR = $(DDK_INCLUDE_DIR)'
+ @echo -e '\tDPP_ROOT = $(DPP_ROOT)'
+endef