#cmake
#cmake
Вопрос:
Допустим, у нас есть структура репозитория, подобная этой (обратите внимание на .qmake.conf
файлы):
repo/
├── libraries
│ └── libFoo
│ └── libFoo.pri
├── projects
│ ├── ProjectX
│ │ ├── apps
│ │ │ └── AppX
│ │ │ └── AppX.pro
│ │ ├── libs
│ │ │ └── libX
│ │ │ └── libX.pri
│ │ └── .qmake.conf
│ └── ProjectY
│ ├── apps
│ │ └── AppY
│ │ └── AppY.pro
│ └── .qmake.conf
├── qmake
│ └── common.pri
└── .qmake.conf
QMake поддерживает .qmake.conf
файлы, в которых вы можете объявлять полезные переменные, и они автоматически включаются в ваш файл .pro, если он найден в родительском каталоге.
Вот как это помогает избежать работы с ../../..
относительными путями, например:
- Корневой
repo/.qmake.conf
файлREPO_ROOT=$$PWD
объявлен. - у проекта также есть свой собственный
repo/projects/ProjectX/.qmake.conf
, которыйinclude(../../.qmake.conf)
включен иPROJECT_ROOT=$$PWD
объявлен. .pro
файл приложения проекта (repo/projects/ProjectX/apps/AppX/AppX.pro
) может избежать записи../../
и включать все зависимости из родственных и родительских каталогов, подобных этому:
include(${REPO_ROOT}/qmake/common.pri)
include(${REPO_ROOT}/libraries/libFoo/libFoo.pri)
include(${PROJECT_ROOT}/libs/libX/libX.pri)
Это удобно и аккуратно. Вам нужно написать ../../
один раз (и обновить его, если дерево репозитория изменится), но только один раз для каждого нового .qmake.conf
, а позже вы можете использовать переменные для ссылки на различные полезные относительные пути в репозитории в любом количестве .pro
, которое у вас есть.
Есть ли в CMake три похожих метода? Как такого рода организация переменных может быть достигнута с помощью CMake наиболее удобным способом?
Комментарии:
1. Нет, это не так, но на самом деле запись
include(my.cmake.conf)
тоже не такая длинная. И какой смысл, если вы все равно пишете конфигурацию cmake?2. Идея состоит в том, чтобы избегать труднодоступных для компиляции
../../......
путей. И ваш пример НЕ является проблемой, но использование и поддержкаinclude(../../../....../foo.conf)
есть.
Ответ №1:
В CMake вы можете добиться аналогичного результата несколько иначе:
(что касается управления «полезными переменными»)
CMake знает о 3 «типах переменных»:
- переменные с областью видимости каталога; переменные области видимости каталога ведут себя таким образом, что если вы определяете их в какой-либо папке, они автоматически будут видны во всех вложенных папках. Короче говоря, если вы определяете некоторый var в root CMakeLists.txt , он будет виден во всех вложенных папках проекта. Пример определения «переменной области видимости каталога»:
# outside any function
set(MY_USEFUL_VAR SOME_VALUE)
- переменные с областью действия функции; переменные области действия функции — это переменные, определенные в функции. Они видны в текущей области действия функции и во всех областях, инициированных из нее. Пример переменной области видимости функции:
function(my_function)
# note that the definition is within the function
set(MY_LOCAL_VAR SOME_VALUE)
# rest of the function body...
endfunction()
- переменные кэша могут рассматриваться как «глобальные переменные», и они также хранятся в
CMakeCache.txt
файле в корневой папке сборки. Переменные кэша определяются следующим образом (добавление новой строковой переменной):
set (MY_CACHE_VAR "this is some string value" CACHE STRING "explanation of MY_VAR")
Кроме того, как уже предлагалось в комментариях, вы можете поместить определения переменных в различные «включаемые файлы» и включить их с помощью инструкции CMake include.
В конце концов, вот документация по операторам set и include CMake.
Комментарии:
1. Спасибо за качественный пост! Хотя этот «root CMakeLists.txt » будет работать только в том случае, если вы всегда строите через этот файл .txt. Мой вариант использования заключается в том, что я открываю final project, например
repo/projects/ProjectX/apps/AppX/AppX.pro
, с помощью QtCreator, и работаю непосредственно с этим Да, способ состоит в том, чтобы включить некоторыеcommon.cmake
(как в моем примереcommon.pri
), но для доступа к нему нужно иметь дело с этими../../../
путями, которые сложно поддерживать…2. Привет, просто для полноты картины, в QtCreator можно открыть проект на основе CMake точно так же, как проекты qmake. Просто выполните OpenProject, а затем откройте CMakeLists.txt .