Hello Mesos developers,
I wanted to take the time to announce a (long) patch chain that fixes
up
the CMake build system. There were a lot of open bugs due to the
initial
design (and constraints of CMake 2), and by moving to CMake 3, I was
able
to rewrite the CMake build in a target-based dependency graph manner
(the
way CMake is meant to be used).
The very end of the chain is here: https://reviews.apache.org/r/61753/
Joseph Wu is currently shepherding it. That final patch includes the
what
and the why explanation of this patch series.
My main guideline in this effort was MESOS-3576, which pointed out the
incorrectness of the link flags generated by CMake. This has been
resolved,
and moreover, a significant amount of superfluous CMake code was
deleted
(that final patch was about a 4 to 1 ratio of deletions to adds).
I took a two-phase approach to this reworking. The first phase
imported
all of our third party dependencies correctly. Instead of linking to
these
dependencies by manually including their various include/library
directories and compilation/link flags, each dependency was added to
the
CMake graph as an imported target. All necessary information for
linking to
the dependency is recorded in its target, and used is transitively
passed
to targets which take it as dependency by CMake. Adding a new
dependency is
now relatively simple, with many easy-to-replicate patterns available
in
3rdparty/CMakeLists.txt.
An important note is that this was also done for header-only
libraries,
including stout. CMake 3 has a notion of "interface libraries" where a
header-only library can be represented as a CMake target like any
other
library. With this done correctly, linking stout to boost is as simple
as
`target_link_libraries(stout boost)`, and linking libprocess to stout
is
`target_link_libraries(process stout)`, and the boost dependency is
understood transitively.
The second phase was refactoring the Mesos build itself (that is, not
the
third party dependencies). With all our dependencies imported
properly, I
was able to delete the files of extraneous information such as
`MasterConfigure.cmake`, `AgentConfigure.cmake`, etc. This information
is
instead correctly stored in the aforementioned CMake dependency graph.
With this all put together, the entirety of the required CMake code to
build the agent executable, on all platforms, is the following _two
lines_:
add_executable(mesos-agent main.cpp)
target_link_libraries(mesos-agent PRIVATE mesos)
All necessary link and compilation flags are parsed by CMake through
the
dependency graph as it visits libmesos as the mesos-agent dependency.
I keep an updated tree on GitHub here for easy testing:
https://github.com/andschwa/mesos/blob/cmake-refactor/src/sl
ave/CMakeLists.txt
As we move closer to deprecating Autotools, I wanted to ensure that
the
replacement build system was as correct and easy-to-use as possible.
As
with any build system (and any software engineering effort), there is
always more to clean up and improve. However, I am satisfied with the
result of my efforts, and I hope this build system makes your work as
developers easier. If you have the time, please take a look at the the
patches and give it a test. Let me know know I can make it work better
for
you.
Thank you,
Andrew Schwartzmeyer