SlideShare une entreprise Scribd logo
1  sur  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})

Contenu connexe

Tendances

セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)
セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)
セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)ToCJ
 
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)戦略とは何か?|経営戦略フレームワーク活用講座(初級編)
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)取締役
 
Rsa in CTF
Rsa in CTFRsa in CTF
Rsa in CTFSoL ymx
 
ICPC国内予選F解説
ICPC国内予選F解説ICPC国内予選F解説
ICPC国内予選F解説tmaehara
 
Qu'est ce que l'optimisation du capital humain?
Qu'est ce que l'optimisation du capital humain?Qu'est ce que l'optimisation du capital humain?
Qu'est ce que l'optimisation du capital humain?REPEX
 
Résumé du cours des mathématiques financière + t ds s2
Résumé du cours des mathématiques financière + t ds s2Résumé du cours des mathématiques financière + t ds s2
Résumé du cours des mathématiques financière + t ds s2Jamal Yasser
 
- IHEC (Présentation HEC PREPA)
- IHEC (Présentation HEC PREPA)- IHEC (Présentation HEC PREPA)
- IHEC (Présentation HEC PREPA)Farah Zéga
 

Tendances (7)

セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)
セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)
セオリー・オブ・チェンジ(ToC)とは(2020.6.9. 神戸大学経営学部内田ゼミ)
 
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)戦略とは何か?|経営戦略フレームワーク活用講座(初級編)
戦略とは何か?|経営戦略フレームワーク活用講座(初級編)
 
Rsa in CTF
Rsa in CTFRsa in CTF
Rsa in CTF
 
ICPC国内予選F解説
ICPC国内予選F解説ICPC国内予選F解説
ICPC国内予選F解説
 
Qu'est ce que l'optimisation du capital humain?
Qu'est ce que l'optimisation du capital humain?Qu'est ce que l'optimisation du capital humain?
Qu'est ce que l'optimisation du capital humain?
 
Résumé du cours des mathématiques financière + t ds s2
Résumé du cours des mathématiques financière + t ds s2Résumé du cours des mathématiques financière + t ds s2
Résumé du cours des mathématiques financière + t ds s2
 
- IHEC (Présentation HEC PREPA)
- IHEC (Présentation HEC PREPA)- IHEC (Présentation HEC PREPA)
- IHEC (Présentation HEC PREPA)
 

Similaire à Introdução ao CMake

Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECLW3P Projetos Web
 
Linux4all#2
Linux4all#2Linux4all#2
Linux4all#2Daniel
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
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.9Nando Vieira
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rustBruno Rocha
 
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ídaDeivid Martins
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Giovanni Bassi
 
Matlab – curso básico (1)
Matlab – curso básico (1)Matlab – curso básico (1)
Matlab – curso básico (1)Felipe Meganha
 
Linguagem c wellington telles - aula 02
Linguagem c   wellington telles - aula 02Linguagem c   wellington telles - aula 02
Linguagem c wellington telles - aula 02profwtelles
 
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)Fabrício Catae
 

Similaire à Introdução ao CMake (20)

Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECL
 
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
 

Dernier

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.docx2m Assessoria
 
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.docx2m Assessoria
 
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.docx2m Assessoria
 
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.docx2m Assessoria
 
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 exemploDanilo Pinotti
 
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 CalisthenicsDanilo Pinotti
 

Dernier (6)

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

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