Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read a CMake Variable in C++ source code

I'd like to store the version number of my library in just one place. So I have defined such a variable in the CMake-file:

    SET(LIBINTERFACE_VERSION 1 CACHE INTEGER "Version of libInterface") 

With this definition I can generate a version.rc file according to Microsoft's definition, which I compile into the library and afterwards shows up correctly in the properties window of my dll-file.

Now I'd like to use this CMake variable in my c++ source code too, but I actually don't get to a working solution. I've tried different things like this:

    #ifndef VERSION_LIBINTERFACE     #  define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@     #endif 

or this:

    unsigned int getLibInterfaceVersion()     {         return @LIBINTERFACE_VERSION@;     } 

But the compiler won't accept anything. Since my researches in the CMake-Documentation didn't get any results, I hope that someone could give me the essential advice.

Thanks in advance.

like image 459
Snowfox Avatar asked Oct 26 '11 09:10

Snowfox


People also ask

Can you use CMake with C?

In the C/C++ ecosystem, the best tool for project configuration is CMake. CMake allows you to specify the build of a project, in files named CMakeLists. txt, with a simple syntax (much simpler than writing Makefiles).

How do I view CMake variables?

Another way to view all cmake's internal variables, is by executing cmake with the --trace-expand option. This will give you a trace of all . cmake files executed and variables set on each line.

How do I use CMake variables?

You can use the command line to set entries in the Cache with the syntax cmake -D var:type=value , just cmake -D var=value or with cmake -C CMakeInitialCache. cmake . You can unset entries in the Cache with unset(... CACHE) .

Where are CMake variables stored?

The type of the variable is used by the cmake-gui to control how that variable is set and displayed, but the value is always stored in the cache file as a string.


1 Answers

The easiest way to do this, is to pass the LIBINTERFACE_VERSION as a definition with add_definition:

add_definitions( -DVERSION_LIBINTERFACE=${LIBINTERFACE_VERSION} ) 

However, you can also create a "header-file template" and use configure_file. This way, CMake will replace your @LIBINTERFACE_VERSION@. This is also a little more extensible because you can easily add extra defines or variables here...

E.g. create a file "version_config.h.in", looking like this:

#ifndef VERSION_CONFIG_H #define VERSION_CONFIG_H  // define your version_libinterface #define VERSION_LIBINTERFACE @LIBINTERFACE_VERSION@  // alternatively you could add your global method getLibInterfaceVersion here unsigned int getLibInterfaceVersion() {     return @LIBINTERFACE_VERSION@; }  #endif // VERSION_CONFIG_H 

Then add a configure_file line to your cmakelists.txt:

configure_file( version_config.h.in ${CMAKE_BINARY_DIR}/generated/version_config.h ) include_directories( ${CMAKE_BINARY_DIR}/generated/ ) # Make sure it can be included... 

And of course, make sure the correct version_config.h is included in your source-files.

like image 58
André Avatar answered Sep 23 '22 14:09

André