Как печатать переменные в cmake

#c #cmake

Вопрос:

Я хочу использовать cmake для создания своего проекта, моего CMakeLists.txt это очень просто:

 cmake_minimum_required(VERSION 3.20)

 project(YuvParallelProcess)

 message("$(PROJECT_SOURCE_DIR)")

 include_directories($(PROJECT_SOURCE_DIR)/inc)
 link_directories($(PROJECT_SOURCE_DIR)/lib/libyuv)

 add_executable(YuvParallelProcess  $(PROJECT_SOURCE_DIR)/src/main.cpp)

 target_link_libraries(YuvParallelProcess  libyuv.a)
 

мои файлы проекта организованы следующим образом:

  YuvParallelProcess
                      build
                      data
                      inc
                      lib
                      src
                      CMakeLists.txt
 

когда я запускаю cmake .. в build каталоге, оболочка печатает:

 $(PROJECT_SOURCE_DIR)
-- Configuring done
CMake Error at CMakeLists.txt:10 (add_executable):
  Cannot find source file:

    $(PROJECT_SOURCE_DIR)/src/main.cpp


CMake Error at CMakeLists.txt:10 (add_executable):
  No SOURCES given to target: YuvParallelProcess
 

Я не знаю, почему оболочка просто печатает $(PROJECT_SOURCE_DIR) что-то другое, кроме значения PROJECT_SOURCE_DIR
Как я могу напечатать значение PROJECT_SOURCE_DIR
Кстати, я не могу понять, почему cmake не удалось скомпилировать мой проект

Комментарии:

1. В дополнение к приведенному ниже ответу: в большинстве этих случаев вам не нужно использовать абсолютные пути , и если вы это сделаете, это предпочтительнее использовать CMAKE_CURRENT_SOURCE_DIR , поскольку это относится к каталогу, содержащему текущий CMakeLists.txt файл, независимо от того, есть ли project() команда или нет; в более сложных проектах вы можете оставить эту команду в подкаталоге. Кроме того, я рекомендую ограничить определения каталогов include/link там, где они необходимы, и использовать target_include_directories / target_link_directories

Ответ №1:

Cmake использовал фигурные скобки для получения значений переменных:

 ${PROJECT_SOURCE_DIR}
 

Я предлагаю сбрасывать сообщения, как показано ниже, чтобы не пропускать пустые сообщения.

 message(PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}")
 

Cmake не удалось настроить ваш проект, потому что он не распознал переменные в круглых скобках и считался $(PROJECT_SOURCE_DIR) строковым литералом как есть.

Ответ №2:

Вместо использования message вы также можете использовать cmake_print_variables для отображения переменных. в этом случае вы должны включить CMakePrintHelpers

 include(CMakePrintHelpers)

cmake_print_variables(PROJECT_SOURCE_DIR)
 

Выход будет :

 -- PROJECT_SOURCE_DIR="path/to/your/project"
 

С cmake_print_variables помощью вы также можете отобразить несколько переменных, например:

 cmake_print_variables(PROJECT_SOURCE_DIR ANOTHER_VARIABLE)
 

Выход будет :

 -- PROJECT_SOURCE_DIR="path/to/your/project" ; ANOTHER_VARIABLE="other variable"