Различные флаги компиляции для одного и того же файла в разных целях - PullRequest
17 голосов
/ 12 июля 2011

Я хотел бы включить .cpp-файл в две разные цели (став двумя проектами VS после запуска CMake). Я хотел бы установить разные COMPILE_FLAGS для этих проектов.

Однако, когда я делаю

SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1")
ADD_EXECUTABLE(project1 myfile.cpp)
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2")
ADD_EXECUTABLE(project2 myfile.cpp)

«flags2» применяется к обоим проектам, поэтому кажется, что свойства перезаписываются в строке 3 и не рассматриваются в строке 2. Это правда или я что-то упустил? Есть ли способ решить это?

Спасибо!

Ответы [ 4 ]

17 голосов
/ 12 июля 2011

Примените команду set_target_properties к проектам, а не к исходным файлам:

add_executable(project1 myfile.cpp)
set_target_properties(project1 PROPERTIES COMPILE_FLAGS "flags1")
add_executable(project2 myfile.cpp)
set_target_properties(project2 PROPERTIES COMPILE_FLAGS "flags2")

Флаги, установленные на цели, будут применяться ко всем источникам в пределах цели.

5 голосов
/ 17 января 2013

Если вы придерживаетесь одной цели для каждой подкаталоги, вы можете сделать следующее, используя add_definitions, чтобы добавить свои флаги компиляции.


# in ./CMakeLists.txt
add_subdirectory(project1)
add_subdirectory(project2)   

# in ./project1/CMakeLists.txt:
add_definitions("flags1")
add_executable(project1 ../myfile.cpp)

# in ./project2/CMakeLists.txt:
add_definitions("flags2")
add_executable(project2 ../myfile.cpp)

add_definitions применяется ко всем файлам, скомпилированным в этом подкаталоге, и тем, которые находятся в нем. Вы можете применить флаги к определенным файлам, используя следующее:

set_source_files_properties(myfile.cpp PROPERTIES COMPILE_FLAGS "flags")
0 голосов
/ 20 декабря 2017

У меня возникла та же проблема (как указать зависимости заголовка предварительно скомпилированного заголовка для одного и того же исходного файла). К счастью, эффект set_source_files_properties - это только текущий каталог (CMAKE_CURRENT_SOURCE_DIR). Я смог использовать это, чтобы придумать следующее:

In source directory:

  CMakeLists.txt:
    add_subdirectory(lib_varient_1)
    add_subdirectory(lib_varient_2)

  LibSources.cmake:
    set(SOURCES
      "${CMAKE_CURRENT_LIST_DIR}/Source1.cpp"
      "${CMAKE_CURRENT_LIST_DIR}/Source2.cpp"
      ...)

    set_source_files_properties(${SOURCES} PROPERTIES
      COMPILE_FLAGS "/Yu\"stdafx.h\""
                    "/Fp\"${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch\"")

    set_source_files_properties(${SOURCES} PROPERTIES
      OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch")

    set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/stdafx.cpp
      PROPERTIES COMPILE_FLAGS "/Yc\"stdafx.h\""
                    "/Fp\"${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch\"")  

    set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/stdafx.cpp
      PROPERTIES OBJECT_OUTPUTS "${CMAKE_CURRENT_BINARY_DIR}/stdafx.pch")

    add_library(lib_varient_${VARIENT} ${SOURCES} stdafx.cpp)

In lib_varient_1

  CMakeLists.txt:
    set(VARIENT 1)
    include(../LibSources)

In lib_varient_2

  CMakeLists.txt:
    set(VARIENT 2)
    include(../LibSources)

Это работает, потому что set_source_files_properties влияет только на текущий файл CMakeLists.txt. Включенный файл будет иметь разные значения для $ {VARIENT} и $ {CMAKE_CURRENT_BINARY_DIR}, так как он включен из двух разных файлов CMakeLists.txt. Вы также можете установить различные флаги компиляции, определения препроцессора или включить пути в каждый из файлов CMakeLists.txt переменной до включения файла LibSources.cmake.

0 голосов
/ 30 января 2015

Я решаю эту проблему следующим образом. В CMakeLists.txt:

set_target_properties (test1 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=1")
set_target_properties (test2 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=9")

set_source_files_properties (source1.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=7")
set_source_files_properties (source2.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=4")

В некоторых заголовочных файлах:

  #if TARGET_ID==1 && FILE_ID==7
    #define SPECIAL_VALUE 17
  #elif TARGET_ID==1 && FILE_ID==4
    #define SPECIAL_VALUE 14
  #elif TARGET_ID==9 && FILE_ID==7
    #define SPECIAL_VALUE 97
  #elif TARGET_ID==9 && FILE_ID==4
    #define SPECIAL_VALUE 94
  #endif

Далее, включите вышеупомянутый заголовок в source1.cpp и source2.cpp и скомпилируйте Я думаю, у CMake нет более приемлемого решения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...