How to define a C++ preprocessor macro through the command line with CMake?

后端 未结 4 604
野性不改
野性不改 2020-12-01 05:25

I try to set a preprocessor macro in the command line of CMake. I\'ve tried:

set generator=\"Visual Studio 8 2005\"
set params=-D MY_MACRO=1
cmake.exe -G %ge         


        
相关标签:
4条回答
  • 2020-12-01 05:53

    Try this: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

    0 讨论(0)
  • 2020-12-01 05:56

    Unless you have a good reason not to, you should use ADD_DEFINITIONS(<name>=<value>[, ...]).

    Just add the following line to your CMakeLists.txt:

    ADD_DEFINITIONS("MY_MACRO=1")
    

    CMake will take care of the syntax of the switches (be it -D<name>=<value>, or /D<name>=<value>).

    0 讨论(0)
  • 2020-12-01 06:02

    The motivation behind the question was to batch build 3rd party libraries, which is why I wanted to avoid modifying CMakeLists. So years later, even though I don't need that anymore, I figured out that it's easily achievable by means external to CMake:

    • Invoke CMake as usual, no special flags.

    • Then:

      • With MSVC: The compiler reads the CL environment variable to get extra command line arguments. So

          set CL=/DMY_MACRO=1 %CL%
        

        then invoke MSBuild to do its job.

      • With Makefiles: The generated makefiles use the CFLAGS and CXX_FLAGS variables as makefiles are expected to do. So the build can be started by

          make CXX_FLAGS=-DMY_MACRO=1
        

        or by setting the corresponding environment variables.

    0 讨论(0)
  • 2020-12-01 06:05

    A good alternative would be to define a cmake option:

    OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
    

    Followed by a condition:

    IF(DEFINE_MACRO)
        ADD_DEFINITIONS(-DMACRO)
    ENDIF(DEFINE_MACRO)
    

    Then you can turn that option ON/OFF via command line with cmake using the -D flag. Example:

    cmake -DDEFINE_MACRO=OFF ..
    

    To make sure the compiler is receiving the definition right, you can call make in verbose mode and check for the macro being defined or not:

    make VERBOSE=1
    

    This is a good solution also because make will recompile your code when any of cmake options changes.

    0 讨论(0)
提交回复
热议问题