Ваши попытки выше добавляют дополнительные флаги к вашему файлу / цели, а не перезаписывают, как вы, кажется, ожидаете. Например, из документации по свойствам исходных файлов - COMPILE_FLAGS :
Эти флаги будут добавлены в список флагов компиляции при сборке этого исходного файла.
Вы должны иметь возможность отменить -Weffc++
флаг для foo.cpp, выполнив
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Это должно иметь эффект добавления -Wno-effc++
после -Weffc++
в команде компилятора, и последний параметр выигрывает. Чтобы увидеть полную команду и убедиться, что это действительно так, вы можете сделать
make VERBOSE=1
Кстати, один из разработчиков стандартной библиотеки GNU C ++ высказывает довольно отрицательное мнение -Weffc++
в этом ответе .
Другой момент заключается в том, что вы злоупотребляете add_definitions
в том смысле, что используете это для флагов компилятора, а не для предполагаемых определений препроцессора.
Было бы предпочтительнее использовать add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
или для версий CMake <3.0, чтобы сделать что-то вроде:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Отвечая на дополнительные вопросы в комментариях ниже, я считаю, что невозможно надежно удалить флаг в одном файле. Причина в том, что для любого исходного файла он имеет COMPILE_OPTIONS
иCOMPILE_FLAGS
1 его целевого объекта, но они не отображаются ни в одном из свойств этого исходного файла.
Вы могли бы посмотреть, как убрать флаг проблемы с целевой COMPILE_OPTIONS
, а затем применить его к каждому из целевых источников по отдельности, при необходимости исключив его из конкретного исходного файла.
Однако, хотя это может работать во многих сценариях, у него есть несколько проблем.
Во-первых, свойства исходных файлов не включают COMPILE_OPTIONS
, только COMPILE_FLAGS
. Это проблема, потому что COMPILE_OPTIONS
цель может включать выражения генератора , ноCOMPILE_FLAGS
не поддерживает их. Таким образом, вам придется использовать выражения генератора при поиске вашего флага, и вам, возможно, даже придется «анализировать» выражения генератора, если ваш флаг содержится в одном или нескольких, чтобы увидеть, следует ли его повторно применить к оставшимся исходные файлы.
Во-вторых, начиная с CMake v3.0, цели могут указывать INTERFACE_COMPILE_OPTIONS
. Это означает, что зависимость вашей цели может добавлять или переопределять вашу цель COMPILE_OPTIONS
через свои INTERFACE_COMPILE_OPTIONS
. Таким образом, вам также придется рекурсивно перебирать все зависимости вашей цели (не особенно простая задача, поскольку список LINK_LIBRARIES
для цели также может содержать выражения генератора), чтобы найти любые, которые применяют флаг проблемы, и попытаться удалить его из тех цели INTERFACE_COMPILE_OPTIONS
тоже.
На этом этапе сложности я хотел бы отправить патч в CMake, чтобы обеспечить функциональность для безоговорочного удаления определенного флага из исходного файла.
1: Обратите внимание, что, в отличие от COMPILE_FLAGS
свойства исходных файлов, COMPILE_FLAGS
свойство целевых объектов устарело.