-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCMakeLists.txt
258 lines (220 loc) · 9.15 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
cmake_minimum_required(VERSION 3.17)
set(CMAKE_CXX_STANDARD 17)
set(ZENITH_LIB Zenith)
set(ENGINE_DIRECTORY ${CMAKE_SOURCE_DIR}/Engine)
project(${ZENITH_LIB})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ENGINE_DIRECTORY}/_Bin/build)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ENGINE_DIRECTORY}/_Bin/build)
option(DEVELOPMENT "Generate a development build" OFF)
set(USER_PROJECT_NAME "" CACHE STRING "Name of user project to generate")
add_definitions(-DENGINE_ROOT="${ENGINE_DIRECTORY}")
if (MSVC)
add_definitions(/MP)
endif()
if(DEVELOPMENT)
add_compile_definitions(DEV_BUILD)
endif(DEVELOPMENT)
include(${ENGINE_DIRECTORY}/CMakeLists.txt)
set(SOURCES ${ENGINE_SOURCES})
set(INCLUDES ${ENGINE_INCLUDES})
if (NOT HEADLESS)
include(${ENGINE_DIRECTORY}/_Editor/CMakeLists.txt)
list(APPEND SOURCES ${EDITOR_SOURCES})
list(APPEND INCLUDES ${EDITOR_INCLUDES})
endif()
if (USER_PROJECT_NAME)
add_library(${ZENITH_LIB} ${SOURCES})
else()
add_executable(${ZENITH_LIB} ${SOURCES})
endif()
target_include_directories(${ZENITH_LIB} PUBLIC ${INCLUDES})
if (NOT DEVELOPMENT)
file(GLOB RESOURCE_FILES
"*.zip"
)
foreach(FILE ${RESOURCE_FILES})
get_filename_component(FILENAME ${FILE} NAME)
add_custom_command(TARGET ${ZENITH_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${FILE} ${ENGINE_DIRECTORY}/_Bin/${FILENAME}
)
endforeach()
endif()
if (APPLE)
find_library(GLEW_LIB NAMES GLEW GLEWd HINTS "${DARWIN_LIB_DIR}")
find_library(GLFW_LIB NAMES glfw HINTS "${DARWIN_LIB_DIR}")
find_library(BZ2_LIB NAMES bz2 HINTS "${DARWIN_LIB_DIR}")
find_library(ZLIB_LIB NAMES z HINTS "${DARWIN_LIB_DIR}")
find_library(ASSIMP_LIB NAMES assimp HINTS "${DARWIN_LIB_DIR}")
find_library(LINEARMATH_BULLET_LIB NAMES LinearMath HINTS "${DARWIN_LIB_DIR}")
find_library(BULLETCOLLISION_BULLET_LIB NAMES BulletCollision HINTS "${DARWIN_LIB_DIR}")
find_library(BULLETDYNAMICS_BULLET_LIB NAMES BulletDynamics HINTS "${DARWIN_LIB_DIR}")
find_library(BULLETINVERSEDYNAMICS_BULLET_LIB NAMES BulletInverseDynamics HINTS "${DARWIN_LIB_DIR}")
find_library(BULLETSOFTBODY_BULLET_LIB NAMES BulletSoftBody HINTS "${DARWIN_LIB_DIR}")
find_library(FREETYPE_LIB NAMES freetyped HINTS "${DARWIN_LIB_DIR}")
find_library(ZIP_LIB NAMES zip HINTS "${DARWIN_LIB_DIR}")
find_library(LUA_LIB NAMES lua HINTS "${DARWIN_LIB_DIR}")
find_library(CPPFS_LIB NAMES cppfsd HINTS "${DARWIN_LIB_DIR}")
find_library(OGG_LIB NAMES ogg HINTS "${DARWIN_LIB_DIR}")
find_library(VORBIS_LIB NAMES vorbis HINTS "${DARWIN_LIB_DIR}")
find_library(VORBISFILE_LIB NAMES vorbisfile HINTS "${DARWIN_LIB_DIR}")
find_library(OPENAL_LIB NAMES openal HINTS "${DARWIN_LIB_DIR}")
set(LINKED_LIBS
"-framework Cocoa"
"-framework OpenGL"
"-framework IOKit"
"-framework CoreVideo"
"-framework CoreFoundation"
${GLEW_LIB}
${GLFW_LIB}
${CPPFS_LIB}
${BZ2_LIB}
${ZLIB_LIB}
${FREETYPE_LIB}
${ZIP_LIB}
${LUA_LIB}
${ASSIMP_LIB}
${LINEARMATH_BULLET_LIB}
${BULLETCOLLISION_BULLET_LIB}
${BULLETDYNAMICS_BULLET_LIB}
${BULLETINVERSEDYNAMICS_BULLET_LIB}
${BULLETSOFTBODY_BULLET_LIB}
${OGG_LIB}
${VORBIS_LIB}
${VORBISFILE_LIB}
${OPENAL_LIB})
target_link_libraries(${ZENITH_LIB} ${LINKED_LIBS})
add_custom_command(
TARGET ${ZENITH_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine"
COMMENT "create directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine"
)
set (source "${ENGINE_DIRECTORY}/_Assets")
set (destination "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine/_Assets")
add_custom_command(
TARGET ${ZENITH_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${source} ${destination}
DEPENDS ${destination}
COMMENT "symbolically link engine assets folder from ${source} => ${destination}"
)
add_custom_command(TARGET ${ZENITH_LIB} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${DARWIN_LIB_DIR}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>"
)
if (NOT HEADLESS)
add_custom_command(
TARGET ${ZENITH_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine/_Editor"
COMMENT "create directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine/_Editor"
)
SET(source "${ENGINE_DIRECTORY}/_Editor/_Assets")
SET(destination "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Engine/_Editor/_Assets")
add_custom_command(
TARGET ${ZENITH_LIB} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${source} ${destination}
DEPENDS ${destination}
COMMENT "symbolically link editor assets folder from ${source} => ${destination}"
)
endif()
elseif (WIN32)
find_package(OpenGL REQUIRED)
find_library(GLEW_LIB NAMES glew32 HINTS "${WINDOWS_LIB_DIR}")
find_library(GLFW_LIB NAMES glfw3 HINTS "${WINDOWS_LIB_DIR}")
find_library(BZ2_LIB NAMES bzip2 HINTS "${WINDOWS_LIB_DIR}")
find_library(ZLIB_LIB NAMES zlibstaticd HINTS "${WINDOWS_LIB_DIR}")
find_library(ASSIMP_LIB NAMES assimp HINTS "${WINDOWS_LIB_DIR}")
find_library(LINEARMATH_BULLET_LIB NAMES LinearMath HINTS "${WINDOWS_LIB_DIR}")
find_library(BULLETCOLLISION_BULLET_LIB NAMES BulletCollision HINTS "${WINDOWS_LIB_DIR}")
find_library(BULLETDYNAMICS_BULLET_LIB NAMES BulletDynamics HINTS "${WINDOWS_LIB_DIR}")
find_library(BULLETINVERSEDYNAMICS_BULLET_LIB NAMES BulletInverseDynamics HINTS "${WINDOWS_LIB_DIR}")
find_library(BULLETSOFTBODY_BULLET_LIB NAMES BulletSoftBody HINTS "${WINDOWS_LIB_DIR}")
find_library(FREETYPE_LIB NAMES freetyped HINTS "${WINDOWS_LIB_DIR}")
find_library(ZIP_LIB NAMES zip HINTS "${WINDOWS_LIB_DIR}")
find_library(LUA_LIB NAMES lua54 HINTS "${WINDOWS_LIB_DIR}")
find_library(CPPFS_LIB NAMES cppfsd HINTS "${WINDOWS_LIB_DIR}")
find_library(OGG_LIB NAMES ogg_static libogg_static HINTS "${WINDOWS_LIB_DIR}")
find_library(VORBIS_LIB NAMES vorbis_static libvorbis_static HINTS "${WINDOWS_LIB_DIR}")
find_library(VORBISFILE_LIB NAMES vorbisfile_static libvorbisfile_static HINTS "${WINDOWS_LIB_DIR}")
find_library(OPENAL_LIB NAMES OpenAL32 HINTS "${WINDOWS_LIB_DIR}")
set(LINKED_LIBS
${OPENGL_LIBRARY}
gdi32
${GLEW_LIB}
${GLFW_LIB}
${CPPFS_LIB}
${BZ2_LIB}
${ZLIB_LIB}
${FREETYPE_LIB}
${ZIP_LIB}
${LUA_LIB}
${ASSIMP_LIB}
${LINEARMATH_BULLET_LIB}
${BULLETCOLLISION_BULLET_LIB}
${BULLETDYNAMICS_BULLET_LIB}
${BULLETINVERSEDYNAMICS_BULLET_LIB}
${BULLETSOFTBODY_BULLET_LIB}
${OGG_LIB}
${VORBIS_LIB}
${VORBISFILE_LIB}
${OPENAL_LIB})
target_link_libraries(${ZENITH_LIB} ${LINKED_LIBS})
add_custom_command(TARGET ${ZENITH_LIB} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${WINDOWS_LIB_DIR}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>"
)
endif (APPLE)
foreach(FILE ${SOURCES})
get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")
string(REPLACE "/" "\\" GROUP "${GROUP}")
source_group("${GROUP}" FILES "${FILE}")
endforeach()
if (USER_PROJECT_NAME AND (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${USER_PROJECT_NAME}"))
# Generate project files and directories
file(MAKE_DIRECTORY ${USER_PROJECT_NAME})
file(MAKE_DIRECTORY ${USER_PROJECT_NAME}/Headers)
file(MAKE_DIRECTORY ${USER_PROJECT_NAME}/Source)
file(MAKE_DIRECTORY ${USER_PROJECT_NAME}/Assets)
file(TOUCH ${USER_PROJECT_NAME}/Assets/scene.zof)
file(TOUCH ${USER_PROJECT_NAME}/Headers/Game.hpp)
file(WRITE ${USER_PROJECT_NAME}/Source/Game.cpp
"#include \"ZServices.hpp\"
#include \"ZGame.hpp\"
#include \"ZScene.hpp\"
#include \"ZSceneReadyEvent.hpp\"
#include \"ZInput.hpp\"
#include \"ZAssetStore.hpp\"
void onSceneLoad(std::shared_ptr<ZSceneReadyEvent> event);
int main(int argc, const char* argv[]) {
// Create a new game instance
std::shared_ptr<ZGame> game = std::make_shared<ZGame>();
// Initialize the engine before anything else
ZGameOptions gameOptions;
gameOptions.domain.width = 800;
gameOptions.domain.height = 600;
gameOptions.domain.maximized = false;
game->Initialize(gameOptions);
// Ater initializing the engine, we can access the underlying UI subsystem to register fonts
ZServices::AssetStore()->RegisterFont(\"/Fonts/earth_orbiter/earthorbiter.ttf\");
// Load a default scene from the engine
ZScene::LoadIn({ \"/demo_scene.zof\" });
// Register delegate methods for specific UI events
ZServices::EventAgent()->Subscribe(&onSceneLoad);
// Free up window cursor. It is captured by default.
ZServices::Input()->ReleaseCursor();
// Create the game and start the main game loop. Nothing beyond this point will execute
// for the duration of the game.
game->Loop();
// Make sure to clean up all resources after we're done
game->CleanUp();
return 0;
}
void onSceneLoad(std::shared_ptr<ZSceneReadyEvent> event)
{
LOG(\"Scene '\" + event->Scene()->Name() + \"' loaded\", ZSeverity::Info);
event->Scene()->Play();
}")
# Generate user CMakeLists.txt
file(STRINGS ${CMAKE_SOURCE_DIR}/CMakeLists.user.txt USER_CMAKELISTS)
string(REPLACE ";" "\r\n" USER_CMAKELISTS "${USER_CMAKELISTS}")
file(CONFIGURE OUTPUT ${CMAKE_SOURCE_DIR}/${USER_PROJECT_NAME}/CMakeLists.txt
CONTENT ${USER_CMAKELISTS} @ONLY
NEWLINE_STYLE CRLF)
endif()