2023-08-14 17:25:26 +00:00
|
|
|
function(_add_files_tgt tgt)
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
cmake_parse_arguments(PARAM "" "" "CONDITION" ${ARGN})
|
|
|
|
set(PARAM_FILES "${PARAM_UNPARSED_ARGUMENTS}")
|
|
|
|
|
2020-09-25 11:55:25 +00:00
|
|
|
if(PARAM_CONDITION)
|
|
|
|
if(NOT (${PARAM_CONDITION}))
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
return()
|
2020-09-25 11:55:25 +00:00
|
|
|
endif()
|
|
|
|
endif()
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
|
|
|
|
foreach(FILE IN LISTS PARAM_FILES)
|
2023-08-14 17:26:43 +00:00
|
|
|
# Some IDEs are not happy with duplicated filenames, so we detect that before adding the file.
|
|
|
|
get_target_property(${tgt}_FILES ${tgt} SOURCES)
|
|
|
|
if(${tgt}_FILES MATCHES "/${FILE}(;|$)")
|
|
|
|
string(REGEX REPLACE "(^|.+;)([^;]+/${FILE})(;.+|$)" "\\2" RES "${${tgt}_FILES}")
|
|
|
|
# Ignore header files duplicates in 3rdparty.
|
|
|
|
if(NOT (${FILE} MATCHES "\.h" AND (${RES} MATCHES "3rdparty" OR ${CMAKE_CURRENT_SOURCE_DIR} MATCHES "3rdparty")))
|
|
|
|
message(FATAL_ERROR "${tgt}: ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} filename is a duplicate of ${RES}")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
target_sources(${tgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
endforeach()
|
2020-09-25 11:55:25 +00:00
|
|
|
endfunction()
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
|
2023-08-14 17:25:26 +00:00
|
|
|
# Add a file to be compiled.
|
|
|
|
#
|
|
|
|
# add_files([file1 ...] CONDITION condition [condition ...])
|
|
|
|
#
|
|
|
|
# CONDITION is a complete statement that can be evaluated with if().
|
|
|
|
# If it evaluates true, the source files will be added; otherwise not.
|
|
|
|
# For example: ADD_IF SDL_FOUND AND Allegro_FOUND
|
|
|
|
#
|
|
|
|
function(add_files)
|
|
|
|
_add_files_tgt(openttd_lib ${ARGV})
|
|
|
|
endfunction()
|
|
|
|
|
2023-04-10 17:02:31 +00:00
|
|
|
# Add a test file to be compiled.
|
|
|
|
#
|
|
|
|
# add_test_files([file1 ...] CONDITION condition [condition ...])
|
|
|
|
#
|
|
|
|
# CONDITION is a complete statement that can be evaluated with if().
|
|
|
|
# If it evaluates true, the source files will be added; otherwise not.
|
|
|
|
# For example: ADD_IF SDL_FOUND AND Allegro_FOUND
|
|
|
|
#
|
|
|
|
function(add_test_files)
|
2023-08-14 17:25:26 +00:00
|
|
|
_add_files_tgt(openttd_test ${ARGV})
|
2023-04-10 17:02:31 +00:00
|
|
|
endfunction()
|
|
|
|
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
# This function works around an 'issue' with CMake, where
|
|
|
|
# set_source_files_properties() only works in the scope of the file. We want
|
|
|
|
# to set properties for the source file on a more global level. To solve this,
|
|
|
|
# this function records the flags you want, and a macro adds them in the root
|
|
|
|
# CMakeLists.txt.
|
|
|
|
# See this URL for more information on the issue:
|
|
|
|
# http://cmake.3232098.n2.nabble.com/scope-of-set-source-files-properties-td4766111.html
|
|
|
|
#
|
|
|
|
# set_compile_flags([file1 ...] COMPILE_FLAGS cflag [cflag ...])
|
|
|
|
#
|
|
|
|
function(set_compile_flags)
|
|
|
|
cmake_parse_arguments(PARAM "" "" "COMPILE_FLAGS" ${ARGN})
|
|
|
|
set(PARAM_FILES "${PARAM_UNPARSED_ARGUMENTS}")
|
|
|
|
|
|
|
|
get_property(SOURCE_PROPERTIES GLOBAL PROPERTY source_properties)
|
|
|
|
|
|
|
|
foreach(FILE IN LISTS PARAM_FILES)
|
|
|
|
list(APPEND SOURCE_PROPERTIES "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}::${PARAM_COMPILE_FLAGS}")
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
set_property(GLOBAL PROPERTY source_properties "${SOURCE_PROPERTIES}")
|
2020-09-25 11:55:25 +00:00
|
|
|
endfunction()
|
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC,
Clang, and many more. It allows for a single way of doing things,
so no longer we need shell scripts and vbs scripts to work on all
our supported platforms.
Additionally, CMake allows to generate project files for like MSVC,
KDevelop, etc.
This heavily reduces the lines of code we need to support multiple
platforms from a project perspective.
Addtiionally, this heavily improves our detection of libraries, etc.
2019-04-07 09:57:55 +00:00
|
|
|
|
|
|
|
# Call this macro in the same CMakeLists.txt and after add_executable().
|
|
|
|
# This makes sure all the COMPILE_FLAGS of set_compile_flags() are set
|
|
|
|
# correctly.
|
|
|
|
#
|
|
|
|
# process_compile_flags()
|
|
|
|
#
|
|
|
|
function(process_compile_flags)
|
|
|
|
get_property(SOURCE_PROPERTIES GLOBAL PROPERTY source_properties)
|
|
|
|
|
|
|
|
foreach(ENTRY ${SOURCE_PROPERTIES})
|
|
|
|
string(REPLACE "::" ";" ENTRY "${ENTRY}")
|
|
|
|
list(GET ENTRY 0 FILE)
|
|
|
|
list(GET ENTRY 1 PROPERTIES)
|
|
|
|
|
|
|
|
set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS ${PROPERTIES})
|
|
|
|
endforeach()
|
2020-09-25 11:55:25 +00:00
|
|
|
endfunction()
|