-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
320 lines (284 loc) · 11.2 KB
/
CMakeLists.txt
File metadata and controls
320 lines (284 loc) · 11.2 KB
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
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
cmake_minimum_required(VERSION 3.20)
# Verify CMake version
if(${CMAKE_VERSION} VERSION_LESS 3.20)
message(FATAL_ERROR "CMake version ${CMAKE_VERSION} is too old. Version 3.20 or higher is required.")
endif()
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(WIN32)
# Download and set up vcpkg
set(VCPKG_DIR "${CMAKE_SOURCE_DIR}/vcpkg")
if(NOT EXISTS "${VCPKG_DIR}/scripts/buildsystems/vcpkg.cmake")
message(STATUS "vcpkg directory not found at ${VCPKG_DIR}. Installing vcpkg...")
find_package(Git REQUIRED)
execute_process(
COMMAND ${GIT_EXECUTABLE} clone https://github.com/microsoft/vcpkg.git ${VCPKG_DIR}
RESULT_VARIABLE GIT_CLONE_RESULT
OUTPUT_VARIABLE GIT_CLONE_OUTPUT
ERROR_VARIABLE GIT_CLONE_ERROR
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
if(NOT GIT_CLONE_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to clone vcpkg. Git output: ${GIT_CLONE_OUTPUT}, Error: ${GIT_CLONE_ERROR}")
endif()
execute_process(
COMMAND ${VCPKG_DIR}/bootstrap-vcpkg.bat
RESULT_VARIABLE BOOTSTRAP_RESULT
OUTPUT_VARIABLE BOOTSTRAP_OUTPUT
ERROR_VARIABLE BOOTSTRAP_ERROR
WORKING_DIRECTORY ${VCPKG_DIR}
)
if(NOT BOOTSTRAP_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to bootstrap vcpkg. Output: ${BOOTSTRAP_OUTPUT}, Error: ${BOOTSTRAP_ERROR}")
endif()
endif()
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_DIR}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
set(VCPKG_TARGET_TRIPLET x64-windows CACHE STRING "Vcpkg target triplet")
# Verify vcpkg executable exists
if(NOT EXISTS "${VCPKG_DIR}/vcpkg.exe")
message(FATAL_ERROR "vcpkg executable not found at ${VCPKG_DIR}/vcpkg.exe. Bootstrap may have failed.")
endif()
# Explicitly add vcpkg installed directory to CMAKE_PREFIX_PATH
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_DIR}/installed/x64-windows/share")
# Debug toolchain and paths
message(STATUS "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
# Define project
project(2DGameEngine LANGUAGES CXX)
# Automatically install required vcpkg packages
set(VCPKG_REQUIRED_PACKAGES zlib libpng SDL2 SDL2-ttf SDL2-image SDL2-mixer lua imgui glm)
foreach(PACKAGE ${VCPKG_REQUIRED_PACKAGES})
execute_process(
COMMAND ${VCPKG_DIR}/vcpkg.exe install ${PACKAGE}:${VCPKG_TARGET_TRIPLET}
RESULT_VARIABLE VCPKG_INSTALL_RESULT
OUTPUT_VARIABLE VCPKG_INSTALL_OUTPUT
ERROR_VARIABLE VCPKG_INSTALL_ERROR
WORKING_DIRECTORY ${VCPKG_DIR}
)
if(NOT VCPKG_INSTALL_RESULT EQUAL 0)
message(FATAL_ERROR
"Failed to install vcpkg package '${PACKAGE}' for triplet '${VCPKG_TARGET_TRIPLET}'.\n"
"Output:\n${VCPKG_INSTALL_OUTPUT}\nError:\n${VCPKG_INSTALL_ERROR}"
)
endif()
message(STATUS "Installed vcpkg package '${PACKAGE}' for triplet '${VCPKG_TARGET_TRIPLET}'")
endforeach()
# Find vcpkg-installed packages
find_package(ZLIB REQUIRED)
find_package(PNG REQUIRED)
find_package(SDL2 CONFIG REQUIRED)
find_package(SDL2_ttf CONFIG REQUIRED)
find_package(SDL2_image CONFIG REQUIRED)
find_package(SDL2_mixer CONFIG REQUIRED)
find_package(Lua REQUIRED)
find_package(imgui CONFIG REQUIRED)
find_package(glm CONFIG REQUIRED)
find_package(sol2 CONFIG QUIET)
if(NOT sol2_FOUND)
include(FetchContent)
FetchContent_Declare(
sol2
GIT_REPOSITORY https://github.com/ThePhD/sol2.git
GIT_TAG v3.3.0 # Adjust to desired version
)
FetchContent_MakeAvailable(sol2)
# The FetchContent approach creates a target named 'sol2' or 'sol2::sol2'
# depending on how the sol2 CMakeLists is structured (some versions
# may just provide headers). You might need to adjust as required.
endif()
# Collect source files
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS
"${CMAKE_SOURCE_DIR}/src/*.c"
"${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/src/**/*.c"
"${CMAKE_SOURCE_DIR}/src/**/*.cpp"
)
message(STATUS "Source files: ${SOURCE_FILES}")
##################################################################################
## TESTING ##
# Enable testing
enable_testing()
add_library(MyLoggerLib STATIC
src/Logger/Logger.cpp
# Add more logger-related .cpp files if you have them
)
target_include_directories(MyLoggerLib PUBLIC
"${CMAKE_SOURCE_DIR}/src/Logger"
)
# Create an executable for your LoggerTest
add_executable(LoggerTest
tests/LoggerTest.cpp
)
target_link_libraries(LoggerTest PRIVATE MyLoggerLib)
# Register the test with CTest so you can run it using ctest
add_test(NAME LoggerTest COMMAND LoggerTest)
##################################################################################
# Create executable
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
# Link libraries
target_link_libraries(${PROJECT_NAME} PRIVATE
SDL2::SDL2 SDL2::SDL2main
SDL2_ttf::SDL2_ttf
SDL2_image::SDL2_image
SDL2_mixer::SDL2_mixer
${LUA_LIBRARIES}
imgui::imgui
glm::glm
ZLIB::ZLIB
PNG::PNG
sol2::sol2
)
# Include directories
target_include_directories(${PROJECT_NAME} PRIVATE
"${CMAKE_SOURCE_DIR}/src"
${LUA_INCLUDE_DIR}
)
file(COPY ${CMAKE_SOURCE_DIR}/assets DESTINATION ${CMAKE_BINARY_DIR})
endif ()
# macOS-specific dependency management with Homebrew
if(APPLE)
# Find Homebrew prefix
execute_process(
COMMAND brew --prefix
OUTPUT_VARIABLE BREW_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Set paths for Homebrew-installed libraries
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/sdl2/lib/cmake/SDL2")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/sdl2_ttf/lib/cmake/SDL2_ttf")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/sdl2_image/lib/cmake/SDL2_image")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/sdl2_mixer/lib/cmake/SDL2_mixer")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/lua")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/glm")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/imgui")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/libpng")
list(APPEND CMAKE_PREFIX_PATH "${BREW_PREFIX}/opt/zlib")
# Debug paths
message(STATUS "Homebrew prefix: ${BREW_PREFIX}")
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
endif()
if(UNIX AND NOT APPLE)
# Define required system packages
set(REQUIRED_PACKAGES
build-essential
libsdl2-dev
libsdl2-image-dev
libsdl2-ttf-dev
libsdl2-mixer-dev
libglm-dev
liblua5.3-dev
nlohmann-json3-dev
sol2-dev
)
# Find pkg-config
find_package(PkgConfig REQUIRED)
if(NOT PkgConfig_FOUND)
list(APPEND MISSING_PACKAGES "pkgconf")
else()
# Debug: Show pkg-config search path
execute_process(COMMAND pkg-config --variable pc_path pkg-config
OUTPUT_VARIABLE PKG_CONFIG_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "pkg-config search path: ${PKG_CONFIG_PATH}")
endif()
# Check for system-installed dependencies without failing immediately
set(MISSING_PACKAGES "")
pkg_check_modules(SDL2 QUIET sdl2)
if(SDL2_FOUND)
message(STATUS "Found sdl2: version ${SDL2_VERSION}")
else()
list(APPEND MISSING_PACKAGES "libsdl2-dev")
endif()
pkg_check_modules(SDL2_IMAGE QUIET SDL2_image)
if(SDL2_IMAGE_FOUND)
message(STATUS "Found SDL2_image: version ${SDL2_IMAGE_VERSION}")
else()
list(APPEND MISSING_PACKAGES "libsdl2-image-dev")
endif()
pkg_check_modules(SDL2_TTF QUIET SDL2_ttf)
if(SDL2_TTF_FOUND)
message(STATUS "Found SDL2_ttf: version ${SDL2_TTF_VERSION}")
else()
list(APPEND MISSING_PACKAGES "libsdl2-ttf-dev")
endif()
pkg_check_modules(SDL2_MIXER QUIET SDL2_mixer)
if(SDL2_MIXER_FOUND)
message(STATUS "Found SDL2_mixer: version ${SDL2_MIXER_VERSION}")
else()
list(APPEND MISSING_PACKAGES "libsdl2-mixer-dev")
endif()
pkg_check_modules(GLM QUIET glm)
if(GLM_FOUND)
message(STATUS "Found glm: version ${GLM_VERSION}")
else()
list(APPEND MISSING_PACKAGES "libglm-dev")
endif()
pkg_check_modules(LUA QUIET lua5.3)
if(LUA_FOUND)
message(STATUS "Found lua5.3: version ${LUA_VERSION}")
else()
list(APPEND MISSING_PACKAGES "liblua5.3-dev")
endif()
# Check for build-essential (basic check for gcc/g++)
find_program(GCC gcc)
find_program(GXX g++)
if(NOT GCC OR NOT GXX)
list(APPEND MISSING_PACKAGES "build-essential")
else()
message(STATUS "Found gcc: ${GCC}")
message(STATUS "Found g++: ${GXX}")
endif()
# Include ImGui (header-only, fetch via FetchContent)
include(FetchContent)
FetchContent_Declare(
imgui
GIT_REPOSITORY https://github.com/ocornut/imgui.git
GIT_TAG v1.91.4
)
FetchContent_MakeAvailable(imgui)
# Handle missing packages
if(MISSING_PACKAGES)
# Join package list with spaces for apt-get
string(REPLACE ";" " " MISSING_PACKAGES_STR "${MISSING_PACKAGES}")
message(WARNING "The following system packages are missing: ${MISSING_PACKAGES_STR}")
message(FATAL_ERROR
"Required packages are missing. Install them with:\n"
" sudo apt-get update\n"
" sudo apt-get install -y ${MISSING_PACKAGES_STR}\n"
"Then re-run CMake."
)
endif()
# Define project
project(2DGameEngine LANGUAGES CXX)
# Collect source files
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS
"${CMAKE_SOURCE_DIR}/src/*.c"
"${CMAKE_SOURCE_DIR}/src/*.cpp"
"${CMAKE_SOURCE_DIR}/src/**/*.c"
"${CMAKE_SOURCE_DIR}/src/**/*.cpp"
)
# Create executable
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
# Link libraries using pkg-config results
target_link_libraries(${PROJECT_NAME} PRIVATE
${SDL2_LIBRARIES}
${SDL2_IMAGE_LIBRARIES}
${SDL2_TTF_LIBRARIES}
${SDL2_MIXER_LIBRARIES}
${GLM_LIBRARIES}
${LUA_LIBRARIES}
)
# Include directories using pkg-config results
target_include_directories(${PROJECT_NAME} PRIVATE
"${CMAKE_SOURCE_DIR}/src"
${SDL2_INCLUDE_DIRS}
${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_TTF_INCLUDE_DIRS}
${SDL2_MIXER_INCLUDE_DIRS}
${GLM_INCLUDE_DIRS}
${LUA_INCLUDE_DIRS}
${imgui_SOURCE_DIR}
)
endif()