CMakeFiles.txt
Para compilar um programa com Cmake, crie um arquivo CMakeFiles.txt
na raiz do projeto.
Este arquivo deve conter:
Versão minima que a maquina deve ter para compilar
1
| cmake_minimum_required(VERSION 3.2)
|
Nome do projeto.
Para imprimir textos podemos usar o message
:
1
2
| message("SDL Libraries: ${SDL2_LIBRARIES}")
message("SDL Includes: ${SDL2_INCLUDE_DIRS}")
|
É possível criar um BuildConfig file injetando variáveis em compile-time. Para isso, defina o nome e o valor da variável.
1
2
3
4
| # exemplos
set(GCM_VERSION_MAJOR 1)
set(GCM_VERSION_MINOR 0)
set(GCM_VERSION_PATCH 0)
|
Agora, define o arquivo que de origem na extensão .in
que conterá as variáveis no formato @var_name@
e o arquivo de destino onde será gerado.
Semlhante à um BuildConfig file
1
2
3
4
5
| # As variaveis PROJECT_SOURCE_DIR e PROJECT_BINARY_DIR são padrões do cmake
configure_file(
"${PROJECT_SOURCE_DIR}/version.h.in"
"${PROJECT_BINARY_DIR}/version.h"
)
|
Pode ser usado um diretório diferente para que o cmake escreva o novo arquivo com os valores atribuídos OU usar o diretório binário e depois atribuir
o diretório como include.
1
2
| # incluir os headers file na hora do build
include_directories("${PROJECT_BINARY_DIR}")
|
Para definir o nome do executável e os arquivos *.cpp
que entrarão no build.
1
| add_executable(gcm main.cpp)
|
Libraries
Para incluir uma library externa, primeiro precisamos descobrir se ela existe. Com REQUIRED
, obrigamos que a compilação somente passe se tiver a library.
1
| find_package(SDL2 REQUIRED)
|
Agora, devemos incluir os headers junto ao binário.
1
2
3
4
| include_directories(
# "${PROJECT_BINARY_DIR}"
${SDL2_INCLUDE_DIRS}
)
|
E por último, incluir a library em si no executável para que o linker possa trabalhar.
1
2
3
4
| target_link_libraries(
gcm
${SDL2_LIBRARIES}
)
|
Exemplos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| cmake_minimum_required(VERSION 3.2)
project(gcm)
# Para criar BuildConfig files injetando variáveis em compile-time
# 1. Defina o nome e o valor da variável
set(GCM_VERSION_MAJOR 1)
set(GCM_VERSION_MINOR 0)
set(GCM_VERSION_PATCH 0)
# 2. Define o arquivo que de origem na extensão .in que conterá
# as variáveis no formato @var_name@ e o arquivo de destino onde
# será gerado.
# Idem BuildConfig
configure_file(
"${PROJECT_SOURCE_DIR}/version.h.in"
"${PROJECT_BINARY_DIR}/version.h"
)
include_directories(
"${PROJECT_BINARY_DIR}"
${SDL2_INCLUDE_DIRS}
)
add_executable(gcm main.cpp)
# Inclui as dependencias
target_link_libraries(gcm
${SDL2_LIBRARIES}
)
|
1
2
3
4
| // version.h.in
#define VERSION_MAJOR @GCM_VERSION_MAJOR@
#define VERSION_MINOR @GCM_VERSION_MINOR@
#define VERSION_PATCH @GCM_VERSION_PATCH@
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| // main.cpp
#include <iostream>
#include "version.h"
void version()
{
std::cout << "Version : " <<
VERSION_MAJOR << "." <<
VERSION_MINOR << "." <<
VERSION_PATCH << std::endl;
}
int main(int argc, char **argv)
{
version();
std::cout << "Hello C++!" << std::endl;
return 0;
}
|