o CMake, por Exemplo

Mirko Kiefer
Fev 22, 2017 · 4 min de leitura

Quando tentar aprender o CMake eu não poderia encontrar qualquer boa introdução. A documentação do CMake é bastante abrangente, mas não é adequada para um iniciante. Existem alguns tutoriais úteis ligados no Wiki do CMake, mas a maioria deles apenas cobrem problemas muito específicos ou são muito básicos. Então eu escrevi esta breve introdução CMake como uma versão destilada do que eu descobri depois de trabalhar através dos docs e seguir perguntas stackoverflow.

é um trabalho em progresso e eu vou tentar continuamente melhorá-lo.

o CMake é uma meta construir a ferramenta que permite a você gerar nativo construção de scripts para uma variedade de plataformas:

  • Unix Makefiles
  • Xcode
  • Visual Studio
  • CodeBlocks
  • Eclipse
  • e muito mais…

Veja a lista completa de CMake geradores.

vamos assumir que temos um aplicativo simples com um único .c file.

We by creating a CMakeLists.txt file in the root of our project.

cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)

é tudo o que precisamos para construir o nosso aplicativo com qualquer um dos geradores disponíveis.

add_executable define o nosso binário com todos os ficheiros de código ligados.

installdiz ao cmake para instalar o nosso binário nobin directório da pasta de instalação.

construir

CMake suporta compilações fora do código – por isso todo o nosso código compilado vai para uma pasta separada das fontes.

Para iniciar uma compilação vamos criar uma nova pasta:

mkdir _build
cd _build

E chame o cmake com o caminho para a raiz do projeto (neste caso, a pasta pai):

cmake ..

Isso irá gerar scripts de compilação usando o padrão do gerador — sobre Linux/OSX, este deve ser Makefiles.

Por omissão, o cmake irá instalar a nossa compilação nas pastas do sistema.
para definir uma pasta de instalação personalizada, basta passá-la para cmake:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

para executar o programa de compilação, pode simplesmente usar o Makefile:

make
make install

agora podemos executar nosso binário a partir do diretório de instalação:

../_install/bin/myapp

Se a gente queria usar um outro gerador de nós passá-lo para o cmake, usando o -G parâmetro:

cmake .. -GXcode

Esta será a saída de um facilmente configurado projeto Xcode para construir a nossa aplicação.

Usando o CMake com bibliotecas

Para criar uma biblioteca usamos um script similar:

cmake_minimum_required(VERSION 2.8)project(libtest_project)add_library(test STATIC test.c)install(TARGETS test DESTINATION lib)
install(FILES test.h DESTINATION include)

o CMake vai criar a biblioteca libtest.a e instale-o na pasta lib do diretório de instalação.
Nós também incluímos nosso arquivo de cabeçalho público no passo de instalação e dizemos ao cmake para colocá-lo em include.

em Vez de uma biblioteca estática que possamos construir uma biblioteca partilhada também:

add_library(test SHARED test.c)

bibliotecas para executáveis com o CMake

podemos estender o nosso executável a partir de cima, ligando a nossa libray libtest.a.

vamos começar adicionando o diretório da biblioteca como um subdiretório para o nosso projeto myapp.

Agora, podemos usar a biblioteca definida nas CMakeLists.txt da libtest_ project na lista de CMakeLists do myapp.txt:

cmake_minimum_required(VERSION 2.8)project(myapp)add_subdirectory(libtest_project)add_executable(myapp main.c)target_link_libraries(myapp test)install(TARGETS myapp DESTINATION bin)

add_subdirectory faz com que a biblioteca test definido em libtestproject disponíveis para a compilação.
In target_link_libraries we tell CMake to link it to our executable. O CMake certificar-se-á de fazer o primeiro teste antes de o ligar ao myapp.

incluindo bibliotecas externas usando outros sistemas de compilação

enquanto o CMake goza de crescente interesse, ainda existem muitas bibliotecas usando sistemas de compilação nativos como os Makefiles Unix. Você pode fazer uso deles em seu projeto CMake sem ter que reescrever seus scripts de construção.

Tudo o que precisamos é o CMake de apoio para projetos externos e importados bibliotecas:

ExternalProject_Add(project_luajit
URL http://luajit.org/download/LuaJIT-2.0.1.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
CONFIGURE_COMMAND ""
BUILD_COMMAND make
INSTALL_COMMAND make install
PREFIX=${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
)ExternalProject_Get_Property(project_luajit install_dir)add_library(luajit STATIC IMPORTED)set_property(TARGET luajit PROPERTY IMPORTED_LOCATION ${install_dir}/lib/libluajit-5.1.a)add_dependencies(luajit project_luajit)add_executable(myapp main.c)include_directories(${install_dir}/include/luajit-2.0)target_link_libraries(myapp luajit)

ExternalProject_Add nos permite adicionar um projeto externo como destino para o nosso projeto. Se não indicar comandos como BUILD_COMMAND ou INSTALL_COMMAND, o CMake irá procurar por um CMakeLists.txt no projecto externo e executá-lo.
no nosso caso, queremos fazer uso da biblioteca luajit que é construída usando um Makefile.

add_librarysuporta a importação de bibliotecas já construídas também – nós só temos que definir sua propriedadeIMPORTED_LOCATION.
Calling ExternalProject_Add only specifies the external project as a target but does not automatically build it. Só será construída se lhe acrescentarmos uma dependência. Nós, portanto, chamamos add_dependencies para tornar a nossa biblioteca importada dependente do projeto externo.finalmente podemos ligar a nossa biblioteca importada como uma biblioteca “normal”com target_link_libraries.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *