Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign upIntroduce CMake (and removing all other project-related code) #7270
Conversation
This comment has been minimized.
This comment has been minimized.
If CMake becomes the only (meta) build system, wouldn't it make sense to scrap the source.list file as well, and define that data via CMake syntax instead? |
This comment has been minimized.
This comment has been minimized.
For MinGW directmusic and xaudio2 needs to be detected. MinGW has directmusic headers, but doesn't have xaudio2. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Just to clarify, if you manually copy over an xaudio2 header file then mingw should be happy with it - I did test that when I wrote it. |
This comment has been minimized.
This comment has been minimized.
I kept the manifest in projects, but it should probably move somewhere else |
This comment has been minimized.
This comment has been minimized.
For now we rely on cmake default CMAKE_CONFIGURATION_TYPES and CMAKE_XXXXX_FLAGS_<CONFIG>, but it should be better to manage that by ourselves |
This comment has been minimized.
This comment has been minimized.
I disagree. The closer we stay to CMake, the easier our life will be. Let's try to do this, and only add exceptions if we really need to (and mark them as such). Otherwise we will have a config.lib in no time :D |
This comment has been minimized.
This comment has been minimized.
Indeed something is wrong in the generated project file for lzo and lzma AdditionalDependencies for Debug: |
This comment has been minimized.
This comment has been minimized.
hmm that's weird, OSX cmake step now pass, lzo is found, compilation fails because it doesn't find an lzo header |
This comment has been minimized.
This comment has been minimized.
Ok there's an issue with lzo detection, I can compile with MinGW by luck, as the detected
is covered by H:/msys64/mingw64/include from other libs.
is alone |
6164e63
to
a25c911
This comment has been minimized.
This comment has been minimized.
Stupid me failing in the commit message. BTW I think test task for MacOS should probably be "make -C build test". |
e5b7c05
to
d71ac0a
This comment has been minimized.
This comment has been minimized.
regression works with MinGW without converting the exe, but it fails with many
I guess the lovely regex was needed :) |
This comment has been minimized.
This comment has been minimized.
Yeah, but I refused to do that unreadable regex; so now I am just adding them one case at the time :D |
823f76d
to
027a5b3
3d63911
to
9414548
87f9307
to
eed958c
This comment has been minimized.
This comment has been minimized.
When doing the rebase I decided to conditionally exclude some library detection for windows as FreeType takes precedence over GDI, and its development files can be present on the system even if we don't want to use it. |
208df51
to
995bf50
This comment has been minimized.
This comment has been minimized.
fsimonis
commented
Jul 19, 2019
I may be a bit late to the party, but I started a CMake port of OpenTTD about one year ago. After reading his Trello board, I attempted to contact @TrueBrain back then via Gitter to join forces, but that sadly never happened. You can find my version on my fork. I stopped the port when I hit the wall of supporting all the OSes. Some of which CMake isn't even aware of. Some lessons I have learned and general feedback to this port:
Thank you for doing this port! |
This comment has been minimized.
This comment has been minimized.
DerDakon
commented
Jul 19, 2019
Regarding your first concern, I suggest having a look at I agree on 2 and 3, and have no opinion about the others. |
bundle/* | ||
bundles/* | ||
docs/aidocs/* | ||
docs/gamedocs/* | ||
docs/source/* | ||
.kdev4 | ||
.kdev4/* | ||
*.kdev4 |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
I would keep at least *.kdev4, this would still be relevant when importing the CMake project into KDevelop.
This comment has been minimized.
This comment has been minimized.
glx22
Jul 19, 2019
Contributor
That can be handle in the local gitignore. I see no real need to put it globally.
@@ -0,0 +1,12 @@ | |||
# Make the current version available to CPack | |||
set(CPACK_PACKAGE_VERSION "@REV_VERSION@") |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
It should be enough if you call project(OpenTTD VERSION 5.6.7)
at the top level, that would make the variable OpenTTD_VERSION
available, also to CPack.
This comment has been minimized.
This comment has been minimized.
fsimonis
Aug 14, 2019
The REV_VERSION
is based on the git tag(project version) or the git commit and can change between builds.
This is not pretty but necessary to make CPack behave correctly.
This comment has been minimized.
This comment has been minimized.
DerDakon
Aug 14, 2019
Please not that this will usually not change between builds: CMake will not notice if your git status has changed, so it will not rerun CMake, so it will not rerun your execute_process()
.
# autodetect_editbin() | ||
# | ||
function(autodetect_editbin) | ||
if (DEFINED EDITBIN_FOUND) |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
You could just check on EDITBIN_EXECUTABLE here, CMake will automatically put that into cache in find_program(). And apart from the messages you do not need to guard this, if the variable is already set find_program() will just do nothing.
This comment has been minimized.
This comment has been minimized.
fsimonis
Jul 22, 2019
We could refactor this entire function into very small and simple find module. Then one could use the more CMakeish find_package(EDITBIN)
.
You can have a look at the FindCCACHE
on my fork for a minimal example.
This also keeps the error messages consistent with other find modules.
message(STATUS "Detecting editbin - found") | ||
|
||
# Make sure these values are cached properly | ||
set(EDITBIN_FOUND YES CACHE INTERNAL "") |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
If you want to have this variable after all simply not cache it: the find_program() call will do nothing, EDITBIN_EXECUTABLE is set, so this variable get's set to YES anyway. No need to clutter the cache with it.
|
||
# Check if any of the argument is ENCOURAGED | ||
list(FIND args ENCOURAGED ENCOURAGED) | ||
if (ENCOURAGED LESS 0) |
This comment has been minimized.
This comment has been minimized.
set(DEFAULT_SHARED_DIR "(not set)") | ||
set(DEFAULT_GLOBAL_DIR "${CMAKE_INSTALL_PREFIX}/share/games/openttd") | ||
else () | ||
message(FATAL_ERROR "Unknown OS found; please consider creating a Pull Request to add support for this OS.") |
This comment has been minimized.
This comment has been minimized.
endif (NOT (${PARAM_CONDITION})) | ||
endif (PARAM_CONDITION) | ||
|
||
foreach(FILE ${PARAM_FILES}) |
This comment has been minimized.
This comment has been minimized.
set(PARAM_FILES "${PARAM_UNPARSED_ARGUMENTS}") | ||
|
||
if (PARAM_CONDITION) | ||
if (NOT (${PARAM_CONDITION})) |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
Why this? I don't think you can ever reach the inner return()
as an empty variable is just false.
|
||
get_property(SOURCE_PROPERTIES GLOBAL PROPERTY source_properties) | ||
|
||
foreach(FILE ${PARAM_FILES}) |
This comment has been minimized.
This comment has been minimized.
|
||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) | ||
message(FATAL_ERROR "In-source builds not allowed. Please run \"cmake ..\" from the bin directory") | ||
endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) |
This comment has been minimized.
This comment has been minimized.
DerDakon
Jul 19, 2019
•
I probably have said this before, but just remove the arguments to all end*() calls. It makes code much easier to maintain.
This comment has been minimized.
This comment has been minimized.
fsimonis
commented
Jul 22, 2019
@DerDakon I have the feeling that we are talking past each other. Explicit dependencies vs autodetectionMy actual concern is that we should use explicit bindings options for dependencies. Autodetecting every library makes life more difficult for packagers and developer. Here my reasoning:
I propose to do the following:
Example for zlib: # Options
option(OPENTTD_ZLIB "Enable ZLib" ON`)
add_feature_info(ZLib OPENTTD_ZLIB "Required for (de)compressing of old (0.3.0-1.0.5) savegames, content downloads, and heightmaps.")
# ...
# Package discovery
if(OPENTTD_ZLIB)
find_package(ZLIB REQUIRED)
endif()
# ... Running CMake without a preset of features will likely fail during the first configuration attempt, but then provide a full list of options to Feature set using pre-cache populationExample: lets consider the different compression libraries used in OpenTTD. Then the options and the defaults for those features could look as follows:
So for Ubuntu 18.04 we know that all libraries are available, thus we could explicitly enable them as such: # linux-ubuntu-1804.cmake
set(OPENTTD_ZLIB ON CACHE BOOLEAN "")
set(OPENTTD_LIBLZO2 ON CACHE BOOLEAN "")
set(OPENTTD_LIBZLMA ON CACHE BOOLEAN "") On some other system, # some-other-system.cmake
set(OPENTTD_ZLIB ON CACHE BOOLEAN "")
set(OPENTTD_LIBLZO2 OFF CACHE BOOLEAN "")
set(OPENTTD_LIBZLMA ON CACHE BOOLEAN "") This way, the CI configuration for a specific distro boils down to: |
This comment has been minimized.
This comment has been minimized.
DerDakon
commented
Jul 22, 2019
I would use options for feature sets, and based on that require on or another library. Even if Ubuntu has Lzo2, it doesn't mean that the user has it installed. What you could do is to give the user a list of packages for a given distro that should ideally be installed. |
This comment has been minimized.
This comment has been minimized.
fsimonis
commented
Aug 10, 2019
•
So a possible feature-set based on the README would look like this:
@DerDakon Is that what you had in mind? |
This comment has been minimized.
This comment has been minimized.
DerDakon
commented
Aug 10, 2019
Basically. And the code for that could look like this: unset(zlib_required)
option(OPENTTD_SAVEGAME_OLD "foo" Off)
option(OPENTTD_HEIGHTMAP "bar" On)
if (OPENTTD_HEIGHTMAP OR OPENTTD_SAVEGAME_OLD OR …)
set(zlib_required "REQUIRED")
endif()
find_package(ZLIB ${zlib_required}) |
This comment has been minimized.
This comment has been minimized.
This prepares for the switch to CMake, which takes over all current exisiting forms of project files.
… script The tst_stationlist savegame had to be changed to start the correct AI. In the old setup, all regression AIs had the same name, which made it impossible to run both regressions in parallel. With the new setup this is possible. Although all files are available to run the regression, it won't really work till CMake is introduced (which will happen in a few commits from here)
For grfs, it now uses CMake scripts to do its job, and both grf files are split into their own folder to make more clear what is going on. Additionally, it no longer builds in-source (although the resulting grf is copied back in the source folder). For ob[msg] it now uses CMake scripts to generate the translation files; the result is no longer stored in-source (but in the build folder). Although all files are available to create the GRFs and basesets, it won't really work till CMake is introduced (which will happen in a few commits from here)
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.
CPack works closely together with CMake to do the right thing in terms of bundling (called 'package'). This generates all the packaging we need, and some more.
This also means dropping Debian/jessie, as it has a CMake that is too old (3.0), with no real path to upgrade.
With CMake, these files are simply not compiled to start with.
TrueBrain commentedFeb 23, 2019
•
edited
Fixes #6884
Fixes #7470
Stable release build
Nightly release build
This removes:
It replaces them all with a single method: cmake. This should also remove any awk/vbs scripts we have around, meaning we will get a single method of doing stuff.
Currently tested with these 'IDEs':
This is pretty much a Work In Progress, but I wanted to show others how it would look etc, so they can also test already a bit. Any feedback is welcome.
To test it out:
Or open the CMakeLists.txt in VS2017 / VS2019.
Things still to do:
autodetect TiMiditity(libtimidity is no longer available on most OSes)Currently it is calling
findversion.sh
, which only works on non-Windows. Porting it to CMake makes more sense (one single way of doing stuff).add static builds(no static builds for now; we might reconsider later)(I am sure I am missing stuff .. but this is something to work on at least :D)