c++ - utilizar - Maneira moderna de definir sinalizadores de compilador no projeto cmake de plataforma cruzada




manual cmake (3)

Abordando os dois primeiros pontos, mas não o terceiro:

  1. Eu li várias vezes, que um não deve definir manualmente CMAKE_CXX_FLAGS e variáveis ​​semelhantes, em primeiro lugar, mas não tenho certeza qual outro mecanismo para usar.

O comando que você quer é set_property . O CMake suporta um monte de propriedades - não tudo, mas muito - de uma maneira que evita o trabalho de fazer um trabalho específico do compilador. Por exemplo:

set_property(TARGET foo PROPERTY CXX_STANDARD 17)

o que para alguns compiladores resultará em --std=c++17 mas para os anteriores com --std=c++1z (antes que C ++ 17 fosse finalizado). ou:

set_property(TARGET foo APPEND PROPERTY COMPILE_DEFINITIONS HELLO WORLD)

O resultado será -DHELLO -DWORLD para gcc, clang e MSVC, mas para compiladores estranhos pode usar outros switches.

Existe relly nenhum comando como append que me permita substituir set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo") com append(CMAKE_CXX_FLAGS "Foo")?

set_property pode ser usado no modo set, ou no modo append (veja os exemplos acima).

Eu não posso dizer se isso é preferível a add_compile_options ou target_compile_features , no entanto.

Eu quero escrever um arquivo cmake que define diferentes opções de compilador para clang ++, g ++ e MSVC em compilações de depuração e lançamento. O que estou fazendo atualmente é algo como isto:

if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /W4")
    # Default debug flags are OK 
    set(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall -Wextra -Werror")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} some other flags")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")

    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
    else()
        # nothing special for gcc at the moment
    endif()
endif()

Mas eu tenho alguns problemas com isso:

  1. Primeiro o trivial: há relly nenhum comando como appen que me permita substituir set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo") com append(CMAKE_CXX_FLAGS "Foo") ?
  2. Eu li várias vezes, que um não deve definir manualmente CMAKE_CXX_FLAGS e variáveis ​​semelhantes, em primeiro lugar, mas não tenho certeza qual outro mecanismo para usar.
  3. Mais importante: A maneira que eu faço isso aqui, eu preciso de um diretório de compilação separado para cada compilador e configuração Idealmente eu gostaria de transformar isso em ter vários destinos no mesmo diretório para que eu possa, por exemplo, chamar make foo_debug_clang .

Então minhas perguntas são

  • a) Existe uma maneira melhor de escrever o roteiro cmake que resolve meus "pontos de dor"? solução para os pontos acima mencionados?
  • b) Existe algo como uma prática moderna e bem aceita de como configurar tais projetos?

A maioria das referências que eu encontrei na internet estão desatualizadas ou mostram apenas exemplos triviais. Atualmente estou usando cmake3.8, mas se isso faz alguma diferença, estou ainda mais interessado na resposta para versões mais recentes.


Outra maneira é usar arquivos .rsp.

set(rsp_file "${CMAKE_CURRENT_BINARY_DIR}/my.rsp")
configure_file(my.rsp.in ${rsp_file} @ONLY)
target_compile_options(mytarget PUBLIC "@${rsp_file}")

o que pode facilitar a inclusão de opções múltiplas e esotéricas.


Você pode usar target_compile_options () para "acrescentar" opções de compilação.





cmake