introdução ao cmake

18
Introdução ao CMake Paulo Renato Morais Oliveira

Upload: paulo-remoli

Post on 11-Jun-2015

401 views

Category:

Technology


49 download

DESCRIPTION

Uma introdução a criação de projetos utilizando o CMake, http://www.cmake.org/

TRANSCRIPT

Page 1: Introdução ao CMake

Introdução ao CMake

Paulo Renato Morais Oliveira

Page 2: Introdução ao CMake

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

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

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

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

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

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

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

Comandos básicos

Para imprimir mensagens console do cmake, utilize message ( STATUS “mensagem” )

message (STATUS “Found PostGIS libraries” )

Page 10: Introdução ao CMake

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

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

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

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

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

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

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

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

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})