CMake: Как повторно использовать определения исходного файла между целями без дублирования? - PullRequest
3 голосов
/ 25 сентября 2019

В моем проекте CMake у меня есть 2 цели (статическая библиотека и общая библиотека), которые совместно используют одни и те же файлы исходного кода, например:

add_library("${PROJECT_NAME}" STATIC
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
    "${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)
add_library("${PROJECT_NAME}-shared" SHARED
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
    "${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)

Очевидно, здесь есть проблема:Определение источников дублируется.Его сложно поддерживать, и он также подвержен ошибкам.

Чтобы избежать этого, я хотел бы создать переменную списка CMake, чтобы определение источников можно было повторно использовать в обеих целях.

Я пробовал это, но это не работает:

set(CALCULATOR_CORE_SOURCES_LIST
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
    "${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
    "${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)
string(REPLACE ";" " " CALCULATOR_CORE_SOURCES "${CALCULATOR_CORE_SOURCES_LIST}")

add_library("${PROJECT_NAME}" STATIC ${CALCULATOR_CORE_SOURCES})
add_library("${PROJECT_NAME}-shared" SHARED ${CALCULATOR_CORE_SOURCES})

Сбой с ошибкой: Cannot find source file.

Итак ... как я могу использовать определения исходного файла между целями без этого дублирования ?Можно ли сделать это с помощью списков или есть лучший подход для решения этой проблемы?

PS: я использую CMake 3.15

1 Ответ

4 голосов
/ 25 сентября 2019

Ваш код близок;Вы можете просто использовать переменную CALCULATOR_CORE_SOURCES_LIST, чтобы добавить группу источников / заголовков к обоим add_library() вызовам:

set(CALCULATOR_CORE_SOURCES_LIST
    ${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h
    ${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp
    ${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h
    ${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp
)

add_library(${PROJECT_NAME} STATIC ${CALCULATOR_CORE_SOURCES_LIST})
add_library(${PROJECT_NAME}-shared SHARED ${CALCULATOR_CORE_SOURCES_LIST})

Если группа источников одинакова для обеих библиотек, вам нужно толькоопределить список один раз.Из документации команда set сделает следующее:

Несколько аргументов будут объединены в список через точку с запятой, чтобы сформировать фактическое значение переменной, которую нужно установить.

Таким образом, этот список можно передать на вызовы add_library().Вам также не нужны кавычки (") вокруг каждого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...