Já faz algum tempo que estou brincando com o CMake, tentando aprender o máximo possível sobre a ferramenta. Devo admitir que o conceito de ambientes de configuração única (Makefiles, Ninja) versus ambientes de múltiplas configurações (Visual Studio, XCode, outros) e expressões geradoras realmente me confunde. Então, aqui está minha pergunta em um formato curto:
No CMake é uma boa ideia fazer verificações (como: condições if) para ver com qual ambiente estamos lidando e prosseguir com comandos específicos a partir daí? (Por exemplo, verifique se estamos lidando com um ambiente multi-configuração e só então use expressões geradoras)
Ou é possível e melhor usar expressões geradoras para ambos, independentemente do que estamos lidando?
Normalmente, sim. E eu aconselho fazer isso tanto quanto possível. Se você oferece suporte a geradores de configuração múltipla, normalmente obtém suporte a gerador de configuração única gratuitamente.
À luz do que acabei de dizer acima, espero que isso resulte apenas em duplicação inútil, legibilidade reduzida e carga de manutenção. Eu sugiro fazer isso apenas se você não tiver escolha a não ser fazê-lo para obter alguma funcionalidade específica. Ex. Se você quiser gerar algum arquivo para um subdiretório por configuração para multi-config, mas não adicionar aquele subdiretório intermediário adicional para configuração única (não consigo pensar por que alguém poderia querer fazer isso, então provavelmente não é um ótimo exemplo, mas foi o que pensei).
Veja também https://stackoverflow.com/a/73562787/11107541 , que fala sobre a propriedade global chamada
GENERATOR_IS_MULTI_CONFIG
.Ok, para fins de interesse, passei por um de meus próprios projetos e procurei onde uso
GENERATOR_IS_MULTI_CONFIG
, e uso em três lugares (não estou dizendo que sei o que é melhor aqui e estou fazendo a coisa mais inteligente - poderia haver maneiras melhores de conseguir o que quero e que simplesmente não conheço - apenas tentando encontrar alguns exemplos mais realistas):para definir "valores padrão" para variáveis como
CMAKE_RUNTIME_OUTPUT_DIRECTORY
e seus amigos, de modo que haja um subdiretório intermediário para cada configuração para separar suas saídas, mas não para geradores de configuração única.definir apenas a docstring e
STRINGS
a propriedadeCMAKE_BUILD_TYPE
se o gerador for de configuração única (apenas uma questão de qualidade de vida para meus usuários, para evitar a confusão comum sobre se éCMAKE_BUILD_TYPE
significativo para geradores de configuração múltipla (não é)).para definir uma variável que corresponda ao diretório onde o CMake colocará os arquivos de objeto para um destino, que possui um diretório intermediário apenas para multiconfiguração. Observe que é muito estranho se preocupar com onde o CMake colocará os arquivos de objeto. Eu precisava disso
-fprofile-prefix-path
para uma configuração de compilação PGO personalizada.