Подтвердить что ты не робот

CMake - удалить флаг компиляции для отдельной единицы перевода

Я хотел бы удалить флаг компиляции набора для одной единицы перевода. Есть ли способ сделать это? (например, используя set_property?)

Примечание: флаг компиляции не имеет отрицания -fno-name (по какой-либо причине).

Я пробовал:

get_property(FLAGS TARGET target PROPERTY COMPILE_FLAGS)
string(REPLACE "-fname" "" FLAGS ${FLAGS})
set_property(TARGET target PROPERTY COMPILE_FLAGS ${FLAGS})

без везения. Свойство, которое я хочу удалить, является частью CMAKE_CXX_FLAGS, и поэтому это не работает.

4b9b3361

Ответ 1

A (немасштабируемое и непереносимое) решение создает пользовательскую команду с измененными флагами. Минимальным примером, который я получил, является следующее:

cmake_minimum_required(VERSION 2.8)

project(test)
# Some flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall")
# Remove unwanted flag
string(REPLACE "-Wall" "" CUSTOM_FLAGS ${CMAKE_CXX_FLAGS})
# Split the flags into a cmake list (; separated)
separate_arguments(CUSTOM_FLAGS UNIX_COMMAND ${CUSTOM_FLAGS})
# Custom command to build your one file.
add_custom_command(
    OUTPUT out.o
    COMMAND ${CMAKE_CXX_COMPILER} 
    ARGS ${CUSTOM_FLAGS} -c ${CMAKE_SOURCE_DIR}/out.cpp 
                         -o ${CMAKE_BINARY_DIR}/out.o
    MAIN_DEPENDENCY out.cpp)

add_executable(test test.cpp out.o)

Пока он не идеален, он работает, и это важно. separate_arguments был необходим, потому что в противном случае все пробелы в CUSTOM_FLAGS были экранированы (не знаю, как быстро решить эту проблему).