Параметры компилятора файлов, сгенерированных экономичным CMAKE

Я пытаюсь скомпилировать сгенерированный код thrift в свой источник. Материал thrift генерируется в CMAKE_CURRENT_BINARY_DIR, затем я добавляю сгенерированные файлы cpp в свою библиотеку с помощью SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES GENERATED 1 COMPILE_OPTIONS "" )
Затем я добавляю путь включения к сгенерированным файлам, используя TARGET_INCLUDE_DIRECTORIES с ключевым словом SYSTEM. Когда я пытаюсь скомпилировать его, поскольку мой модуль компилируется с -Wsuggest-override, он не может скомпилировать сгенерированный файл cpp с can be marked override [-Werror=suggest-override]. Не понимаю, почему, разве SET_SOURCE_FILES_PROPERTIES не должен решить эту проблему?

CСделать фрагмент файла

ADD_COMPILE_OPTIONS(
        ...
        ...
        -Wsuggest-override
        ...
        ...
)
FIND_PROGRAM(THRIFT_COMPILER thrift ${_VCPKG_ROOT_DIR}/buildtrees/thrift/x64-linux-rel/compiler/cpp/bin/ NO_DEFAULT_PATH)
SET(ThriftOutputDir ${CMAKE_CURRENT_BINARY_DIR}/thrift/gen/)
FILE(MAKE_DIRECTORY ${ThriftOutputDir})

SET(ThriftGeneratedFiles
    ${ThriftOutputDir}/MyServer.cpp
    ${ThriftOutputDir}/My_types.cpp
    ${ThriftOutputDir}/My_constants.cpp
    )

ADD_CUSTOM_COMMAND(
        OUTPUT
        generated.timestamp
        COMMAND
        ${THRIFT_COMPILER} --gen cpp:no_default_operators -out ${ThriftOutputDir} ${CMAKE_SOURCE_DIR}/protocols/My.thrift
        WORKING_DIRECTORY
        ${CMAKE_BINARY_DIR}
        COMMENT "Generating source code from Thrift definition")
ADD_CUSTOM_TARGET(RunThriftCompiler
                  DEPENDS
                  generated.timestamp
                  COMMENT "Checking if re-generation is required")

ADD_LIBRARY(MyProject SHARED
            ${SOURCES}
            ${ThriftGeneratedFiles}
            )

SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES
                            GENERATED 1
                            COMPILE_OPTIONS ""
                            )
TARGET_INCLUDE_DIRECTORIES(MyProject SYSTEM PRIVATE
                           ${PROTOBUF_INCLUDE_DIR}
                           ${ThriftOutputDir}
                           )

Сообщение компиляции:

cd /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject && /usr/bin/c++ -DCARES_STATICLIB -DMyProject_EXPORTS -I/home/user/Development/Project/Project16/lib/include/MyProject -I/home/user/Development/Project/Project16/lib/include -isystem /home/user/Development/Project/Project16/cmake-build-debug/ext/etcd -isystem /home/user/Development/Project/Project16/cmake-build-debug/protocols -isystem /home/user/Development/Project/Project16/ext/spdk/include -isystem /home/user/Development/vcpkg/installed/x64-linux/include -isystem /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen -g -fPIC -include MyProject.h -fPIC -fstrict-aliasing -ffunction-sections -fno-omit-frame-pointer -mtune=core-avx-i -mavx -march=core-avx-i -fno-plt -g -fstack-protector-all -fstack-check -rdynamic -Wno-error=unused-parameter -Wno-error=unused -Wno-error=unused-but-set-parameter -Wshadow -Werror=address -Werror=array-bounds -Werror=char-subscripts -Werror=enum-compare -Werror=implicit-int -Werror=implicit-function-declaration -Werror=comment -Werror=format -Werror=main -Werror=missing-braces -Werror=nonnull -Werror=pointer-sign -Werror=reorder -Werror=return-type -Werror=sequence-point -Wstrict-aliasing=1 -Werror=strict-overflow=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -Werror=unknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Werror=volatile-register-var -Werror=clobbered -Werror=empty-body -Werror=ignored-qualifiers -Werror=sign-compare -Werror=type-limits -Werror -Wempty-body -Wuninitialized -Winit-self -Wmissing-declarations -Wswitch-bool -Wlogical-not-parentheses -Wsizeof-array-argument -Wbool-compare -Wtype-limits -Waddress -Wmisleading-indentation -Wshift-negative-value -Wtautological-compare -Wnull-dereference -Wduplicated-cond -Wnonnull -Wnonnull-compare -Wignored-qualifiers -Wmissing-braces -Wmissing-include-dirs -Wparentheses -Wsequence-point -Wno-return-local-addr -Wreturn-type -Wtrigraphs -Wunused-local-typedefs -Winvalid-memory-model -Wmaybe-uninitialized -Wunknown-pragmas -Wframe-address -Wtrampolines -Wfloat-equal -Wno-free-nonheap-object -Wold-style-cast -Wunused-parameter -Wunused -Wunused-but-set-parameter -Wframe-larger-than=1100000 -Wpointer-arith -Wwrite-strings -Wclobbered -Wenum-compare -Wsizeof-pointer-memaccess -Wmemset-transposed-args -Wlogical-op -Wredundant-decls -Winvalid-pch -Wvarargs -Wvector-operation-performance -Wvolatile-register-var -Wdisabled-optimization -Wcast-align -Wcast-qual -Wnon-virtual-dtor -Woverloaded-virtual -Wodr -Wplacement-new=2 -Wdelete-incomplete -Wsized-deallocation -Wno-virtual-move-assign -Wsuggest-override -DBOOST_COROUTINES_NO_DEPRECATION_WARNING -DGTEST_LINKED_AS_SHARED_LIBRARY -D_GNU_SOURCE -DIGNORE_VALIDATION= -std=gnu++1z -o CMakeFiles/MyProject.dir/thrift/gen/MyProject_constants.cpp.o -c /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_constants.cpp In file included from /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_types.cpp:7:0: /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_types.h:72:15: error: ‘virtual const char* MyProject::ThriftCapiException::what() const’ can be marked override [-Werror=suggest-override] const char* what() const throw();

