-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
130 lines (107 loc) · 3.69 KB
/
Makefile
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
##
## Copyright (c) 2018-2025 Stéphane Micheloud
##
## Licensed under the MIT License.
##
##############################################################################
TOOLSET ?= gcc
CXXSTD ?= c++20
include ../Makefile.inc
PROJECT_NAME ?= $(shell basename $(CURDIR))
PROJECT_CONFIG ?= Release
SOURCE_DIR = src
TARGET_DIR = build
TARGET_EXE_DIR = $(TARGET_DIR)
TARGET_DOCS_DIR = $(TARGET_DIR)/docs
ifeq ($(OS),Windows_NT)
CPPCHECK_PLATFORM = win64
else
CPPCHECK_PLATFORM = native
endif
CPPCHECK_OPTS = --platform=$(CPPCHECK_PLATFORM) --std=$(CXXSTD)
ifeq ($(TOOLSET),bcc)
CXX = $(BCC)
## see https://docwiki.embarcadero.com/RADStudio/Sydney/en/C%2B%2B_Compiler
CXXFLAGS = -I "$(SOURCE_DIR)" -q -w
## suppress linker identification banner
CXXLINK = -lq
else ifeq ($(TOOLSET),clang)
CXX = $(CLANG)
CXXFLAGS = --std=$(CXXSTD) -O2 -Wall -Wno-unused-variable
CXXLINK =
else ifeq ($(TOOLSET),gcc)
CXX = $(CC)
CXXFLAGS = --std=$(CXXSTD) -O2 -Wall -Wno-unused-variable
CXXLINK =
CPPCHECK_OPTS = --platform=$(CPPCHECK_PLATFORM) --template=gcc --std=$(CXXSTD)
else ifeq ($(TOOLSET),icx)
CXX = $(ICX)
CXXFLAGS = -nologo -Qstd=$(CXXSTD) -O2 -Wall -Wno-unused-variable -Fe"$(TARGET)"
CXXLINK = -link -libpath:"$(ONEAPI_LIBPATH)/intel64"
else ifeq ($(TOOLSET),msvc)
ifeq (,$(wildcard $(MSVC_INCPATH)))
$(error Variable MSVC_INCPATH is not set)
endif
TARGET_EXE_DIR = $(TARGET_DIR)/$(PROJECT_CONFIG)
CXX = $(CL)
## see https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-alphabeticall
CXXFLAGS = -nologo -std:$(CXXSTD) -EHsc -I"$(MSVC_INCPATH)" -I"$(WINSDK_INCPATH)ucrt" -I"$(WINSDK_INCPATH)um" -Fo"$(TARGET_DIR)/"
CXXLINK = -link -libpath:"$(MSVC_LIBPATH)" -libpath:"$(WINSDK_LIBPATH)ucrt/$(ARCH)" -libpath:"$(WINSDK_LIBPATH)um/$(ARCH)"
CPPCHECK_OPTS = --platform=$(CPPCHECK_PLATFORM) --template=vs --std=$(CXXSTD)
else ifeq ($(TOOLSET),occ)
CXX = $(OCC)
CXXFLAGS = --nologo -std=c++14
CXXLINK =
else
$(error Variable TOOLSET is invalid)
endif
CXXDEBUG =
CXXVARS =
##############################################################################
## main rules
SOURCES = $(wildcard $(SOURCE_DIR)/main/cpp/*.cpp)
TARGET = $(TARGET_EXE_DIR)/$(PROJECT_NAME)$(TARGET_EXT)
all: build run
build: $(TARGET)
$(TARGET): $(SOURCES)
@$(TEST) -d "$(TARGET_EXE_DIR)" || "$(MKDIR)" -p "$(TARGET_EXE_DIR)"
ifeq ($(TOOLSET),msvc)
@## https://docs.microsoft.com/en-us/cpp/build/reference/output-file-f-options
"$(CXX)" $(CXXDEBUG) $(CXXFLAGS) $(CXXVARS) -Fe"$@" $^ $(CXXLINK)
else
"$(CXX)" $(CXXDEBUG) $(CXXFLAGS) $(CXXVARS) -o $@ $^ $(CXXLINK)
endif
clean:
"$(RM)" -rf "$(TARGET_DIR)"
run: build
$(TARGET)
help:
@$(ECHO) "Usage: make all|build|clean|help|lint|run"
@$(ECHO) ""
@$(ECHO) " Subcommands:"
@$(ECHO) " all alias for build"
@$(ECHO) " build compile C++ source files"
@$(ECHO) " clean delete generated files"
@$(ECHO) " doc generate HTML documentation with Doxygen"
@$(ECHO) " help print this help message"
@$(ECHO) " lint analyze C++ source files with CppCheck"
@$(ECHO) " run execute main program \"$(TARGET)\""
@$(ECHO) ""
@$(ECHO) " Environment variables:"
@$(ECHO) " TOOLSET=(bcc|clang|gcc|icx|msvc|occ)"
##############################################################################
## lint rules
lint:
"$(CPPCHECK)" $(CPPCHECK_OPTS) "$(SOURCE_DIR)"
##############################################################################
## doc rules
DOXYGEN_OPTS=-s
DOXYFILE=Doxyfile
doc:
[ -d "$(TARGET_DOCS_DIR)" ] || $(MKDIR) -p "$(TARGET_DOCS_DIR)"
"$(DOXYGEN)" $(DOXYGEN_OPTS) "$(DOXYFILE)"
##############################################################################
## phony
.PHONY: all build clean doc help lint run
.SUFFIXES:
.SUFFIXES: .c .cpp .h .hpp .o .obj .exe