Cmake/Простейший CMakeLists
Прежде чем рассматривать все возможности, которые предоставляет cmake, неплохо бы для начала рассмотреть его структуру и основные команды на примере простого CMakeLists.txt. Представим, что у нас есть проект на С++, содержащий исходники в папке src, заголовочные файлы - в папке include, при этом еще есть платформозависимый код в папках src/arm и src/openrisc. Пусть еще наша программа использует библиотеку pthread.
По "традиции", в корневой папке проекта, где лежат src, include, и прочие файлы, лежит также и корневой CMakeLists.txt, который ссылается на другие CMakeLists.txt, лежащие в других папках. Ниже приведен код корневого CMakeLists.txt с комментариями:
message ("Start") #Выводит сообщение "Start"
cmake_minimum_required (VERSION 2.6) #Проверка версии Cmake
# Папка с заголовочными файлами. Как можно понять. команда set
# присваивает значение переменной.
set (CMAKE_INCLUDE_PATH include)
set (PROJECT supertool)
if ( CMAKE_COMPILER_IS_GNUCXX )
set (CMAKE_CXX_FLAGS "-Wall -Os -L/usr/local/lib")
else ()
message (FATAL_ERROR "I can't find G++!")
endif ()
# Передаем управление другому CMakeLists.txt,
# который лежит в папке src
add_subdirectory (src)
Как можно увидеть, в CMake используются много переменных и команд, все они будут рассмотрены в соответствующих разделах этого викиучебника. CMake часто ругают за сложность языка, но возможностей у него достаточно много. Пока что главная задача - понять, как вообще выглядит cmake-файл.
Теперь рассмотрим CMakeLists.txt в папке src:
# На самом деле имена всех нужных cpp файлов можно выписать руками, используя
# конструкцию set (SRC name.cpp name1.cpp ... ), но что, если у нас 300 файлов? Мы
# рассмотрим чуть более простой метод. Но на самом деле первый способ лучше. А
# список файлов может сгенерировать простой скрипт.
# Объявим переменную COMMON_SRC, которая содержит файлы с платформонезависимым кодом.
# file () будет рассмотрен позже, в соответствующих разделах.
file (GLOB COMMON_SRC *.cpp)
set (SOURCE ${COMMON_SRC})
file (GLOB ARM_SRC arm/*.cpp)
file (GLOB OPENRISC_SRC openrisc/*.cpp)
# Платформозависимые исходники
EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCH )
if (ARCH STREQUAL "arm")
set (SOURCE "${SOURCE} ${ARM_SRC}")
elseif (ARCH STREQUAL "openrisc")
set (SOURCE "${SOURCE} ${OPENRISC_SRC}")
endif()
#Финальный штрих и сборка.
add_executable(${PROJECT} ${SOURCE})
target_link_libraries (${PROJECT} pthread)