2015-05-13 3 views
3

Я работаю с субпроектом, который большую часть времени будет использоваться вместе с другим проектом CMake. Интересно, если CMake есть что-то вродеИмеет ли CMake концепцию ifdef endif

ifndef cmake_minimum_required 
cmake_minimum_required(VERSION 2.8.11) 
endif 

в основном, если cmake_minimum_required уже определен где-то в моем субпроекту я хочу использовать то, что было определено, в противном случае, я хочу, чтобы определить cmake_minimum_required в моем подпроекта.

ответ

2

Вы можете использовать политику CMake CMP0000, чтобы сообщить, был ли уже вызван cmake_minimum_required.

Когда cmake_minimum_required называется, CMP0000 автоматически устанавливается на NEW, так что вы можете сделать:

cmake_policy(GET CMP0000 MinimumVersionIsSet) 
if(NOT MinimumVersionIsSet STREQUAL "NEW") 
    cmake_minimum_required(VERSION 2.8.11) 
endif() 

Единственный способ, которым я могу видеть этот недостаток, если более высокого уровня CMakeLists.txt содержал что-то вроде:

cmake_minimum_required(VERSION 2.6) 
cmake_policy(SET CMP0000 OLD) 

перед тем как позвонить add_subdirectory для вашего проекта. Это позволило бы установить политику NEW, а затем сразу же установить ее на OLD. Тем не менее, я считаю, что это очень маловероятный сценарий, поскольку для политики будет установлено только OLD, чтобы разрешить вызов cmake_minimum_required.

Сказав все это, я думаю, что ваш подход может быть немного рискованным. Скажем, проект верхнего уровня устанавливает минимальную требуемую версию до версии 2.6, и вам нужны функции, доступные только в 2.8. Поскольку ваш вызов cmake_minimum_required пропущен, пользователи, работающие с CMake 2.6, получат больше таинственных сообщений об отказах (о неизвестных командах CMake), а не более сжатые «CMake 2.8.11 или выше». Вы используете версию 2.6.0 ».

Смежные вопросы