CMAKE thrift генерирует файлы опций компилятора - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь скомпилировать сгенерированный 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 не должен решить эту проблему?

Фрагмент файла CMake

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/ Разработка / Проект / 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 / Проект / Project16 / cmake-build-отладка / протоколы -isystem / home / user / Development / Project / Project16 / ext / spdk / include -isystem / home / user / Development / vcpkg /линии / 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-section -fno-omit-frame-pointer -mtune = core-avx-i-mavx -march = core-avx-i -fno-plt -g -fstack-protector-all -fstack-check -rdynamic -Wno-error = неиспользованный-параметрeter -Wno-error = не используется -Wno-error = не используется-но-установить-параметр -Wshadow -Werror = address -Werror = array-bounds -Werror = char-subscripts -Werror = enum-сравнить -Werror = implicit-int -Werror = неявное-объявление-функции -Werror = комментарий -Werror = format -Werror = main -Werror = отсутствующие скобки -Werror = nonnull -Werror = указатель-знак -Werror = reorder -Werror = return-тип -Werror = sequence-point -Wstrict-aliasing = 1 -Werror = strict-overflow = 1 -Werror = switch -Werror = trigraphs -Werror = неинициализированный -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 = ограничения-типа -Werror -Wempty-body -Wuninitialized -Winit-self -Wmissing-декларации -Wswitch-bool -Wlogical-not-круглые скобки -Wsizeof-массив-аргумент -Wbool-сравнение -Wtype-пределы -Waddress -Wmisleading-отступы -Wshift-отрицательное значение -Wtautological-сравнить -Wnull-разыменование -Wduplicated-cond -Wnonnull -Wnonnull-сравнить-qualifiers -Wmissing-braces -Wmissing-include-dirs -Wparentheses -Wsequence-point -Wno-return-local-addr -Wreturn-type -Wtrigraphs -Wunused-local-typedefs -Winvalid-memory-model -Wmaybe-неинициализированный -Wunknown-pragmas -Wframe-address -Wtrampolines -Wfloat-equal -Wno-free-nonheap-object -Wold-style-cast -Wunused-параметр -Wunused -Wunused-but-set-параметр -Wframe-больше-чем = 1100000 -Wpointer-arith -Write-strings -Wclobbered -Wenum-сравнить -Wsizeof-указатель-memaccess -Wmemset-transposed-args -Wlogical-op -Wredundant-decls -Winvalid-pch -Wvarargs -Wvector-операция-performance -Wvolatile-register-var-Wdisabled-оптимизация -Wcast-align -Wcast-qual -Wnon-virtual-dtor -Woverloaded-virtual -Wodr -Wplacement-new = 2 -Wdelete-неполный -Wsized-deallocation -Wno-виртуальный-переместить-назначить -Wsuggest-override-DBOOST_COROUTINES_NO_DEPRECATION_WARNING -DGTEST_LINKED_AS_SHARED_LIBRARY -D_GNU_SOURCE -DIGNORE_VALIDATION = -std = gnu ++ 1z -o CMakeFiles / MyProject.dir / MyProject.dir / myProject.gen / myntject.gen / thrippome / пользователь / разработка / проект / Project16 / cmake-build-debug / lib / MyProject / thrift / gen / MyProject_constants.cpp Файл, включенный в / 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: ошибка: 'виртуальный const char * MyProject :: ThriftCapiException :: what () const 'может быть помечен как override [-Werror = предложить-переопределить] const char * what () const throw ();

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

1 Ответ

0 голосов
/ 01 октября 2018

Свойства исходных файлов , таких как 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>
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...