1 cmake_minimum_required(VERSION 3.5)
4 set(BINARY_NAME openttd)
7 project(${BINARY_NAME})
9 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
10 message(FATAL_ERROR "In-source builds not allowed. Please run \"cmake ..\" from the bin directory")
13 # Debug mode by default.
14 if(NOT CMAKE_BUILD_TYPE)
15 set(CMAKE_BUILD_TYPE Debug)
19 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/os/emscripten/cmake")
22 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
23 set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
25 # Use GNUInstallDirs to allow customisation
26 # but set our own default data dir
27 if(NOT CMAKE_INSTALL_DATADIR)
28 set(CMAKE_INSTALL_DATADIR "share/games")
30 include(GNUInstallDirs)
34 set_directory_options()
37 set_static_if_needed()
39 set(CMAKE_CXX_STANDARD 17)
40 set(CMAKE_CXX_STANDARD_REQUIRED YES)
41 set(CMAKE_CXX_EXTENSIONS NO)
43 set(CMAKE_EXPORT_COMPILE_COMMANDS YES)
45 # An empty target for the tools
46 add_custom_target(tools)
49 add_endian_definition()
55 add_definitions(-DUNIX)
62 list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp")
64 list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc")
67 # Generate a target to determine version, which is execute every 'make' run
68 add_custom_target(find_version
70 -DFIND_VERSION_BINARY_DIR=${CMAKE_BINARY_DIR}/generated
71 -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR}
72 -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake"
73 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
74 BYPRODUCTS ${GENERATED_SOURCE_FILES}
78 if(DOXYGEN_EXECUTABLE)
79 add_custom_target(docs)
80 add_custom_target(docs_source
81 ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/docs
82 COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
83 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
84 COMMENT "Generating documentation for source"
86 add_dependencies(docs_source
94 include(AddCustomXXXTimestamp)
98 unset(HOST_BINARY_DIR CACHE)
100 add_subdirectory(${CMAKE_SOURCE_DIR}/src)
104 # Prefer -pthread over -lpthread, which is often the better option of the two.
105 set(CMAKE_THREAD_PREFER_PTHREAD YES)
106 # Make sure we have Threads available.
107 find_package(Threads REQUIRED)
110 find_package(LibLZMA)
115 find_package(Allegro)
116 find_package(Freetype)
122 find_package(Fluidsynth)
123 find_package(Fontconfig)
124 find_package(ICU OPTIONAL_COMPONENTS i18n lx)
128 find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
129 find_library(AUDIOUNIT_LIBRARY AudioUnit)
130 find_library(COCOA_LIBRARY Cocoa)
135 find_package(Editbin REQUIRED)
139 find_package(Xaudio2)
141 find_package(Grfcodec)
143 # IPO is only properly supported from CMake 3.9. Despite the fact we are
144 # CMake 3.5, still enable IPO if we detect we are 3.9+.
146 cmake_policy(SET CMP0069 NEW)
147 include(CheckIPOSupported)
148 check_ipo_supported(RESULT IPO_FOUND)
153 if(UNIX AND NOT APPLE AND NOT OPTION_DEDICATED)
154 if(NOT SDL_FOUND AND NOT SDL2_FOUND)
155 message(FATAL_ERROR "SDL or SDL2 is required for this platform")
159 if(NOT AUDIOTOOLBOX_LIBRARY)
160 message(FATAL_ERROR "AudioToolbox is required for this platform")
162 if(NOT AUDIOUNIT_LIBRARY)
163 message(FATAL_ERROR "AudioUnit is required for this platform")
165 if(NOT COCOA_LIBRARY)
166 message(FATAL_ERROR "Cocoa is required for this platform")
173 include_directories(${CMAKE_SOURCE_DIR}/src)
174 # Needed by everything that uses Squirrel
175 include_directories(${CMAKE_SOURCE_DIR}/src/3rdparty/squirrel/include)
179 add_executable(openttd WIN32 ${GENERATED_SOURCE_FILES})
180 set_target_properties(openttd PROPERTIES OUTPUT_NAME "${BINARY_NAME}")
181 # All other files are added via target_sources()
183 add_subdirectory(${CMAKE_SOURCE_DIR}/src)
184 add_subdirectory(${CMAKE_SOURCE_DIR}/media/baseset)
186 add_dependencies(openttd
189 target_link_libraries(openttd
198 set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE True)
199 set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL True)
200 set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO True)
202 set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
203 process_compile_flags()
206 link_package(PNG TARGET PNG::PNG ENCOURAGED)
207 link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED)
208 link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED)
211 if(NOT OPTION_DEDICATED)
212 link_package(Fluidsynth)
214 link_package(SDL2 TARGET SDL2::SDL2)
215 link_package(Allegro)
216 link_package(FREETYPE TARGET Freetype::Freetype)
217 link_package(Fontconfig TARGET Fontconfig::Fontconfig)
219 link_package(ICU_i18n)
223 link_package(Iconv TARGET Iconv::Iconv)
225 target_link_libraries(openttd
226 ${AUDIOTOOLBOX_LIBRARY}
237 add_library(WASM::WASM INTERFACE IMPORTED)
239 # Allow heap-growth, and start with a bigger memory size.
240 target_link_libraries(WASM::WASM INTERFACE "-s ALLOW_MEMORY_GROWTH=1")
241 target_link_libraries(WASM::WASM INTERFACE "-s INITIAL_MEMORY=33554432")
242 target_link_libraries(WASM::WASM INTERFACE "-s DISABLE_EXCEPTION_CATCHING=0")
243 add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
245 # Export functions to Javascript.
246 target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
248 # Preload all the files we generate during build.
249 # As we do not compile with FreeType / FontConfig, we also have no way to
250 # render several languages (like Chinese, ..), so where do you draw the
251 # line what languages to include and which not? In the end, especially as
252 # the more languages you add the slower downloading becomes, we decided to
253 # only ship the English language.
254 target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_BINARY_DIR}/baseset@/baseset")
255 target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_BINARY_DIR}/lang/english.lng@/lang/english.lng")
256 target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_SOURCE_DIR}/bin/ai@/ai")
257 target_link_libraries(WASM::WASM INTERFACE "--preload-file ${CMAKE_SOURCE_DIR}/bin/game@/game")
259 # We use IDBFS for persistent storage.
260 target_link_libraries(WASM::WASM INTERFACE "-lidbfs.js")
262 # Use custom pre-js and shell.html.
263 target_link_libraries(WASM::WASM INTERFACE "--pre-js ${CMAKE_SOURCE_DIR}/os/emscripten/pre.js")
264 target_link_libraries(WASM::WASM INTERFACE "--shell-file ${CMAKE_SOURCE_DIR}/os/emscripten/shell.html")
266 # Build the .html (which builds the .js, .wasm, and .data too).
267 set_target_properties(openttd PROPERTIES SUFFIX ".html")
268 target_link_libraries(openttd WASM::WASM)
271 if(NOT PERSONAL_DIR STREQUAL "(not set)")
274 -DPERSONAL_DIR="${PERSONAL_DIR}"
278 if(NOT SHARED_DIR STREQUAL "(not set)")
281 -DSHARED_DIR="${SHARED_DIR}"
285 if(NOT GLOBAL_DIR STREQUAL "(not set)")
287 -DGLOBAL_DATA_DIR="${GLOBAL_DIR}"
293 add_definitions_based_on_options()
302 target_link_libraries(openttd
309 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
310 add_definitions(-D_SQ64)
313 include(CreateRegression)
316 include(InstallAndPackage)