# No CMake, isso é um comentário # Para rodar nosso código, iremos utilizar esses comandos: # - mkdir build && cd build # - cmake .. # - make # # Com esses comandos, iremos seguir as melhores práticas para compilar em um # subdiretório e na segunda linha pediremos ao CMake para gerar um novo Makefile # independente de sistema operacional. E finalmente, rodar o comando make. #------------------------------------------------------------------------------ # Básico #------------------------------------------------------------------------------ # # O arquivo CMake deve ser chamado de "CMakeLists.txt". # Configura a versão mínima requerida do CMake para gerar o Makefile cmake_minimum_required (VERSION 2.8) # Exibe FATAL_ERROR se a versão for menor que 2.8 cmake_minimum_required (VERSION 2.8 FATAL_ERROR) # Configuramos o nome do nosso projeto. Mas antes disso, iremos alterar alguns # diretórios em nome da convenção gerada pelo CMake. Podemos enviar a LANG do # código como segundo parâmetro project (learncmake C) # Configure o diretório do código do projeto (somente convenção) set( LEARN_CMAKE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) set( LEARN_CMAKE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} ) # Isso é muito útil para configurar a versão do nosso código no sistema de compilação # usando um estilo `semver` set (LEARN_CMAKE_VERSION_MAJOR 1) set (LEARN_CMAKE_VERSION_MINOR 0) set (LEARN_CMAKE_VERSION_PATCH 0) # Envie as variáveis (número da versão) para o cabeçalho de código-fonte configure_file ( "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "${PROJECT_BINARY_DIR}/TutorialConfig.h" ) # Inclua Diretórios # No GCC, isso irá invocar o comando "-I" include_directories( include ) # Onde as bibliotecas adicionais estão instaladas? Nota: permite incluir o path # aqui, na sequência as checagens irão resolver o resto set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/modules/" ) # Condições if ( CONDICAO ) # reposta! # Informação incidental message(STATUS "Minha mensagem") # Aviso CMake, continua processando message(WARNING "Minha mensagem") # Aviso (dev) CMake, continua processando message(AUTHOR_WARNING "Minha mensagem") # Erro CMake, continua processando, mas pula a geração message(SEND_ERROR "Minha mensagem") # Erro CMake, para o processamento e a geração message(FATAL_ERROR "Minha mensagem") endif() if( CONDICAO ) elseif( CONDICAO ) else( CONDICAO ) endif( CONDICAO ) # Loops foreach(loop_var arg1 arg2 ...) COMANDO1(ARGS ...) COMANDO2(ARGS ...) ... endforeach(loop_var) foreach(loop_var RANGE total) foreach(loop_var RANGE start stop [step]) foreach(loop_var IN [LISTS [list1 [...]]] [ITEMS [item1 [...]]]) while(condicao) COMANDO1(ARGS ...) COMANDO2(ARGS ...) ... endwhile(condicao) # Operações Lógicas if(FALSE AND (FALSE OR TRUE)) message("Não exiba!") endif() # Configure um cache normal, ou uma variável de ambiente com o dado valor. # Se a opção PARENT_SCOPE for informada em uma variável que será setada no escopo # acima do escopo corrente. # `set( ... [PARENT_SCOPE])` # Como refencia variáveis dentro de aspas ou não, argumentos com strings vazias # não serão setados ${nome_da_variavel} # Listas # Configure a lista de arquivos código-fonte set( LEARN_CMAKE_SOURCES src/main.c src/imagem.c src/pather.c ) # Chama o compilador # # ${PROJECT_NAME} referencia ao Learn_CMake add_executable( ${PROJECT_NAME} ${LEARN_CMAKE_SOURCES} ) # Linka as bibliotecas target_link_libraries( ${PROJECT_NAME} ${LIBS} m ) # Onde as bibliotecas adicionais serão instaladas? Nota: nos permite incluir o path # aqui, em seguida os testes irão resolver o restante set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake/modules/" ) # Condição do compilador (gcc ; g++) if ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) message( STATUS "Setting the flags for ${CMAKE_C_COMPILER_ID} compiler" ) add_definitions( --std=c99 ) endif() # Checa o Sistema Operacional if( UNIX ) set( LEARN_CMAKE_DEFINITIONS "${LEARN_CMAKE_DEFINITIONS} -Wall -Wextra -Werror -Wno-deprecated-declarations -Wno-unused-parameter -Wno-comment" ) endif()