Reputation: 171
Is it possible to run cmake commands in a python script? I want to set the boost libraries which I installed and compiled manually through the python code.I want something like set(BOOST_INCLUDEDIR "/path/to/boost/include")
to happen via python script. So, before running cmake I want the cmake variables to set through the python code.
Upvotes: 3
Views: 6788
Reputation: 43078
Some of CMake's find modules do support reading path hints from environment variables:
"Users may set these hints or results as cache entries. [...] One may specify these as environment variables if they are not specified as CMake variables or cache entries."
I prefer this method of setting find module directories, because it's something I could also set on system level and I don't have to give every single of my CMake projects the paths to my custom build libraries anymore.
FindBoost.cmake
is an good example, because it offers various environment variable:
Boost_DIR
BOOSTROOT
BOOST_ROOT
BOOST_INCLUDEDIR
BOOST_LIBRARYDIR
Note: Those are considered "hints", since they will not overwrite any CMake cache values once boost was found.
Upvotes: 0
Reputation: 16193
Yes
By setting cmake cache variables from the command line. The syntax for defining this from the command line is as follows from here
-D <var>:<type>=<value>
So in your case, in the cmake list file
set(BOOST_INCLUDEDIR MY_BOOST_INCLUDE)
Then simply override that option when invoking cmake
cmake -DMY_BOOST_INCLUDE:STRING="/path/to/wherever"
You can make a cmake module in python that sets the defines you want. For example, make a python script that populates my_module.cmake
with any cache variables you want, i.e.
set(MY_BOOST_INCLUDE "script/generated/path")
#... other stuff you want to define
Then in your static cmake list file
include(my_module)
Upvotes: 1
Reputation: 171197
There are two ways of pre-initialising CMake variables before CMake processing starts, both using command-line arguments of cmake
.
The simple one is to pass one or more variables to CMake using the -D
command-line option. Something like this:
cmake -DBOOST_INCLUDEDIR:PATH="/path/to/boost/include" ...
The other option is to create an "initial cache file" (basically a file containing just set(...)
CMake commands) and pass that initial cache file to CMake using -C
:
echo 'set(BOOST_INCLUDEDIR "/path/to/boost/include" CACHE PATH "")' > initial_cache.cmake
cmake -C initial_cache.cmake ...
This option is intended for use the first time CMake is run with a given binary directory, i.e. before it creates its own CMakeCache.txt
file.
How you can utilise one or both of these from your Python script depends on your particular setup.
Upvotes: 2