CMake и P C -Lint Plus - как передать список включаемых каталогов CMake в Lint? - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь включить P C -Lint Plus в свой проект cmake, в основном для P C -Lint нужен список всех путей включения для файлов, которые будут сканироваться. Как получить список всех путей включения, рекурсивно необходимых для цели в CMake? .

P C -Lint вызывается, но в итоге умирает, потому что не все включения находятся в P C -Lint invocation.

Я поместил указанную выше ссылку в файл Lint.cmake и включил ее в мой файл CMake верхнего уровня. В своем файле проекта я добавил:

if(COMMAND add_pc_lint)
add_pc_lint(moded ${SRC_FILES})
endif(COMMAND add_pc_lint)

Так что я бы ожидал, что строки:

function(add_pc_lint target)
    get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
    # let's get those elephants across the alps
    # prepend each include directory with "-i"; also quotes the directory
    set(lint_include_directories_transformed)
    foreach(include_dir ${lint_include_directories})
        list(APPEND lint_include_directories_transformed -i"${include_dir}")
    endforeach(include_dir)

извлекут список включаемых каталогов из INCLUDE_DIRECTORIES.

Если я добавлю:

message(STATUS "********************************************")
message(STATUS "Include directories - ${lint_include_directories}")
message(STATUS "********************************************")
message(STATUS "********************************************")
message(STATUS "INCLUDE_DIRECTORIES - ${INCLUDE_DIRECTORIES}")
message(STATUS "********************************************")

прямо над foreach l oop, lint_include_directories и INCLUDE_DIRECTORIES оба будут пустыми.

Что мне нужно сделать, чтобы получить полный список включаемых каталогов, в том числе из target_link_libraries и target_include_directories, от CMake для передачи P C -Lint Plus?

1 Ответ

0 голосов
/ 28 февраля 2020

Документация о P C -Lint, похоже, обслуживается старым CMake, а не целевым современным CMake. Функция add_pc_lint получает включенные каталоги и скомпилированных определений из свойств каталога CMake. Эти свойства каталогов будут заполнены, если в вашем проекте есть вызовы, такие как:

  • include_directories()
  • add_definitions()

Без этих команд (которые на самом деле не следует использовать в современном CMake), функция add_pc_lint, скорее всего, не найдет все ожидаемые каталоги включения и определения компиляции.

В современном CMake включают каталоги и определения компиляции сохраняются как свойства target вместо этого, когда вы используете такие команды, как эти :

  • target_include_directories()
  • target_compile_definitions()

В этом случае необходимо изменить функцию add_pc_lint, чтобы получить свойства из target , а не каталог . Итак, измените верхнюю часть функции add_pc_lint с этого:

function(add_pc_lint target)
    get_directory_property(lint_include_directories INCLUDE_DIRECTORIES)
    get_directory_property(lint_defines COMPILE_DEFINITIONS)

на это:

function(add_pc_lint target)
    get_target_property(lint_include_directories ${target} INCLUDE_DIRECTORIES)
    get_target_property(lint_defines ${target} COMPILE_DEFINITIONS)
...