introdução ao cmake
DESCRIPTION
Uma introdução a criação de projetos utilizando o CMake, http://www.cmake.org/TRANSCRIPT
![Page 1: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/1.jpg)
Introdução ao CMake
Paulo Renato Morais Oliveira
![Page 2: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/2.jpg)
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.
![Page 3: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/3.jpg)
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.
![Page 4: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/4.jpg)
Projeto Básico
O projeto mais simples pode ser criado com apenas algumas linhas...
Para uma aplicação
Para uma biblioteca
cmake_minimum_required (VERSION 2.6) project (Tutorial) add_executable(Tutorial tutorial.cpp)
cmake_minimum_required (VERSION 2.6) project (Tutorial) add_library(Tutorial SHARED tutorial.cpp)
![Page 5: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/5.jpg)
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)
![Page 6: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/6.jpg)
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})
![Page 7: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/7.jpg)
Comandos básicos
Considere a seguinte estrutura de pastas
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
-src -kernel -TeProjection.cpp -TeProjection.h -TeDatabase.cpp -TeDatabase.h
![Page 8: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/8.jpg)
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)
![Page 9: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/9.jpg)
Comandos básicos
Para imprimir mensagens console do cmake, utilize message ( STATUS “mensagem” )
message (STATUS “Found PostGIS libraries” )
![Page 10: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/10.jpg)
Comandos básicos
IF if(expression) ...elseif(expression2)...else(expression)...endif(expression)
A mensagem será exibida se o valor da variável PostGIS_FOUND for empty, 0, N, NO, OFF, FALSE, NOTFOUND ou -NOTFOUND.
IF( PostGIS_FOUND )...
ELSE ( PostGIS_FOUND )message (STATUS “Found PostGIS libraries” )
ENDIF( PostGIS_FOUND )
![Page 11: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/11.jpg)
Comandos básicos
FOR EACH
Percorre os valores a, b, c com a variável f
set(VAR a b c) foreach(f ${VAR}) message( ${f} ) endforeach(f)
![Page 12: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/12.jpg)
Comandos básicos
Declaração de Funções
Versão 2.6 ou maior
function(doSomething arg1 arg2)...
endfunction(doSomething)...doSomething(“arg1“ “arg2”)
![Page 13: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/13.jpg)
Comandos básicos
Declaração de Macros
Funções criam variáveis de escopo local e macros utilizam escopo global
macro(doSomething arg1 arg2)...
endmacro(doSomething)...doSomething(“arg1“ “arg2”)
![Page 14: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/14.jpg)
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} )
![Page 15: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/15.jpg)
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)
![Page 16: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/16.jpg)
Link
Para vincular o projeto com bibliotecas externas, utiliza-se o comando target_link_libraries
target_link_libraries ( ${PROJ_NAME} ${TE_LIBRARIES})
![Page 17: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/17.jpg)
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
![Page 18: Introdução ao CMake](https://reader036.vdocuments.pub/reader036/viewer/2022073011/5579a11fd8b42ac1148b47e4/html5/thumbnails/18.jpg)
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})