Есть ли у CMake QMake.альтернатива qmake.conf (автоматически включаемый файл из родительского каталога) или другие способы достижения аналогичного результата?

#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 .