Skip to content

Commit b0341c9

Browse files
authored
Merge pull request #33 from decryptedchaos/ReXFactor
Add initial CMakeLists.txt (WIP)
2 parents e342dcf + 501a64f commit b0341c9

1 file changed

Lines changed: 215 additions & 0 deletions

File tree

CMakeLists.txt

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
cmake_minimum_required(VERSION 3.26 FATAL_ERROR)
2+
3+
project(rex_engine
4+
VERSION 4.3
5+
DESCRIPTION "Rex Game Engine"
6+
LANGUAGES C CXX
7+
)
8+
9+
# Build options
10+
option(REX_TOOLS "Build editor tools" ON)
11+
option(REX_DEV_MODE "Enable developer mode" OFF)
12+
set(REX_PLATFORM "linux" CACHE STRING "Target platform: linux, windows, macos")
13+
set(REX_BUILD_TYPE "release" CACHE STRING "Build type: debug, release_debug, release")
14+
15+
# Validate platform
16+
set(VALID_PLATFORMS "linux" "windows" "macos")
17+
list(FIND VALID_PLATFORMS "${REX_PLATFORM}" PLATFORM_INDEX)
18+
if(PLATFORM_INDEX EQUAL -1)
19+
message(FATAL_ERROR "Invalid platform: ${REX_PLATFORM}. Choose from: ${VALID_PLATFORMS}")
20+
endif()
21+
22+
# C++ Standard
23+
set(CMAKE_CXX_STANDARD 20)
24+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
25+
set(CMAKE_CXX_EXTENSIONS OFF)
26+
27+
# Directory setup
28+
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
29+
set(CORE_DIR ${SOURCE_DIR}/core)
30+
set(SERVERS_DIR ${SOURCE_DIR}/servers)
31+
set(EDITOR_DIR ${SOURCE_DIR}/editor)
32+
set(MODULES_DIR ${SOURCE_DIR}/modules)
33+
set(PLATFORM_DIR ${SOURCE_DIR}/platform)
34+
set(SCENE_DIR ${SOURCE_DIR}/scene)
35+
set(THIRDPARTY_DIR ${SOURCE_DIR}/thirdparty)
36+
37+
# Core sources
38+
file(GLOB_RECURSE CORE_SOURCES CONFIGURE_DEPENDS
39+
${CORE_DIR}/*.cpp
40+
${SERVERS_DIR}/*.cpp
41+
${SCENE_DIR}/*.cpp
42+
${THIRDPARTY_DIR}/*.c
43+
${THIRDPARTY_DIR}/*.cpp
44+
)
45+
file(GLOB_RECURSE CORE_HEADERS CONFIGURE_DEPENDS
46+
${CORE_DIR}/*.hpp
47+
${SERVERS_DIR}/*.hpp
48+
${SCENE_DIR}/*.hpp
49+
)
50+
51+
# Editor sources
52+
if(REX_TOOLS)
53+
file(GLOB_RECURSE EDITOR_SOURCES CONFIGURE_DEPENDS ${EDITOR_DIR}/*.cpp)
54+
file(GLOB_RECURSE EDITOR_HEADERS CONFIGURE_DEPENDS ${EDITOR_DIR}/*.hpp)
55+
list(APPEND CORE_SOURCES ${EDITOR_SOURCES})
56+
list(APPEND CORE_HEADERS ${EDITOR_HEADERS})
57+
endif()
58+
59+
# Platform-specific sources and defines
60+
if(REX_PLATFORM STREQUAL "linux")
61+
file(GLOB_RECURSE PLATFORM_SOURCES CONFIGURE_DEPENDS ${PLATFORM_DIR}/linuxbsd/*.cpp)
62+
set(PLATFORM_INCLUDE ${PLATFORM_DIR}/linuxbsd)
63+
set(PLATFORM_DEFINES UNIX_ENABLED X11_ENABLED OPENGL_ENABLED)
64+
elseif(REX_PLATFORM STREQUAL "windows")
65+
file(GLOB_RECURSE PLATFORM_SOURCES CONFIGURE_DEPENDS ${PLATFORM_DIR}/windows/*.cpp)
66+
set(PLATFORM_INCLUDE ${PLATFORM_DIR}/windows)
67+
set(PLATFORM_DEFINES WIN32_ENABLED NOMINMAX WIN32_LEAN_AND_MEAN OPENGL_ENABLED)
68+
elseif(REX_PLATFORM STREQUAL "macos")
69+
file(GLOB_RECURSE PLATFORM_SOURCES CONFIGURE_DEPENDS ${PLATFORM_DIR}/macos/*.cpp)
70+
set(PLATFORM_INCLUDE ${PLATFORM_DIR}/macos)
71+
set(PLATFORM_DEFINES MACOS_ENABLED OPENGL_ENABLED)
72+
endif()
73+
74+
list(APPEND CORE_SOURCES ${PLATFORM_SOURCES})
75+
76+
# Modules
77+
file(GLOB_RECURSE MODULE_SOURCES CONFIGURE_DEPENDS
78+
${MODULES_DIR}/gdscript/*.cpp
79+
${MODULES_DIR}/gridmap/*.cpp
80+
${MODULES_DIR}/navigation/*.cpp
81+
${MODULES_DIR}/visual_script/*.cpp
82+
)
83+
list(APPEND CORE_SOURCES ${MODULE_SOURCES})
84+
85+
# Third-party C sources
86+
file(GLOB_RECURSE THIRDPARTY_SOURCES CONFIGURE_DEPENDS
87+
${THIRDPARTY_DIR}/zlib/*.c
88+
${THIRDPARTY_DIR}/libpng/*.c
89+
${THIRDPARTY_DIR}/freetype/*.c
90+
${THIRDPARTY_DIR}/libogg/*.c
91+
${THIRDPARTY_DIR}/libvorbis/*.c
92+
)
93+
list(APPEND CORE_SOURCES ${THIRDPARTY_SOURCES})
94+
95+
# Define executable
96+
add_executable(rex_engine ${CORE_SOURCES} ${CORE_HEADERS})
97+
98+
# Output name
99+
set(OUTPUT_NAME "rex.${REX_PLATFORM}")
100+
if(REX_TOOLS)
101+
set(OUTPUT_NAME "${OUTPUT_NAME}.editor")
102+
else()
103+
set(OUTPUT_NAME "${OUTPUT_NAME}.opt")
104+
endif()
105+
if(REX_BUILD_TYPE MATCHES "debug")
106+
set(OUTPUT_NAME "${OUTPUT_NAME}.debug")
107+
endif()
108+
set_target_properties(rex_engine PROPERTIES OUTPUT_NAME "${OUTPUT_NAME}")
109+
110+
# Compiler flags
111+
if(MSVC)
112+
if(REX_BUILD_TYPE MATCHES "debug")
113+
target_compile_options(rex_engine PRIVATE /Od /Zi)
114+
else()
115+
target_compile_options(rex_engine PRIVATE /O2 /DNDEBUG)
116+
endif()
117+
else()
118+
if(REX_BUILD_TYPE MATCHES "debug")
119+
target_compile_options(rex_engine PRIVATE -g -O0)
120+
else()
121+
target_compile_options(rex_engine PRIVATE -O3 -DNDEBUG)
122+
endif()
123+
endif()
124+
125+
# Include directories
126+
target_include_directories(rex_engine PRIVATE
127+
${SOURCE_DIR}
128+
${CORE_DIR}
129+
${CORE_DIR}/binder
130+
${CORE_DIR}/io
131+
${CORE_DIR}/math
132+
${CORE_DIR}/os
133+
${CORE_DIR}/config
134+
${SERVERS_DIR}
135+
${SERVERS_DIR}/rendering
136+
${SERVERS_DIR}/audio
137+
${SERVERS_DIR}/physics
138+
${EDITOR_DIR}
139+
${MODULES_DIR}
140+
${MODULES_DIR}/gdscript
141+
${MODULES_DIR}/gridmap
142+
${MODULES_DIR}/navigation
143+
${MODULES_DIR}/visual_script
144+
${PLATFORM_DIR}
145+
${PLATFORM_INCLUDE}
146+
${SCENE_DIR}
147+
${SCENE_DIR}/2d
148+
${SCENE_DIR}/3d
149+
${SCENE_DIR}/animation
150+
${THIRDPARTY_DIR}
151+
${THIRDPARTY_DIR}/zlib
152+
${THIRDPARTY_DIR}/libpng
153+
${THIRDPARTY_DIR}/freetype
154+
${THIRDPARTY_DIR}/libogg
155+
${THIRDPARTY_DIR}/libvorbis
156+
)
157+
158+
# Platform-specific dependencies
159+
if(REX_PLATFORM STREQUAL "linux")
160+
find_package(X11 REQUIRED)
161+
find_package(ALSA REQUIRED)
162+
find_package(Freetype REQUIRED)
163+
find_package(PkgConfig REQUIRED)
164+
pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
165+
pkg_check_modules(LIBPULSE REQUIRED libpulse)
166+
167+
target_link_libraries(rex_engine PRIVATE
168+
${X11_LIBRARIES}
169+
${ALSA_LIBRARIES}
170+
${FREETYPE_LIBRARIES}
171+
${FONTCONFIG_LIBRARIES}
172+
${LIBPULSE_LIBRARIES}
173+
pthread
174+
dl
175+
z
176+
)
177+
elseif(REX_PLATFORM STREQUAL "windows")
178+
target_link_libraries(rex_engine PRIVATE
179+
ws2_32
180+
winmm
181+
dsound
182+
opengl32
183+
d3d9
184+
shlwapi
185+
dwmapi
186+
gdi32
187+
)
188+
elseif(REX_PLATFORM STREQUAL "macos")
189+
find_library(COCOA_LIBRARY Cocoa)
190+
find_library(IOKIT_LIBRARY IOKit)
191+
find_library(OPENGL_LIBRARY OpenGL)
192+
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
193+
find_library(AUDIOUNIT_LIBRARY AudioUnit)
194+
target_link_libraries(rex_engine PRIVATE
195+
${COCOA_LIBRARY}
196+
${IOKIT_LIBRARY}
197+
${OPENGL_LIBRARY}
198+
${COREFOUNDATION_LIBRARY}
199+
${AUDIOUNIT_LIBRARY}
200+
z
201+
)
202+
endif()
203+
204+
# Preprocessor definitions
205+
target_compile_definitions(rex_engine PRIVATE ${PLATFORM_DEFINES})
206+
207+
# Dev mode defines
208+
if(REX_DEV_MODE)
209+
target_compile_definitions(rex_engine PRIVATE DEV_ENABLED TOOLS_ENABLED)
210+
endif()
211+
212+
# Output binary directory
213+
set_target_properties(rex_engine PROPERTIES
214+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin
215+
)

0 commit comments

Comments
 (0)