1
1
# C++/C Recursive Project Makefile
2
2
# (c) Jack
3
- # Version 3
3
+ # Version 6 (20211110)
4
4
5
5
# Project Name
6
6
PROJECT_NAME = libmbedtls
@@ -13,7 +13,7 @@ PROJECT_INCLUDE_PATH = include
13
13
# PROJECT_TESTSRC_PATH = test
14
14
# PROJECT_TESTSRC_SUBDIRS = $(PROJECT_TESTSRC_PATH)
15
15
PROJECT_BIN_PATH = bin
16
- # PROJECT_DOCS_PATH = docs
16
+ # PROJECT_DOCS_PATH = docs
17
17
# PROJECT_DOXYFILE_PATH = Doxyfile
18
18
19
19
# Determine if the root makefile has been established, and if not establish this makefile as the root makefile
@@ -31,23 +31,23 @@ PROJECT_SONAME = $(PROJECT_NAME).so.$(PROJECT_SO_VER_MAJOR)
31
31
PROJECT_SO_FILENAME = $(PROJECT_SONAME ) .$(PROJECT_SO_VER_MINOR ) .$(PROJECT_SO_VER_PATCH )
32
32
33
33
# Project Dependencies
34
- PROJECT_DEPEND_LOCAL =
35
- PROJECT_DEPEND_EXTERNAL =
34
+ PROJECT_DEPEND =
35
+ PROJECT_DEPEND_LOCAL_DIR =
36
36
37
37
# Generate compiler flags for including project include path
38
38
ifneq ($(PROJECT_INCLUDE_PATH ) ,)
39
39
INC += -I"$(PROJECT_INCLUDE_PATH)"
40
40
endif
41
41
42
42
# Generate compiler flags for local included dependencies
43
- ifneq ($(PROJECT_DEPEND_LOCAL ) ,)
44
- LIB += $(foreach dep,$(PROJECT_DEPEND_LOCAL ), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib $(dep)/bin" -l$(dep) )
45
- INC += $(foreach dep,$(PROJECT_DEPEND_LOCAL ), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/lib $(dep)/include")
43
+ ifneq ($(PROJECT_DEPEND_LOCAL_DIR ) ,)
44
+ LIB += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR ), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/bin")
45
+ INC += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR ), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/include")
46
46
endif
47
47
48
48
# Generate compiler flags for external dependencies
49
- ifneq ($(PROJECT_DEPEND_EXTERNAL ) ,)
50
- LIB += $(foreach dep,$(PROJECT_DEPEND_EXTERNAL ), -l$(dep))
49
+ ifneq ($(PROJECT_DEPEND ) ,)
50
+ LIB += $(foreach dep,$(PROJECT_DEPEND ), -l$(dep))
51
51
endif
52
52
53
53
# Detect Platform
@@ -64,12 +64,26 @@ ifeq ($(PROJECT_PLATFORM),)
64
64
endif
65
65
endif
66
66
67
+ # Detect Architecture
68
+ ifeq ($(PROJECT_PLATFORM_ARCH ) ,)
69
+ ifeq ($(PROJECT_PLATFORM), WIN32)
70
+ export PROJECT_PLATFORM_ARCH = x86_64
71
+ else ifeq ($(PROJECT_PLATFORM), GNU)
72
+ export PROJECT_PLATFORM_ARCH = $(shell uname -m)
73
+ else ifeq ($(PROJECT_PLATFORM), MACOS)
74
+ export PROJECT_PLATFORM_ARCH = $(shell uname -m)
75
+ else
76
+ export PROJECT_PLATFORM_ARCH = x86_64
77
+ endif
78
+ endif
79
+
67
80
# Generate platform specific compiler flags
68
81
ifeq ($(PROJECT_PLATFORM ) , WIN32)
69
82
# Windows Flags/Libs
70
83
CC = x86_64-w64-mingw32-gcc
71
84
CXX = x86_64-w64-mingw32-g++
72
85
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
86
+ ARCHFLAGS =
73
87
INC +=
74
88
LIB += -static
75
89
ARFLAGS = cr -o
@@ -78,6 +92,7 @@ else ifeq ($(PROJECT_PLATFORM), GNU)
78
92
# CC =
79
93
# CXX =
80
94
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
95
+ ARCHFLAGS =
81
96
INC +=
82
97
LIB +=
83
98
ARFLAGS = cr -o
@@ -86,18 +101,19 @@ else ifeq ($(PROJECT_PLATFORM), MACOS)
86
101
# CC =
87
102
# CXX =
88
103
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-private-field
104
+ ARCHFLAGS = -arch $(PROJECT_PLATFORM_ARCH)
89
105
INC +=
90
106
LIB +=
91
107
ARFLAGS = rc
92
108
endif
93
109
94
110
# Compiler Flags
95
- CXXFLAGS = -std=c++11 $(INC ) $(WARNFLAGS ) -fPIC
96
- CFLAGS = -std=c11 $(INC ) $(WARNFLAGS ) -fPIC
111
+ CXXFLAGS = -std=c++11 $(INC ) $(WARNFLAGS ) $( ARCHFLAGS ) -fPIC
112
+ CFLAGS = -std=c11 $(INC ) $(WARNFLAGS ) $( ARCHFLAGS ) -fPIC
97
113
98
114
# Object Files
99
- SRC_OBJ = $(foreach dir,$(PROJECT_SRC_SUBDIRS ) ,$(subst .cpp,.o,$(wildcard $(dir ) /* .cpp) ) ) $(foreach dir,$(PROJECT_SRC_SUBDIRS ) ,$(subst .c,.o,$(wildcard $(dir ) /* .c) ) )
100
- TESTSRC_OBJ = $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS ) ,$(subst .cpp,.o,$(wildcard $(dir ) /* .cpp) ) ) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS ) ,$(subst .c,.o,$(wildcard $(dir ) /* .c) ) )
115
+ SRC_OBJ = $(foreach dir,$(PROJECT_SRC_SUBDIRS ) ,$(subst .cpp,.o,$(wildcard $(dir ) /* .cpp) ) ) $(foreach dir,$(PROJECT_SRC_SUBDIRS ) ,$(subst .cc,.o, $( wildcard $( dir ) / * .cc) ) ) $( foreach dir, $( PROJECT_SRC_SUBDIRS ) , $( subst . c,.o,$(wildcard $(dir ) /* .c) ) )
116
+ TESTSRC_OBJ = $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS ) ,$(subst .cpp,.o,$(wildcard $(dir ) /* .cpp) ) ) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS ) ,$(subst .cc,.o, $( wildcard $( dir ) / * .cc) ) ) $( foreach dir, $( PROJECT_TESTSRC_SUBDIRS ) , $( subst . c,.o,$(wildcard $(dir ) /* .c) ) )
101
117
102
118
# all is the default, user should specify what the default should do
103
119
# - 'static_lib' for building static library
@@ -118,6 +134,10 @@ clean: clean_object_files remove_binary_dir
118
134
@echo CXX $<
119
135
@$(CXX ) $(CXXFLAGS ) -c $< -o $@
120
136
137
+ % .o : % .cc
138
+ @echo CXX $<
139
+ @$(CXX ) $(CXXFLAGS ) -c $< -o $@
140
+
121
141
# Binary Directory
122
142
.PHONY : create_binary_dir
123
143
create_binary_dir :
@@ -145,13 +165,13 @@ shared_lib: $(SRC_OBJ) create_binary_dir
145
165
# Build Program
146
166
program : $(SRC_OBJ ) create_binary_dir
147
167
@echo LINK $(PROJECT_BIN_PATH ) /$(PROJECT_NAME )
148
- @$(CXX ) $(SRC_OBJ ) $(LIB ) -o " $( PROJECT_BIN_PATH) /$( PROJECT_NAME) "
168
+ @$(CXX ) $(ARCHFLAGS ) $( SRC_OBJ ) $(LIB ) -o " $( PROJECT_BIN_PATH) /$( PROJECT_NAME) "
149
169
150
170
# Build Test Program
151
171
test_program : $(TESTSRC_OBJ ) $(SRC_OBJ ) create_binary_dir
152
172
ifneq ($(PROJECT_TESTSRC_PATH ) ,)
153
173
@echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test
154
- @$(CXX) $(TESTSRC_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test"
174
+ @$(CXX) $(ARCHFLAGS) $( TESTSRC_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test"
155
175
endif
156
176
157
177
# Documentation
@@ -170,8 +190,8 @@ endif
170
190
# Dependencies
171
191
.PHONY : deps
172
192
deps :
173
- @$(foreach lib,$(PROJECT_DEPEND_LOCAL ) , cd "$(ROOT_PROJECT_DEPENDENCY_PATH ) /lib $(lib ) " && $(MAKE ) static_lib && cd "$(PROJECT_PATH ) ";)
193
+ @$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR ) , cd "$(ROOT_PROJECT_DEPENDENCY_PATH ) /$(lib ) " && $(MAKE ) static_lib && cd "$(PROJECT_PATH ) ";)
174
194
175
195
.PHONY : clean_deps
176
196
clean_deps :
177
- @$(foreach lib,$(PROJECT_DEPEND_LOCAL ) , cd "$(ROOT_PROJECT_DEPENDENCY_PATH ) /lib $(lib ) " && $(MAKE ) clean && cd "$(PROJECT_PATH ) ";)
197
+ @$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR ) , cd "$(ROOT_PROJECT_DEPENDENCY_PATH ) /$(lib ) " && $(MAKE ) clean && cd "$(PROJECT_PATH ) ";)
0 commit comments