-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
260 lines (229 loc) · 9.33 KB
/
CMakeLists.txt
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# Copyright (c) 2013-2018 Sébastien Rombauts ([email protected])
#
# Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt
# or copy at http://opensource.org/licenses/MIT)
cmake_minimum_required(VERSION 2.8.12) # first version with add_compile_options()
project(SdlMan CXX)
# Verbose Makefile
#set (CMAKE_VERBOSE_MAKEFILE ON)
# Print some standard CMake variables
message(STATUS "CMake version: ${CMAKE_VERSION}")
message(STATUS "CMAKE_SYSTEM_NAME/_VERSION '${CMAKE_SYSTEM_NAME}' '${CMAKE_SYSTEM_VERSION}'")
message(STATUS "CMAKE_CXX_COMPILER_ID/_VERSION '${CMAKE_CXX_COMPILER_ID}' '${CMAKE_CXX_COMPILER_VERSION}'")
if (NOT MSVC)
message(STATUS "CMAKE_BUILD_TYPE '${CMAKE_BUILD_TYPE}'")
endif (NOT MSVC)
# Define useful variables to handle OS/Compiler differences
if (MSVC)
# Flags for linking with multithread static C++ runtime
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
set(CPPLINT_ARG_OUTPUT "--output=vs7")
set(CPPCHECK_ARG_TEMPLATE "--template=vs")
set(DEV_NULL "NUL")
add_definitions(/D_CRT_SECURE_NO_WARNINGS)
set(SDL2_INCLUDE_DIRS Libs/SDL2-2.0.7/include/)
set(SDL2_IMAGE_INCLUDE_DIRS Libs/SDL2_image-2.0.2/include/)
set(SDL2_MIXER_INCLUDE_DIRS Libs/SDL2_mixer-2.0.2/include/)
set(SDL2_TTF_INCLUDE_DIRS Libs/SDL2_ttf-2.0.14/include/)
# Support both 32 and 64 bit builds
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
set(ARCH "x64")
else ()
set(ARCH "x86")
endif ()
set(SDL2_LIBPATH "${CMAKE_CURRENT_LIST_DIR}/Libs/SDL2-2.0.7/lib/${ARCH}/")
set(SDL2_IMAGE_LIBPATH "${CMAKE_CURRENT_LIST_DIR}/Libs/SDL2_image-2.0.2/lib/${ARCH}/")
set(SDL2_MIXER_LIBPATH "${CMAKE_CURRENT_LIST_DIR}/Libs/SDL2_mixer-2.0.2/lib/${ARCH}/")
set(SDL2_TTF_LIBPATH "${CMAKE_CURRENT_LIST_DIR}/Libs/SDL2_ttf-2.0.14/lib/${ARCH}/")
find_library(SDL2_LIB SDL2 PATH ${SDL2_LIBPATH})
find_library(SDL2_MAIN_LIB SDL2main PATH ${SDL2_LIBPATH})
set(SDL2_LIBRARIES ${SDL2_LIB} ${SDL2_MAIN_LIB})
find_library(SDL2IMAGE_LIBRARIES SDL2_image PATH ${SDL2_IMAGE_LIBPATH})
find_library(SDL2MIXER_LIBRARIES SDL2_mixer PATH ${SDL2_MIXER_LIBPATH})
find_library(SDL2TTF_LIBRARIES SDL2_ttf PATH ${SDL2_TTF_LIBPATH})
else (MSVC)
set(CPPLINT_ARG_OUTPUT "--output=eclipse")
set(CPPCHECK_ARG_TEMPLATE "--template=gcc")
set(DEV_NULL "/dev/null")
# C++11 :
add_compile_options(-std=c++0x) # equivalent to "-std=c++11" but backward compatible for GCC 4.6 on Travic-CI
# Stack protection
add_compile_options(-fstack-protector-all)
if (CMAKE_COMPILER_IS_GNUCXX)
# For stacktraces:
add_compile_options(-rdynamic)
endif (CMAKE_COMPILER_IS_GNUCXX)
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2 >= 2.0.0)
pkg_search_module(SDL2IMAGE REQUIRED SDL2_image >= 2.0.0)
pkg_search_module(SDL2MIXER REQUIRED SDL2_mixer >= 2.0.0)
pkg_search_module(SDL2TTF REQUIRED SDL2_ttf >= 2.0.0)
endif (MSVC)
set(CPPLINT_ARG_LINELENGTH "--linelength=120")
set(CPPLINT_ARG_VERBOSE "--verbose=1")
# Add googletest unit-test library.
option(SDLMAN_RUN_TESTS "Run googletest unit-test suite." ON)
if (SDLMAN_RUN_TESTS)
# add the subdirectory containing the CMakeLists.txt for the googletest library
add_subdirectory(googletest)
endif (SDLMAN_RUN_TESTS)
# Enable maximum Warning level for our own code (after the googletest lib)
if (MSVC)
# Set warning level to maximum (instead of default /W3)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
else (MSVC)
if (CMAKE_COMPILER_IS_GNUCXX)
# Enable maximum of Warnings for GCC:
add_compile_options(-Wall -Wextra -Wswitch-default -Wswitch-enum -Winit-self -Wformat-security -Wfloat-equal -Wcast-qual -Wconversion -Wlogical-op -Winline)
if (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.9" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.9")
add_compile_options (-Wfloat-conversion)
add_compile_options (-Wshadow)
endif ()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# Enable maximum of Warnings for Clang:
add_compile_options(-Weverything)
add_compile_options(-Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded -Wno-covered-switch-default -Wno-unreachable-code)
endif (CMAKE_COMPILER_IS_GNUCXX)
endif (MSVC)
# List all sources/headers files
set(source_files
${CMAKE_SOURCE_DIR}/src/Game.cpp
${CMAKE_SOURCE_DIR}/src/Game.h
${CMAKE_SOURCE_DIR}/src/Main.cpp
)
source_group(src FILES ${source_files})
# List script files
set(script_files
${CMAKE_SOURCE_DIR}/.travis.yml
${CMAKE_SOURCE_DIR}/appveyor.yml
${CMAKE_SOURCE_DIR}/build.bat
${CMAKE_SOURCE_DIR}/build.sh
)
source_group(scripts FILES ${script_files})
# List doc files
set(doc_files
${CMAKE_SOURCE_DIR}/README.md
${CMAKE_SOURCE_DIR}/LICENSE.txt
)
source_group(doc FILES ${doc_files})
# add the application executable
add_executable(SdlMan ${source_files} ${doc_files} ${script_files})
target_link_libraries(SdlMan
${SDL2_LIBRARIES}
${SDL2IMAGE_LIBRARIES}
${SDL2MIXER_LIBRARIES}
${SDL2TTF_LIBRARIES}
)
target_include_directories(SdlMan SYSTEM PRIVATE
${SDL2_INCLUDE_DIRS}
${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_MIXER_INCLUDE_DIRS}
${SDL2_TTF_INCLUDE_DIRS}
)
if (MSVC)
file(GLOB_RECURSE DLLS
"${SDL2_LIBPATH}/*.dll"
"${SDL2_IMAGE_LIBPATH}/*.dll"
"${SDL2_MIXER_LIBPATH}/*.dll"
"${SDL2_TTF_LIBPATH}/*.dll")
add_custom_command(TARGET SdlMan POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DLLS} $<TARGET_FILE_DIR:SdlMan>/)
endif (MSVC)
# Optional additional targets:
# Run cpplint C++ StyleGuide linter tool.
option(SDLMAN_RUN_CPPLINT "Run cpplint.py tool for Google C++ StyleGuide." ON)
if (SDLMAN_RUN_CPPLINT)
find_package(PythonInterp 2.6)
if (PYTHONINTERP_FOUND)
# add a cpplint target to the "all" target
add_custom_target(cpplint
ALL
COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/cpplint/cpplint.py ${CPPLINT_ARG_OUTPUT} ${CPPLINT_ARG_LINELENGTH} ${CPPLINT_ARG_VERBOSE} ${source_files}
)
else ()
message(STATUS "Python not found, not runing cpplint")
endif (PYTHONINTERP_FOUND)
else (SDLMAN_RUN_CPPLINT)
message(STATUS "SDLMAN_RUN_CPPLINT OFF")
endif (SDLMAN_RUN_CPPLINT)
# Run cppcheck C++ static analysis tool.
option(SDLMAN_RUN_CPPCHECK "Run cppcheck C++ static analysis tool." ON)
if (SDLMAN_RUN_CPPCHECK)
find_program(CPPCHECK_EXECUTABLE NAMES cppcheck)
if (CPPCHECK_EXECUTABLE)
# add a cppcheck target to the "all" target
add_custom_target(cppcheck
ALL
COMMAND ${CPPCHECK_EXECUTABLE} -j 8 --enable=style --quiet ${CPPCHECK_ARG_TEMPLATE} ${PROJECT_SOURCE_DIR}/src
)
execute_process(COMMAND "${CPPCHECK_EXECUTABLE}" --version OUTPUT_VARIABLE CPPCHECK_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Found Cppcheck: ${CPPCHECK_EXECUTABLE} ${CPPCHECK_VERSION}")
else (CPPCHECK_EXECUTABLE)
message(STATUS "Could NOT find cppcheck")
endif (CPPCHECK_EXECUTABLE)
else (SDLMAN_RUN_CPPCHECK)
message(STATUS "SDLMAN_RUN_CPPCHECK OFF")
endif (SDLMAN_RUN_CPPCHECK)
# Run Doxygen C++ documentation tool.
option(SDLMAN_RUN_DOXYGEN "Run Doxygen C++ documentation tool." ON)
if (SDLMAN_RUN_DOXYGEN)
find_package(Doxygen)
if (DOXYGEN_FOUND)
# add a Doxygen target to the "all" target
add_custom_target(doxygen
ALL
COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile > ${DEV_NULL}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
endif (DOXYGEN_FOUND)
else (SDLMAN_RUN_DOXYGEN)
message(STATUS "SDLMAN_RUN_DOXYGEN OFF")
endif (SDLMAN_RUN_DOXYGEN)
# Run CLOC line counting tool.
option(SDLMAN_RUN_CLOC "Run CLOC line counting tool." ON)
if (SDLMAN_RUN_CLOC)
find_program(CLOC_EXECUTABLE cloc DOC "CLOC tool for counting lines of code.")
if (CLOC_EXECUTABLE)
# add a cloc target to the "all" target
add_custom_target(cloc
ALL
COMMAND "${CLOC_EXECUTABLE}" ${source_files} ${script_files} --quiet
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
else (CLOC_EXECUTABLE)
message(STATUS "Could NOT find cloc")
endif (CLOC_EXECUTABLE)
else (SDLMAN_RUN_CLOC)
message(STATUS "RUN_CLOC OFF")
endif (SDLMAN_RUN_CLOC)
# Run googletest unit-test suite.
if (SDLMAN_RUN_TESTS)
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
add_compile_options(-Wno-global-constructors)
endif ()
# add the test executable
add_executable(SdlManUnitTests
src/Main_test.cpp
)
target_link_libraries(SdlManUnitTests
gtest_main
${SDL2_LIBRARIES}
${SDL2IMAGE_LIBRARIES}
${SDL2MIXER_LIBRARIES}
${SDL2TTF_LIBRARIES}
)
target_include_directories(SdlManUnitTests SYSTEM PRIVATE
${SDL2_INCLUDE_DIRS}
${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_MIXER_INCLUDE_DIRS}
${SDL2_TTF_INCLUDE_DIRS}
"${PROJECT_SOURCE_DIR}/googletest/googletest/include"
)
# add a "test" target:
enable_testing()
# does the tests pass
add_test(UnitTests SdlManUnitTests)
else (SDLMAN_RUN_TESTS)
message(STATUS "SDLMAN_RUN_TESTS OFF")
endif (SDLMAN_RUN_TESTS)