-
Notifications
You must be signed in to change notification settings - Fork 231
/
CMakeLists.txt
138 lines (108 loc) · 4.91 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
cmake_minimum_required(VERSION 2.8)
# Specify default build type if none provided (before project() command)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build (Debug or Release)" FORCE)
endif()
# For generators with multiple configurations (like VS), only allow Debug and Release
if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Limited configurations" FORCE)
mark_as_advanced(CMAKE_CONFIGURATION_TYPES)
endif()
# Project name
project(sfml-book)
# Configuration options
set(SFML_STATIC_LIBRARIES FALSE CACHE BOOL "Use static SFML librares")
# General compiler options
if (SFML_STATIC_LIBRARIES)
add_definitions(-DSFML_STATIC)
endif()
# Specific compiler options - set C++11 flag for g++ and clang
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
# Mac OS X: clang uses libc++ standard library
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
endif()
endif()
#####################################################################################################################################
# Add directory containing FindSFML.cmake to module path
set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/;${CMAKE_MODULE_PATH}")
# Find SFML
# Note: SFML_STATIC_LIBRARIES determines which libraries are found by find_package()
find_package(SFML 2 COMPONENTS audio graphics window system network)
# If found, include and link; otherwise output error message
if(SFML_FOUND)
include_directories(${SFML_INCLUDE_DIR})
else()
set(SFML_ROOT "" CACHE PATH "SFML top-level directory")
message("\n-> SFML directory not found. Set SFML_ROOT to SFML's top-level path (containing \"include\" and \"lib\" directories).")
message("-> Make sure the SFML libraries with the same configuration (Release/Debug, Static/Dynamic) exist.\n")
endif()
######################################################################################################################################
# Interprets an argument list separated with keywords.
# Example:
# parse_argument_list("MY" "FIRST;SECOND" "FIRST;a;b;c;SECOND;x;y") defines the following variables:
# MY_FIRST = a;b;c
# MY_SECOND = x;y
macro(parse_argument_list PREFIX KEYWORDS ARGUMENTS)
# Indirection over KEYWORD_LIST necessary because macro parameters are no real variables.
set(KEYWORD_LIST "${KEYWORDS}")
set(CURRENT_KEYWORD "")
# Parse argument list
foreach(ARG ${ARGUMENTS})
# See if current argument is in the list of keywords
list(FIND KEYWORD_LIST "${ARG}" KEYWORD_FOUND)
if(NOT KEYWORD_FOUND EQUAL -1)
# If current element is a keyword, store it
set(CURRENT_KEYWORD ${ARG})
else()
# Append current argument to last stored keyword variable
set(${PREFIX}_${CURRENT_KEYWORD} ${${PREFIX}_${CURRENT_KEYWORD}};${ARG})
endif()
endforeach()
endmacro()
######################################################################################################################################
# Macro for chapter building
# Usage:
# build_chapter(Audio SOURCES First.cpp Second.cpp)
macro(build_chapter CHAPTER_NAME)
# Parse additional arguments (fills variables CHAPTER_SOURCES and CHAPTER_DEPENDS)
parse_argument_list("CHAPTER" "SOURCES" "${ARGN}")
# Status output
message(STATUS "-> Chapter ${CHAPTER_NAME}")
#############################################################################
# Build executable
project(${CHAPTER_NAME})
set(CHAPTER_DIR "${PROJECT_SOURCE_DIR}/..")
include_directories("${CHAPTER_DIR}//Include")
# Executable: Add only Main.cpp, set name without _EXE postfix
add_executable(${PROJECT_NAME} Main.cpp ${CHAPTER_SOURCES})
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${CHAPTER_NAME})
# Build static or shared libraries? Set chapter-specific DLL import macro
if(SFML_STATIC_LIBRARIES)
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS "SFML_STATIC")
endif()
# Link SFML. For versions < 2.2, SFML_DEPENDENCIES is not defined, and we do not need to link dependencies
if(SFML_VERSION_MINOR LESS 2)
set(SFML_DEPENDENCIES "")
endif()
target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CHAPTER_NAME})
install(DIRECTORY ${CHAPTER_DIR}/Media
DESTINATION ${PROJECT_NAME}
PATTERN "CMakeLists.txt" EXCLUDE)
endmacro()
# C++ source code, list of all subdirectories
# Must appear after macros, otherwise they are not visible in subdirectories
add_subdirectory(01_Intro/Source)
add_subdirectory(02_Resources/Source)
add_subdirectory(03_World/Source)
add_subdirectory(04_Input/Source)
add_subdirectory(05_States/Source)
add_subdirectory(06_Menus/Source)
add_subdirectory(07_Gameplay/Source)
add_subdirectory(08_Graphics/Source)
add_subdirectory(09_Audio/Source)
add_subdirectory(10_Network/Source)