diff options
-rw-r--r-- | EASTL/include/EASTL/tuple.h | 1 | ||||
-rw-r--r-- | Makefile | 180 | ||||
-rw-r--r-- | Makefile.external | 60 | ||||
-rw-r--r-- | Makefile.internal | 109 | ||||
-rw-r--r-- | README.md | 25 |
5 files changed, 233 insertions, 142 deletions
diff --git a/EASTL/include/EASTL/tuple.h b/EASTL/include/EASTL/tuple.h index 9d27bff..cec5115 100644 --- a/EASTL/include/EASTL/tuple.h +++ b/EASTL/include/EASTL/tuple.h @@ -930,7 +930,6 @@ namespace Internal }; }// namespace Internal -static const Internal::ignore_t ignore; // tie @@ -1,166 +1,64 @@ -LOCAL_MINGW64_BUILD_SCRIPT := ./mingw-w64-build/mingw-w64-build -LOCAL_MINGW64_BUILD_DIR := ./x86_64-w64-mingw32 -LOCAL_MINGW64_CC := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-gcc -LOCAL_MINGW64_DDK_INCLUDE_DIR := $(LOCAL_MINGW64_BUILD_DIR)/x86_64-w64-mingw32/include/ddk -SIGNTOOL_PREFIX := codesign - -INSTALL = install -CMAKE = cmake -CC = $(LOCAL_MINGW64_CC) -CXX = $(dir $(CC))/x86_64-w64-mingw32-g++ -DDK_INCLUDE_DIR = $(LOCAL_MINGW64_DDK_INCLUDE_DIR) -CFLAGS := -Wall -Wextra -m64 -shared \ - -I. -I$(DDK_INCLUDE_DIR) \ - -D__INTRINSIC_DEFINED_InterlockedBitTestAndSet \ - -D__INTRINSIC_DEFINED_InterlockedBitTestAndReset -CXXFLAGS := -fno-exceptions -fno-rtti -EASTL_CXXFLAGS := -IEASTL/include -IEASTL/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 \ - -Wl,--gc-sections -ADDITIONAL_OBJS := DriverThread.opp -ADDITIONAL_HDRS := DriverThread.hpp -EASTL_STATIC_LIB := EASTL-build/libEASTL.a -EASTL_COMPAT := EASTL-compat/kcrt.opp - 1_DRIVER_NAME = ddk-template +1_SOURCES = $(1_DRIVER_NAME).c 1_OBJECTS = $(1_DRIVER_NAME).o 1_TARGET = $(1_DRIVER_NAME).sys 2_DRIVER_NAME = ddk-template-cplusplus +2_SOURCES = $(2_DRIVER_NAME).cpp 2_OBJECTS = $(2_DRIVER_NAME).opp 2_TARGET = $(2_DRIVER_NAME).sys 3_DRIVER_NAME = ddk-template-cplusplus-EASTL +3_SOURCES = $(3_DRIVER_NAME).cpp 3_OBJECTS = $(3_DRIVER_NAME).opp 3_TARGET = $(3_DRIVER_NAME).sys -all: deps-print-local-notice check-vars $(1_TARGET) $(2_TARGET) $(3_TARGET) +DPP_ROOT = . +INSTALL = install + +all: $(1_TARGET) $(2_TARGET) $(3_TARGET) install: all - $(INSTALL) -d '$(DESTDIR)/' - test -r "$(SIGNTOOL_PREFIX)-ca-cert.pem" && \ - $(INSTALL) "$(SIGNTOOL_PREFIX)-ca-cert.pem" $(DESTDIR) - test -r "$(SIGNTOOL_PREFIX)-code.p12" && \ - $(INSTALL) "$(SIGNTOOL_PREFIX)-code.p12" $(DESTDIR) - $(INSTALL) -s --strip-program=$(dir $(CC))/x86_64-w64-mingw32-strip $(1_TARGET) $(DESTDIR) + $(MAKE) -C $(DPP_ROOT) -f Makefile.external install-sign \ + DESTDIR=$(DESTDIR) \ + TARGETS="$(1_TARGET) $(2_TARGET) $(3_TARGET)" \ + DRIVER_DIR="$(PWD)" $(INSTALL) $(1_DRIVER_NAME).bat $(DESTDIR) - $(INSTALL) -s --strip-program=$(dir $(CC))/x86_64-w64-mingw32-strip $(2_TARGET) $(DESTDIR) $(INSTALL) $(2_DRIVER_NAME).bat $(DESTDIR) - $(INSTALL) -s --strip-program=$(dir $(CC))/x86_64-w64-mingw32-strip $(3_TARGET) $(DESTDIR) $(INSTALL) $(3_DRIVER_NAME).bat $(DESTDIR) -deps-print-local-notice: $(CC) -ifeq ($(CC),$(LOCAL_MINGW64_CC)) -ifeq ($(DDK_INCLUDE_DIR),$(LOCAL_MINGW64_DDK_INCLUDE_DIR)) - @echo - @echo "--------------------------------------------------------" - @echo "-- You did not set CC and DDK_INCLUDE_DIR explicitly! --" - @echo "--------------------------------------------------------" - @echo "Using defaults:" - @echo "\tCC=$(CC)" - @echo "\tDDK_INCLUDE_DIR=$(DDK_INCLUDE_DIR)" - @echo -endif -endif - -check-vars: -ifeq ($(CC),$(LOCAL_MINGW64_CC)) -ifneq ($(DDK_INCLUDE_DIR),$(LOCAL_MINGW64_DDK_INCLUDE_DIR)) - @echo - @echo "------------------------------------------------------------------------" - @echo "-- You did not set CC explicitly but set the mingw64 ddk include dir. --" - @echo "------------------------------------------------------------------------" - @echo "\tCC=$(CC)" - @echo "\tDDK_INCLUDE_DIR=$(DDK_INCLUDE_DIR)" - @echo - @echo "This is not supported!" - @echo - @false -endif -endif - -$(LOCAL_MINGW64_BUILD_SCRIPT): -ifeq ($(CC),$(LOCAL_MINGW64_CC)) -ifeq ($(DDK_INCLUDE_DIR),$(LOCAL_MINGW64_DDK_INCLUDE_DIR)) - @echo - @echo "------------------------------------------------------------------------------" - @echo "-- ./mingw-w64-build/mingw-w64-build does not exist, clonging git submodule --" - @echo "------------------------------------------------------------------------------" - @echo - git submodule update --init -endif -endif - -$(LOCAL_MINGW64_CC): -ifeq ($(CC),$(LOCAL_MINGW64_CC)) -ifeq ($(DDK_INCLUDE_DIR),$(LOCAL_MINGW64_DDK_INCLUDE_DIR)) - @echo - @echo "----------------------------------------------------------------------------------------" - @echo "-- ./x86_64-w64-mingw32/bin/x86_64-w64-mingw32-gcc does not exist, building toolchain --" - @echo "----------------------------------------------------------------------------------------" - @echo - ./mingw-w64-build/mingw-w64-build x86_64 -endif -endif - -.deps-built: $(LOCAL_MINGW64_BUILD_SCRIPT) $(LOCAL_MINGW64_CC) - touch .deps-built - -deps: .deps-built - -$(EASTL_STATIC_LIB): .deps-built - mkdir -p EASTL-build - cd EASTL-build && \ - $(CMAKE) ../EASTL \ - -DCMAKE_CXX_COMPILER="$(realpath $(CXX))" \ - -DCMAKE_SYSTEM_NAME="Windows" \ - -DCMAKE_CXX_FLAGS='-ffunction-sections -fdata-sections $(CXXFLAGS) $(EASTL_CXXFLAGS)' && \ - $(MAKE) VERBOSE=1 - -$(SIGNTOOL_PREFIX)-code.p12: - ./create_codesign_ca.sh $(SIGNTOOL_PREFIX) - -$(SIGNTOOL_PREFIX): $(SIGNTOOL_PREFIX)-code.p12 - distclean: clean - rm -f .deps-built - rm -rf $(LOCAL_MINGW64_BUILD_DIR) - rm -f codesign* + $(MAKE) -C $(DPP_ROOT) -f Makefile.external distclean clean: + $(MAKE) -C $(DPP_ROOT) -f Makefile.external clean rm -f $(1_OBJECTS) $(1_TARGET) rm -f $(2_OBJECTS) $(2_TARGET) rm -f $(3_OBJECTS) $(3_TARGET) - rm -f $(EASTL_COMPAT) $(EASTL_STATIC_LIB) - rm -f $(ADDITIONAL_OBJS) - $(MAKE) -C EASTL-build clean - -%.o: %.c .deps-built - $(CC) $(CFLAGS) -c $< -o $@ - -%.opp: %.cpp .deps-built - $(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c $< -o $@ - -$(1_TARGET): .deps-built $(1_OBJECTS) - $(CC) -std=c99 $(CFLAGS) -Wl,--subsystem,native -Wl,--image-base,0x140000000 -Wl,--dynamicbase -Wl,--nxcompat \ - -Wl,--file-alignment,0x200 -Wl,--section-alignment,0x1000 -Wl,--stack,0x100000 \ - -Wl,--entry,DriverEntry -nostartfiles -nostdlib -o $(1_TARGET) \ - $(1_OBJECTS) -lntoskrnl -lhal - -$(2_TARGET): .deps-built $(ADDITIONAL_HDRS) $(ADDITIONAL_OBJS) $(2_OBJECTS) - $(CXX) $(CFLAGS) -Wl,--subsystem,native -Wl,--image-base,0x140000000 -Wl,--dynamicbase -Wl,--nxcompat \ - -Wl,--file-alignment,0x200 -Wl,--section-alignment,0x1000 -Wl,--stack,0x100000 \ - -Wl,--entry,DriverEntry@8 -nostartfiles -nostdlib -o $(2_TARGET) \ - $(ADDITIONAL_OBJS) $(2_OBJECTS) -lntoskrnl -lhal -$(3_TARGET): .deps-built $(EASTL_STATIC_LIB) $(EASTL_COMPAT) $(3_OBJECTS) - $(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -Wl,--subsystem,native -Wl,--image-base,0x140000000 -Wl,--dynamicbase -Wl,--nxcompat \ - -Wl,--file-alignment,0x200 -Wl,--section-alignment,0x1000 -Wl,--stack,0x100000 \ - -Wl,--entry,DriverEntry@8 -nostartfiles -nostdlib -o $(3_TARGET) \ - $(3_OBJECTS) $(EASTL_COMPAT) $(EASTL_STATIC_LIB) -lntoskrnl -lhal +# simple C driver +$(1_TARGET): $(1_SOURCES) + $(MAKE) -C $(DPP_ROOT) -f Makefile.external \ + DRIVER_TARGET="$(1_TARGET)" \ + DRIVER_DIR="$(PWD)" \ + DRIVER_OBJECTS="$(1_OBJECTS)" \ + driver-c + +# C++ driver w/ MT +$(2_TARGET): $(2_SOURCES) + $(MAKE) -C $(DPP_ROOT) -f Makefile.external \ + DRIVER_TARGET="$(2_TARGET)" \ + DRIVER_DIR="$(PWD)" \ + DRIVER_OBJECTS="$(2_OBJECTS)" \ + driver-cpp + +# C++ driver w/ EASTL +$(3_TARGET): $(3_SOURCES) + $(MAKE) -C $(DPP_ROOT) -f Makefile.external \ + DRIVER_TARGET="$(3_TARGET)" \ + DRIVER_DIR="$(PWD)" \ + DRIVER_OBJECTS="$(3_OBJECTS)" \ + driver-cpp + +.PHONY: all install distclean clean +.DEFAULT_GOAL := all diff --git a/Makefile.external b/Makefile.external new file mode 100644 index 0000000..06e908f --- /dev/null +++ b/Makefile.external @@ -0,0 +1,60 @@ +include Makefile.internal + +%.o: %.c + $(Q)$(CC) $(CFLAGS) -c $< -o $@ + @echo 'CC $@' + +%.opp: %.cpp + $(Q)$(CXX) $(CFLAGS) $(CXXFLAGS) $(EASTL_CXXFLAGS) -c $< -o $@ + @echo 'CXX $@' + +check-env: +ifndef DRIVER_TARGET + $(error DRIVER_TARGET is undefined) +endif +ifndef DRIVER_DIR + $(error DRIVER_DIR is undefined) +endif +ifndef DRIVER_OBJECTS + $(error DRIVER_OBJECTS is undefined) +endif + +driver-c: check-env deps $(addprefix $(DRIVER_DIR)/,$(DRIVER_OBJECTS)) + $(Q)$(CC) -std=c99 $(CFLAGS) \ + $(DRIVER_LDFLAGS) \ + -o '$(DRIVER_DIR)/$(DRIVER_TARGET)' \ + $(addprefix $(DRIVER_DIR)/,$(DRIVER_OBJECTS)) \ + $(DRIVER_LIBS) + @echo 'LD $(DRIVER_DIR)/$(DRIVER_TARGET)' + +driver-cpp: check-env deps \ + $(ADDITIONAL_HDRS) $(ADDITIONAL_OBJS) \ + $(EASTL_STATIC_LIB) $(EASTL_COMPAT) \ + $(addprefix $(DRIVER_DIR)/,$(DRIVER_OBJECTS)) + + $(Q)$(CXX) $(CFLAGS) \ + $(CXXFLAGS) \ + $(EASTL_CXXFLAGS) \ + $(DRIVER_LDFLAGS) \ + -o '$(DRIVER_DIR)/$(DRIVER_TARGET)' \ + $(addprefix $(DRIVER_DIR)/,$(DRIVER_OBJECTS)) \ + $(ADDITIONAL_OBJS) $(EASTL_COMPAT) $(EASTL_STATIC_LIB) $(DRIVER_LIBS) + @echo 'LD $(DRIVER_DIR)/$(DRIVER_TARGET)' + +check-env-install: +ifndef TARGETS + $(error TARGETS is undefined) +endif + +install: check-env-install $(addprefix $(DRIVER_DIR)/,$(TARGETS)) + $(INSTALL) -s --strip-program=$(dir $(CC))/x86_64-w64-mingw32-strip \ + $(addprefix $(DRIVER_DIR)/,$(TARGETS)) $(DESTDIR) + +install-sign: $(SIGNTOOL_PREFIX) install + $(INSTALL) -d '$(DESTDIR)/' + test -r "$(SIGNTOOL_PREFIX)-ca-cert.pem" && \ + $(INSTALL) "$(SIGNTOOL_PREFIX)-ca-cert.pem" $(DESTDIR) + test -r "$(SIGNTOOL_PREFIX)-code.p12" && \ + $(INSTALL) "$(SIGNTOOL_PREFIX)-code.p12" $(DESTDIR) + +.PHONY: check-env driver-c driver-cpp check-env-install install install-sign diff --git a/Makefile.internal b/Makefile.internal new file mode 100644 index 0000000..14b148b --- /dev/null +++ b/Makefile.internal @@ -0,0 +1,109 @@ +Q = @ +ifeq ($(Q),) +CMAKE_Q = VERBOSE=1 +endif +ifeq ($(DPP_EXTERNAL_MAKEFILE),) +DPP_EXTERNAL_MAKEFILE := . +endif +LOCAL_MINGW64_BUILD_SCRIPT := $(DPP_EXTERNAL_MAKEFILE)/mingw-w64-build/mingw-w64-build +LOCAL_MINGW64_BUILD_DIR := $(DPP_EXTERNAL_MAKEFILE)/x86_64-w64-mingw32 +LOCAL_MINGW64_CC := $(LOCAL_MINGW64_BUILD_DIR)/bin/x86_64-w64-mingw32-gcc +SIGNTOOL_PREFIX := codesign + +INSTALL = install +CMAKE = cmake +CC = $(LOCAL_MINGW64_CC) +CXX = $(dir $(CC))/x86_64-w64-mingw32-g++ +DDK_INCLUDE_DIR = $(dir $(CC))../x86_64-w64-mingw32/include/ddk +CFLAGS := -Wall -Wextra -m64 -shared \ + -I. -I$(DDK_INCLUDE_DIR) \ + -D__INTRINSIC_DEFINED_InterlockedBitTestAndSet \ + -D__INTRINSIC_DEFINED_InterlockedBitTestAndReset +CXXFLAGS := -fno-exceptions -fno-rtti +EASTL_CXXFLAGS := -IEASTL/include -IEASTL/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 +DRIVER_LDFLAGS := -Wl,--subsystem,native \ + -Wl,--image-base,0x140000000 \ + -Wl,--dynamicbase -Wl,--nxcompat \ + -Wl,--file-alignment,0x200 \ + -Wl,--section-alignment,0x1000 \ + -Wl,--stack,0x100000 \ + -Wl,--entry,DriverEntry \ + -Wl,--gc-sections \ + -nostartfiles -nostdlib +DRIVER_LIBS := -lntoskrnl -lhal + +ADDITIONAL_OBJS := DriverThread.opp +ADDITIONAL_HDRS := DriverThread.hpp +EASTL_STATIC_LIB := EASTL-build/libEASTL.a +EASTL_COMPAT := EASTL-compat/kcrt.opp +DEPS_STAMP := .deps-built + +deps-print-local-notice: $(CC) +ifeq ($(CC),$(LOCAL_MINGW64_CC)) + @echo + @echo "-- [Build Config]" + @echo "-- CC : $(realpath $(CC))" + @echo "-- CXX: $(realpath $(CXX))" + @echo "-- DDK: $(realpath $(DDK_INCLUDE_DIR))" + @echo +endif + +$(LOCAL_MINGW64_BUILD_SCRIPT): +ifeq ($(CC),$(LOCAL_MINGW64_CC)) + @echo + @echo "------------------------------------------------------------------------------" + @echo "-- ./mingw-w64-build/mingw-w64-build does not exist, clonging git submodule --" + @echo "------------------------------------------------------------------------------" + @echo + git submodule update --init mingw-w64-build +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 + env -i ./mingw-w64-build/mingw-w64-build x86_64 +endif + +$(DEPS_STAMP): $(LOCAL_MINGW64_BUILD_SCRIPT) $(LOCAL_MINGW64_CC) + touch $(DEPS_STAMP) + +deps: deps-print-local-notice $(DEPS_STAMP) + +$(EASTL_STATIC_LIB): $(DEPS_STAMP) + mkdir -p EASTL-build + cd EASTL-build && \ + $(CMAKE) ../EASTL \ + -DCMAKE_CXX_COMPILER="$(realpath $(CXX))" \ + -DCMAKE_SYSTEM_NAME="Windows" \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ + -DCMAKE_CXX_FLAGS='-ffunction-sections -fdata-sections $(CXXFLAGS) $(EASTL_CXXFLAGS)' && \ + $(MAKE) $(CMAKE_Q) + +$(SIGNTOOL_PREFIX)-code.p12: + ./create_codesign_ca.sh $(SIGNTOOL_PREFIX) + +$(SIGNTOOL_PREFIX): $(SIGNTOOL_PREFIX)-code.p12 + +distclean: clean + rm -f $(DEPS_STAMP) + rm -rf $(LOCAL_MINGW64_BUILD_DIR) + rm -f codesign* + git submodule deinit --all + +clean: + rm -f $(EASTL_COMPAT) $(EASTL_STATIC_LIB) + rm -f $(ADDITIONAL_OBJS) + rm -rf EASTL-build + +.PHONY: deps distclean-deps clean-deps @@ -35,6 +35,31 @@ Build Mingw64 only: make deps `` +## HowTo use it in your own project + +At the moment only **GMake** is supported. +The process is similiar to KBuild from the Linux kernel. +You'll write a minimal Makefile that triggers some targets from **Makefile.external**. + +You can use the **Makefile** in this repository. +A minimal working **Makefile** for your own project could look alike: + +```make +DRIVER_NAME = Driver +DRIVER_SOURCES = $(DRIVER_NAME).cpp +DRIVER_OBJECTS = $(DRIVER_NAME).opp +DRIVER_TARGET = $(DRIVER_NAME).sys + +$(DRIVER_TARGET): $(DRIVER_SOURCES) + $(MAKE) -C $(DPP_ROOT) -f Makefile.external \ + DRIVER_TARGET="$(DRIVER_TARGET)" \ + DRIVER_DIR="$(PWD)" \ + DRIVER_OBJECTS="$(DRIVER_OBJECTS)" \ + driver-cpp +``` + +Build it with: `make Driver.sys DPP_ROOT=[path/to/this/repository]` + ## Thanks! - [Zeranoe](https://github.com/Zeranoe/mingw-w64-build) for the Mingw64 build script |