1
+ if (WIN32 )
2
+ cmake_minimum_required (VERSION 3.1.0 ) # assembler stuff
3
+ else ()
4
+ cmake_minimum_required (VERSION 2.8.8 )
5
+ endif ()
6
+
7
+ if (POLICY CMP0043 )
8
+ cmake_policy (SET CMP0043 OLD ) # debian wheezy still uses 2.8.9
9
+ endif ()
10
+ if (POLICY CMP0042 )
11
+ cmake_policy (SET CMP0042 OLD )
12
+ endif ()
13
+
14
+ # For checks in subdirectories
15
+ set (InMV TRUE )
16
+
17
+ set (CMAKE_CONFIGURATION_TYPES Debug Release CACHE TYPE INTERNAL FORCE )
18
+
19
+ # Project name & version
20
+ set (ProjectName "JK2MV" CACHE STRING "Project Name" )
21
+ project (${ProjectName} )
22
+
23
+ set (MV_MAJOR_VERSION 1 )
24
+ set (MV_MINOR_VERSION 0 )
25
+ set (MV_EXT_VERSION "b3" )
26
+ set (MV_ECMP_VERSION 3 ) # increasing number to detect new version without parsing stuff like 1.0b1
27
+ set (MV_VERSION "${MV_MAJOR_VERSION} .${MV_MINOR_VERSION}${MV_EXT_VERSION} " )
28
+
29
+ # Languages
30
+ if (WIN32 )
31
+ enable_language (C CXX ASM_MASM )
32
+ else ()
33
+ enable_language (C CXX )
34
+ endif ()
35
+
36
+ # Customizable options
37
+ option (BuildPortableVersion "Build portable version (does not read or write files from your user/home directory" OFF )
38
+ option (BuildMVMP "Whether to create projects for the client (jk2mvmp & jk2mvmenu)" ON )
39
+ option (BuildMVDED "Whether to create projects for the dedicated server (jk2mvded)" ON )
40
+
41
+ if (WIN32 OR APPLE )
42
+ option (BuildPack "Whether to create the image / installer" OFF )
43
+ endif ()
44
+
45
+ if (WIN32 )
46
+ set (UseInternalPNG ON )
47
+ elseif (APPLE )
48
+ option (UseInternalPNG "Whether to use the included libpng instead of a locally installed one" ON )
49
+ else ()
50
+ option (UseInternalPNG "Whether to use the included libpng instead of a locally installed one" OFF )
51
+ endif ()
52
+
53
+ if (WIN32 )
54
+ set (UseInternalJPEG ON )
55
+ elseif (APPLE )
56
+ option (UseInternalJPEG "Whether to use the included libjpeg instead of a locally installed one" ON )
57
+ else ()
58
+ option (UseInternalJPEG "Whether to use the included libjpeg instead of a locally installed one" OFF )
59
+ endif ()
60
+
61
+ if (WIN32 )
62
+ set (UseInternalZLIB ON )
63
+ else ()
64
+ option (UseInternalZLIB "Whether to use the included zlib instead of a locally installed one" OFF )
65
+ endif ()
66
+
67
+ if (WIN32 )
68
+ set (UseInternalCURL ON )
69
+ else ()
70
+ option (UseInternalCURL "Whether to use the included libcurl instead of a locally installed one" OFF )
71
+ endif ()
72
+
73
+ # Paths
74
+ set (SRCDir "${CMAKE_SOURCE_DIR} /src" )
75
+ set (LIBDir "${CMAKE_SOURCE_DIR} /libs" )
76
+ set (RESDir "${CMAKE_SOURCE_DIR} /res" )
77
+
78
+ # Custom CMake Modules
79
+ list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR} /tools" )
80
+ list (INSERT CMAKE_MODULE_PATH 0 "${RESDir} " )
81
+
82
+ # Architecture
83
+ set (CMAKE_OSX_ARCHITECTURES "i386" "x86_64" ) # always building both on osx
84
+
85
+ if (CMAKE_SIZEOF_VOID_P MATCHES "8" )
86
+ set (ARCH_BITS 64 )
87
+ if (WIN32 )
88
+ set (Architecture "x64" )
89
+ set (WIN64 TRUE )
90
+ elseif (APPLE )
91
+ set (Architecture "universal" )
92
+ else ()
93
+ set (Architecture "amd64" )
94
+ endif ()
95
+
96
+ if (NOT APPLE )
97
+ set (GlobalDefines ${GlobalDefines} "_M_X64" )
98
+ endif ()
99
+ else ()
100
+ set (ARCH_BITS 32 )
101
+ if (WIN32 )
102
+ set (Architecture "x86" )
103
+ set (WIN64 FALSE )
104
+ elseif (APPLE )
105
+ set (Architecture "universal" )
106
+ else ()
107
+ set (Architecture "i386" )
108
+ endif ()
109
+
110
+ if (NOT APPLE )
111
+ set (GlobalDefines ${GlobalDefines} "_M_IX86" )
112
+ endif ()
113
+ endif ()
114
+
115
+ message (STATUS "Architecture is ${Architecture} " )
116
+
117
+ # Binary names
118
+ if (NOT APPLE )
119
+ set (MVMP "jk2mvmp_${Architecture} " )
120
+ set (MVMENU "jk2mvmenu_${Architecture} " )
121
+ set (MVDED "jk2mvded_${Architecture} " )
122
+ else ()
123
+ set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR} /out/install" )
124
+
125
+ set (MVMP "jk2mvmp" )
126
+ set (MVMENU "jk2mvmenu" )
127
+ set (MVDED "jk2mvded" )
128
+ endif ()
129
+
130
+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /out )
131
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /out )
132
+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /out )
133
+ set (CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR} /out )
134
+
135
+ # Compiler defines / settings
136
+ set (GlobalDefines ${GlobalDefines} "JKA_DYNAMIC_GLOW" )
137
+ set (GlobalDefines ${GlobalDefines} "BOTLIB" )
138
+ set (GlobalDefines ${GlobalDefines} "_JK2" )
139
+
140
+ if (NOT MSVC )
141
+ # CMake already defines _DEBUG for MSVC.
142
+ set (DebugDefines ${DebugDefines} "_DEBUG" )
143
+ endif ()
144
+ set (DebugDefines ${DebugDefines} "DEBUG" )
145
+
146
+ set (ReleaseDefines "FINAL_BUILD" "NDEBUG" )
147
+
148
+ if (WIN32 )
149
+ if (MSVC )
150
+ set (GlobalDefines ${GlobalDefines} "_CRT_SECURE_NO_WARNINGS" )
151
+
152
+ # Multithreaded
153
+ set (CMAKE_CXX_FLAGS_RELEASE "/MT" CACHE TYPE INTERNAL FORCE )
154
+ set (CMAKE_C_FLAGS_RELEASE "/MT" CACHE TYPE INTERNAL FORCE )
155
+
156
+ # Platform
157
+ set (GlobalDefines ${GlobalDefines} "UNICODE" "_UNICODE" )
158
+
159
+ # Optimization
160
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MP" ) # multiprocessor compilation
161
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP" )
162
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /O2 /Oi /Ot /Ob2 /fp:fast" ) # maximize speed
163
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2 /Oi /Ot /Ob2 /fp:fast" )
164
+
165
+ if (WIN64 )
166
+ set (GlobalDefines ${GlobalDefines} "WIN64" )
167
+ else ()
168
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /arch:SSE2" )
169
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2" )
170
+
171
+ set (CMAKE_ASM_MASM_FLAGS "${CMAKE_ASM_MASM_FLAGS} /safeseh" ) # safe exception handler
172
+ endif ()
173
+ endif ()
174
+ else ()
175
+ if (APPLE )
176
+ set (GlobalDefines ${GlobalDefines} "MACOS_X" )
177
+ endif ()
178
+
179
+ # Additional flags for debug configuration
180
+ set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb" )
181
+ set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb" )
182
+
183
+ # ouned: need sse optimizations in debug configuration, too because of the inline assembler which is sse code
184
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2" )
185
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2" )
186
+
187
+ # Optimization
188
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math" )
189
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math" )
190
+
191
+ if ("${CMAKE_C_COMPILER_ID} " STREQUAL "GNU" )
192
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse -fexpensive-optimizations" )
193
+
194
+ # Link only libs actually needed
195
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wl,--as-needed,-s" )
196
+
197
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden" )
198
+ elseif ("${CMAKE_C_COMPILER_ID} " STREQUAL "Clang" )
199
+ set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto" )
200
+
201
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-comment -Wno-reorder -Wunused-value -Wswitch" )
202
+ endif ()
203
+
204
+ if ("${CMAKE_CXX_COMPILER_ID} " STREQUAL "GNU" )
205
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mfpmath=sse -fexpensive-optimizations" )
206
+
207
+ # Link only libs actually needed
208
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wl,--as-needed,-s" )
209
+
210
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden" )
211
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden" )
212
+
213
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings" )
214
+ elseif ("${CMAKE_CXX_COMPILER_ID} " STREQUAL "Clang" )
215
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto" )
216
+
217
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment -Wno-deprecated-writable-strings -Wno-reorder -Wunused-value -Wswitch" )
218
+ endif ()
219
+ endif ()
220
+
221
+ if (NOT CMAKE_BUILD_TYPE )
222
+ message (STATUS "No build type selected, default to Release" )
223
+ set (CMAKE_BUILD_TYPE "Release" )
224
+ endif ()
225
+
226
+ if (UseInternalPNG )
227
+ set (GlobalDefines ${GlobalDefines} "INTERNAL_PNG" )
228
+ endif ()
229
+
230
+ if (UseInternalJPEG )
231
+ set (GlobalDefines ${GlobalDefines} "INTERNAL_JPEG" )
232
+ endif ()
233
+
234
+ if (UseInternalZLIB )
235
+ set (GlobalDefines ${GlobalDefines} "INTERNAL_ZLIB" )
236
+ endif ()
237
+
238
+ if (UseInternalCURL )
239
+ set (GlobalDefines ${GlobalDefines} "INTERNAL_CURL" )
240
+ endif ()
241
+
242
+ if (BuildPortableVersion )
243
+ set (GlobalDefines ${GlobalDefines} "PORTABLE" )
244
+ endif ()
245
+
246
+ # package
247
+ set (CPACK_PACKAGE_NAME ${ProjectName} )
248
+ set (CPACK_PACKAGE_VENDOR "jk2mv.org" )
249
+ set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "JK2 MultiVersion" )
250
+ set (CPACK_PACKAGE_VERSION "${MV_VERSION} " )
251
+ set (CPACK_PACKAGE_VERSION_MAJOR "${MV_MAJOR_VERSION} " )
252
+ set (CPACK_PACKAGE_VERSION_MINOR "${MV_MINOR_VERSION} " )
253
+ set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR} /LICENSE.txt" )
254
+
255
+ if (BuildPack )
256
+ if (WIN32 )
257
+ set (CPACK_GENERATOR "NSIS" )
258
+ set (CPACK_NSIS_URL_INFO_ABOUT "http://jk2mv.org" )
259
+
260
+ configure_file (
261
+ ${RESDir} /NSIS.definitions.nsh.in
262
+ ${CMAKE_CURRENT_BINARY_DIR} /res/NSIS.definitions.nsh
263
+ )
264
+ string (REGEX REPLACE "/" "\\\\\\\\ " CPACK_NSIS_INCLFILE "${CMAKE_CURRENT_BINARY_DIR} /res/NSIS.definitions.nsh" )
265
+
266
+ include (CPack )
267
+ elseif (APPLE )
268
+ # TODO
269
+ set (CPACK_GENERATOR "Bundle" )
270
+ set (CPACK_BUNDLE_NAME ${ProjectName} )
271
+ endif ()
272
+ endif ()
273
+
274
+ add_subdirectory (${SRCDir} )
0 commit comments