2. O que é?
Cmake é um sistema utilizado para automatização de
compilação
O objetivo é criar automaticamente os projetos
(Solution – Visual Studio, Makefile - Unix, Project –
Eclipse), de forma que você não precise criá-los
manualmente, ou dar manutenção no projeto.
3. CMakeLists
Este arquivo é utilizado para informar ao CMake:
Estrutura do projeto;
Localização do código fonte;
Dependências;
Definições necessárias, entre outras coisas.
4. Projeto Básico
O projeto mais simples pode ser criado com apenas
algumas linhas...
Para uma aplicação
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_executable(Tutorial tutorial.cpp)
Para uma biblioteca
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
add_library(Tutorial SHARED tutorial.cpp)
5. Comandos básicos
As variáveis do CMake são do tipo String e também é suportada uma lista
de Strings
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
set ( ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." )
set ( SRC_DIR "${ROOT}/src" )
list ( APPEND DIRS
"${ROOT}"
"${SRC_DIR}"
"${SRC_DIR}/kernel"
"${SRC_DIR}/utils"
"${SRC_DIR}/functions"
)
add_executable(Tutorial tutorial.cpp)
6. Comandos básicos
Para criar uma lista com todos os arquivos de uma pasta que
correspondam a uma restrição, utilize a função file ( GLOB VAR_NAME
“DIR/*.restrição” )
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
set ( ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." )
set ( SRC_DIR "${ROOT}/src" )
file ( GLOB SRCS ${SRC_DIR}/*.cpp )
file ( GLOB HEADERS ${SRC_DIR}/*.h)
add_executable(Tutorial ${SRCS} ${HEADERS})
7. Comandos básicos
Considere a seguinte estrutura de pastas
-src
-kernel
-TeProjection.cpp
-TeProjection.h
-TeDatabase.cpp
-TeDatabase.h
file(GLOB SRCS ${SRC_DIR}/kernel/*.cpp )
Após a execução do comando acima o conteúdo da variável SRCS será uma
lista com o caminho dos arquivos:
.../src/kernel/TeProjection.cpp
.../src/kernel/TeDatabase.cpp
8. Comandos básicos
Para adicionar diretórios ao caminho de busca do compilador, utilize
include_directories ( “dir” )
cmake_minimum_required (VERSION 2.6)
project (Tutorial)
set ( ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." )
set ( SRC_DIR "${ROOT}/src" )
list ( APPEND DIRS
"${ROOT}"
"${SRC_DIR}"
"${SRC_DIR}/kernel"
"${SRC_DIR}/utils"
"${SRC_DIR}/functions"
)
include_directories( ${DIRS} )
add_executable(Tutorial tutorial.cpp)
9. Comandos básicos
Para imprimir mensagens console do cmake, utilize
message ( STATUS “mensagem” )
message (STATUS “Found PostGIS libraries” )
12. Comandos básicos
Declaração de Funções
function(doSomething arg1 arg2)
...
endfunction(doSomething)
...
doSomething(“arg1“ “arg2”)
Versão 2.6 ou maior
13. Comandos básicos
Declaração de Macros
macro(doSomething arg1 arg2)
...
endmacro(doSomething)
...
doSomething(“arg1“ “arg2”)
Funções criam variáveis de escopo local e macros
utilizam escopo global
14. Comandos básicos
Para disponibilizar uma opção ao usuário, utiliza-se a
função OPTION
option(<option_variable> "help string describing option” [initial
value])
OPTION (TE_PDI_ENABLED "Add Image Processing support?" ON)
IF( ${TE_PDI_ENABLED} )
...
ENDIF( ${TE_PDI_ENABLED} )
15. Utilizar bibliotecas externas
Utiliza-se o comando find_package mas é necessário um destes arquivos:
Find<Project>.cmake na pasta do CMAKE_MODULE_PATH;
<Project>Config.cmake
É possível informar quais componentes são necessários e se a biblioteca é
obrigatória.
Após a execução deste comando uma variável terralib_FOUND será
configurada.
find_package ( terralib REQUIRED COMPONENTS shp spl)
16. Link
Para vincular o projeto com bibliotecas externas,
utiliza-se o comando target_link_libraries
target_link_libraries ( ${PROJ_NAME} ${TE_LIBRARIES})
17. Variáveis do Cmake
CMAKE_BUILD_TYPE: Específica o tipo de compilação
CMAKE_MODULE_PATH: Lista de pastas para procurar
por módulos.
Locais onde serão geradas as bibliotecas e executáveis:
CMAKE_LIBRARY_OUTPUT_DIRECTORY
CMAKE_RUNTIME_OUTPUT_DIRECTORY
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
18. Exemplo
Se em alguma das pastas do CMAKE_MODULE_PATH
existir um arquivo chamado FindINTL esta biblioteca
será incluída no projeto
find_package( INTL)
if( INTL_FOUND )
include_directories(${INTL_INCLUDE_DIRS})
list ( APPEND EXTERNAL_LIBS ${INTL_LIBRARIES} )
endif( INTL_FOUND )
...
target_link_libraries ( ${PROJ_NAME} ${EXTERNAL_LIBS})