SlideShare a Scribd company logo
1 of 18
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

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

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

IF( PostGIS_FOUND )
...
ELSE ( PostGIS_FOUND )
message (STATUS “Found PostGIS libraries” )
ENDIF( PostGIS_FOUND )


A mensagem será exibida se o valor da variável
PostGIS_FOUND for empty, 0, N, NO, OFF,
FALSE, NOTFOUND ou -NOTFOUND.
Comandos básicos


FOR EACH
set(VAR a b c)
foreach(f ${VAR})
message( ${f} )
endforeach(f)
Percorre os valores a, b, c com a variável f
Comandos básicos


Declaração de Funções
function(doSomething arg1 arg2)
...
endfunction(doSomething)
...
doSomething(“arg1“ “arg2”)



Versão 2.6 ou maior
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
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})

More Related Content

Similar to Introdução ao CMake

Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6
Giovanni Bassi
 
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECLPHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
Erick Belluci Tedeschi
 

Similar to Introdução ao CMake (20)

Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Apostila de-vb-net
Apostila de-vb-netApostila de-vb-net
Apostila de-vb-net
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
Ud2
Ud2Ud2
Ud2
 
Linux shell
Linux shellLinux shell
Linux shell
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6
 
Prova qco-2008.informática
Prova qco-2008.informáticaProva qco-2008.informática
Prova qco-2008.informática
 
Matlab – curso básico (1)
Matlab – curso básico (1)Matlab – curso básico (1)
Matlab – curso básico (1)
 
Linguagem c wellington telles - aula 02
Linguagem c   wellington telles - aula 02Linguagem c   wellington telles - aula 02
Linguagem c wellington telles - aula 02
 
Curso de java 02
Curso de java 02Curso de java 02
Curso de java 02
 
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
TechEd 2005: Novos Recursos T-SQL (SQL 2005)TechEd 2005: Novos Recursos T-SQL (SQL 2005)
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
 
Basico dovba excel_tutorial1
Basico dovba excel_tutorial1Basico dovba excel_tutorial1
Basico dovba excel_tutorial1
 
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECLPHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
 

Recently uploaded

Recently uploaded (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 

Introdução ao CMake

  • 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” )
  • 10. Comandos básicos  IF if(expression) ... elseif(expression2) ... else(expression) ... endif(expression) IF( PostGIS_FOUND ) ... ELSE ( PostGIS_FOUND ) message (STATUS “Found PostGIS libraries” ) ENDIF( PostGIS_FOUND )  A mensagem será exibida se o valor da variável PostGIS_FOUND for empty, 0, N, NO, OFF, FALSE, NOTFOUND ou -NOTFOUND.
  • 11. Comandos básicos  FOR EACH set(VAR a b c) foreach(f ${VAR}) message( ${f} ) endforeach(f) Percorre os valores a, b, c com a variável f
  • 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})