A melhor maneira de especificar arquivos de origem no CMake é listando-os explicitamente .
Os próprios criadores do CMake aconselham a não usar globbing.
Consulte: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(Não recomendamos o uso do GLOB para coletar uma lista de arquivos de origem da sua árvore de origem. Se nenhum arquivo CMakeLists.txt for alterado quando uma fonte for adicionada ou removida, o sistema de compilação gerado não poderá saber quando pedir ao CMake para se regenerar.)
Claro, você pode querer saber quais são as desvantagens - continue lendo!
Quando o globbing falha:
A grande desvantagem do globbing é que a criação / exclusão de arquivos não atualizará automaticamente o sistema de compilação.
Se você é a pessoa que está adicionando os arquivos, isso pode parecer uma troca aceitável; no entanto, isso causa problemas para outras pessoas criarem seu código, elas atualizam o projeto do controle de versão, executam a construção e entram em contato com você, reclamando que
"a compilação está quebrado".
Para piorar a situação, a falha normalmente gera algum erro de vinculação que não fornece dicas para a causa do problema e o tempo é perdido para solucionar o problema.
Em um projeto em que trabalhei, começamos a espiar, mas recebemos tantas reclamações quando novos arquivos foram adicionados, que era motivo suficiente para listar explicitamente os arquivos em vez de espelhar.
Isso também quebra os fluxos de trabalho comuns do git
( git bisect
e alterna entre ramificações de recursos).
Portanto, eu não poderia recomendar isso, os problemas que causam superam muito a conveniência, quando alguém não pode criar seu software por causa disso, eles podem perder muito tempo para rastrear o problema ou simplesmente desistir.
E outra observação: lembrar que o toque CMakeLists.txt
nem sempre é suficiente. Com compilações automatizadas que usam globbing, eu precisava executar cmake
antes de cada compilação, pois os arquivos podem ter sido adicionados / removidos desde a última compilação *.
Exceções à regra:
Há momentos em que o globbing é preferível:
- Para configurar
CMakeLists.txt
arquivos para projetos existentes que não usam o CMake.
É uma maneira rápida de obter toda a fonte de referência (uma vez que o sistema de compilação esteja funcionando - substitua o globbing por listas de arquivos explícitas).
- Quando o CMake não é usado como o sistema de compilação primário , se, por exemplo, você está usando um projeto que não está usando o CMake, e gostaria de manter seu próprio sistema de compilação.
- Para qualquer situação em que a lista de arquivos seja alterada com tanta frequência que se torne impraticável de manter. Nesse caso, pode ser útil, mas você deve aceitar a execução
cmake
para gerar arquivos de compilação toda vez para obter uma compilação confiável / correta (o que contraria a intenção do CMake - a capacidade de dividir a configuração da compilação ) .
* Sim, eu poderia ter escrito um código para comparar a árvore de arquivos em disco antes e depois de uma atualização, mas essa não é uma solução tão agradável e algo melhor deixado para o sistema de compilação.