Как видно, применяются все флаги компиляции.

Пожалуйста, покажите сообщение об ошибке полный, которое содержит информацию о том, какой файл скомпилирован, включает цепочку и так далее.

Tsyvarev 26.09.2018 14:48

"поскольку мой модуль компилируется с -Wsuggest-override" - Вы устанавливаете эту опцию через переменную CMAKE_CXX_FLAGS? Если это так, опция применяется к файлу каждый.cpp; Свойство COMPILE_OPTIONS не включает параметры из переменной CMAKE_CXX_FLAGS.

Tsyvarev 26.09.2018 14:59

Я установил его с помощью ADD_COMPILE_OPTIONS, должно ли работать?

kreuzerkrieg 26.09.2018 15:00

И нет свойства COMPILE_OPTIONS для исходные файлы: cmake.org/cmake/help/v3.7/manual/…. Свойство существует только для цели и каталоги. Вы можете создать Библиотека OBJECT из сберегательных источников. Для этой библиотеки вы можете установить (то есть очистить) свойство COMPILE_OPTIONS. Затем используйте полученные файлы объектов в своей основной библиотеке.

Tsyvarev 26.09.2018 15:04

Ты прав. Думаю, это должен быть COMPILE_FLAGS?

kreuzerkrieg 26.09.2018 15:09

Нет, свойство исходного файла COMPILE_FLAGS содержит только флаги дополнительный, то есть его очистка не отменяет флаги, примененные для всей цели.

Tsyvarev 26.09.2018 15:12

Ага, уже разобрался. Хотели бы вы намекнуть, что является правильным решением в такой ситуации?

kreuzerkrieg 26.09.2018 15:16

Вы, вероятно, прочитали мой комментарий, прежде чем я его обновил. Пожалуйста, перечитайте это.

Tsyvarev 26.09.2018 15:20

ты прав, я пропустил это обновление, сразу попробую

kreuzerkrieg 26.09.2018 15:25

работал как шарм. пожалуйста, превратите свой комментарий в ответ

kreuzerkrieg 26.09.2018 18:00

Хорошо, я сделаю это позже. Не могли бы вы в то время обновить свой вопрос, добавив в него информацию, которую вы разместили в комментариях? Я имею в виду использование команды ADD_COMPILE_OPTIONS для добавления опции компилятора -Wsuggest-override. Как я сказал ранее, важно, чтобы вы использовали эту функцию для добавления параметра (а не переменную CMAKE_CXX_FLAGS).

Tsyvarev 26.09.2018 18:08

Добавил ADD_COMPILE_OPTIONS, что-нибудь еще?

kreuzerkrieg 27.09.2018 07:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
756
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Свойства на исходные файлы, такие как COMPILE_DEFINITIONS и COMPILE_FLAGS, могут использовать только Добавить в качестве параметра компиляции. Используя эти свойства, невозможно скомпилировать параметры перезаписывать (удалять) для цели. (И параметры, добавленные ADD_COMPILE_OPTIONS, в конечном итоге назначаются для цели).

Вы можете создать библиотеку OBJECT из сберегательных источников. Для этой библиотеки вы можете установить (то есть очистить) свойство COMPILE_OPTIONS. Полученные объектные файлы можно использовать в основной библиотеке:

# Object files for thrift-generated sources
add_library(thriftGenerated OBJECT ${ThriftGeneratedFiles})
# For these files clear compile options which has been set before
set_property(TARGET thriftGenerated PROPERTY COMPILE_OPTIONS)

# Then use object files for thrift-generated sources in other library
add_library(MyProject SHARED
    ${SOURCES}
    $<TARGET_OBJECTS:thriftGenerated>
)

Другие вопросы по теме