aboutsummaryrefslogtreecommitdiff
path: root/Makefile
blob: eb6feb8d6cf242d3a752ac8ef84ea440337346c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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

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$(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
EASTL_STATIC_LIB := EASTL-build/libEASTL.a
EASTL_COMPAT := EASTL-compat/kcrt.opp

1_DRIVER_NAME = ddk-template
1_OBJECTS = $(1_DRIVER_NAME).o
1_TARGET = $(1_DRIVER_NAME).sys

2_DRIVER_NAME = ddk-template-cplusplus
2_OBJECTS = $(2_DRIVER_NAME).opp
2_TARGET = $(2_DRIVER_NAME).sys

3_DRIVER_NAME = ddk-template-cplusplus-EASTL
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)

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

distclean: clean
	rm -f .deps-built
	rm -rf $(LOCAL_MINGW64_BUILD_DIR)

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)
	$(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 $(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) \
		$(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