Fix #8506: Towns shouldn't add junctions to NewGRF roads they cannot build (#8535)
[openttd-github.git] / CMakeLists.txt
blobd273937a3195d13770f65a7339322ab5b66a3737
1 cmake_minimum_required(VERSION 3.5)
3 if(NOT BINARY_NAME)
4     set(BINARY_NAME openttd)
5 endif()
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")
11 endif()
13 # Debug mode by default.
14 if(NOT CMAKE_BUILD_TYPE)
15     set(CMAKE_BUILD_TYPE Debug)
16 endif()
18 if (EMSCRIPTEN)
19     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/os/emscripten/cmake")
20 endif()
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")
29 endif()
30 include(GNUInstallDirs)
32 include(Options)
33 set_options()
34 set_directory_options()
36 include(Static)
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)
48 include(Endian)
49 add_endian_definition()
51 include(CompileFlags)
52 compile_flags()
54 if(APPLE OR UNIX)
55     add_definitions(-DUNIX)
56 endif()
58 if(UNIX)
59     find_package(Doxygen)
60 endif()
62 list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/rev.cpp")
63 if(WIN32)
64     list(APPEND GENERATED_SOURCE_FILES "${CMAKE_BINARY_DIR}/generated/ottdres.rc")
65 endif()
67 # Generate a target to determine version, which is execute every 'make' run
68 add_custom_target(find_version
69         ${CMAKE_COMMAND}
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}
77 # Documentation
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"
85     )
86     add_dependencies(docs_source
87         find_version
88     )
89     add_dependencies(docs
90         docs_source
91     )
92 endif()
94 include(AddCustomXXXTimestamp)
96 if(OPTION_TOOLS_ONLY)
97     if(HOST_BINARY_DIR)
98         unset(HOST_BINARY_DIR CACHE)
99     endif()
100     add_subdirectory(${CMAKE_SOURCE_DIR}/src)
101     return()
102 endif()
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)
109 find_package(ZLIB)
110 find_package(LibLZMA)
111 find_package(LZO)
112 find_package(PNG)
114 if(NOT WIN32)
115     find_package(Allegro)
116     find_package(Freetype)
117     if(NOT APPLE)
118         find_package(SDL2)
119         if(NOT SDL2_FOUND)
120             find_package(SDL)
121         endif()
122         find_package(Fluidsynth)
123         find_package(Fontconfig)
124         find_package(ICU OPTIONAL_COMPONENTS i18n lx)
125     else()
126         find_package(Iconv)
128         find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
129         find_library(AUDIOUNIT_LIBRARY AudioUnit)
130         find_library(COCOA_LIBRARY Cocoa)
131     endif()
132 endif()
134 if(MSVC)
135     find_package(Editbin REQUIRED)
136 endif()
138 find_package(SSE)
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+.
145 if(POLICY CMP0069)
146     cmake_policy(SET CMP0069 NEW)
147     include(CheckIPOSupported)
148     check_ipo_supported(RESULT IPO_FOUND)
149 endif()
151 show_options()
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")
156     endif()
157 endif()
158 if(APPLE)
159     if(NOT AUDIOTOOLBOX_LIBRARY)
160         message(FATAL_ERROR "AudioToolbox is required for this platform")
161     endif()
162     if(NOT AUDIOUNIT_LIBRARY)
163         message(FATAL_ERROR "AudioUnit is required for this platform")
164     endif()
165     if(NOT COCOA_LIBRARY)
166         message(FATAL_ERROR "Cocoa is required for this platform")
167     endif()
168 endif()
170 include(SourceList)
172 # Needed by rev.cpp
173 include_directories(${CMAKE_SOURCE_DIR}/src)
174 # Needed by everything that uses Squirrel
175 include_directories(${CMAKE_SOURCE_DIR}/src/3rdparty/squirrel/include)
177 include(MSVCFilters)
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
187     find_version)
189 target_link_libraries(openttd
190     openttd::languages
191     openttd::settings
192     openttd::basesets
193     openttd::script_api
194     Threads::Threads
197 if(IPO_FOUND)
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)
201 endif()
202 set_target_properties(openttd PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
203 process_compile_flags()
205 include(LinkPackage)
206 link_package(PNG TARGET PNG::PNG ENCOURAGED)
207 link_package(ZLIB TARGET ZLIB::ZLIB ENCOURAGED)
208 link_package(LIBLZMA TARGET LibLZMA::LibLZMA ENCOURAGED)
209 link_package(LZO)
211 if(NOT OPTION_DEDICATED)
212     link_package(Fluidsynth)
213     link_package(SDL)
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)
218     link_package(ICU_lx)
219     link_package(ICU_i18n)
220 endif()
222 if(APPLE)
223     link_package(Iconv TARGET Iconv::Iconv)
225     target_link_libraries(openttd
226         ${AUDIOTOOLBOX_LIBRARY}
227         ${AUDIOUNIT_LIBRARY}
228         ${COCOA_LIBRARY}
229     )
231     add_definitions(
232         -DWITH_COCOA
233     )
234 endif()
236 if(EMSCRIPTEN)
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)
269 endif()
271 if(NOT PERSONAL_DIR STREQUAL "(not set)")
272     add_definitions(
273         -DWITH_PERSONAL_DIR
274         -DPERSONAL_DIR="${PERSONAL_DIR}"
275     )
276 endif()
278 if(NOT SHARED_DIR STREQUAL "(not set)")
279     add_definitions(
280         -DWITH_SHARED_DIR
281         -DSHARED_DIR="${SHARED_DIR}"
282     )
283 endif()
285 if(NOT GLOBAL_DIR STREQUAL "(not set)")
286     add_definitions(
287         -DGLOBAL_DATA_DIR="${GLOBAL_DIR}"
288     )
289 endif()
291 link_package(SSE)
293 add_definitions_based_on_options()
295 if(WIN32)
296     add_definitions(
297         -DUNICODE
298         -D_UNICODE
299         -DWITH_UNISCRIBE
300     )
302     target_link_libraries(openttd
303         ws2_32
304         winmm
305         imm32
306     )
307 endif()
309 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
310     add_definitions(-D_SQ64)
311 endif()
313 include(CreateRegression)
314 create_regression()
316 include(InstallAndPackage)