Upload
paulo-remoli
View
401
Download
49
Embed Size (px)
DESCRIPTION
Uma introdução a criação de projetos utilizando o CMake, http://www.cmake.org/
Citation preview
Introdução ao CMake
Paulo Renato Morais Oliveira
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.
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.
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)
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)
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})
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
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)
Comandos básicos
Para imprimir mensagens console do cmake, utilize message ( STATUS “mensagem” )
message (STATUS “Found PostGIS libraries” )
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 )
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)
Comandos básicos
Declaração de Funções
Versão 2.6 ou maior
function(doSomething arg1 arg2)...
endfunction(doSomething)...doSomething(“arg1“ “arg2”)
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”)
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} )
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)
Link
Para vincular o projeto com bibliotecas externas, utiliza-se o comando target_link_libraries
target_link_libraries ( ${PROJ_NAME} ${TE_LIBRARIES})
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
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})