Normalmente, tenho uma política em meu projeto, de nunca criar linhas em arquivos de texto que excedam o comprimento de linha de 80, para que sejam facilmente editáveis em todos os tipos de editores (você conhece o negócio). Mas com o CMake, tenho o problema de não saber como dividir uma string simples em várias linhas para evitar uma linha enorme. Considere este código básico:
set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
Já ultrapassa o limite de 80 linhas. Então, como faço para quebrar uma linha no CMake em várias linhas sem chegar a verbose (várias list(APPEND ...)
ou semelhantes)?
CMake 3.0 e mais recente
Use o
string(CONCAT)
comando:Embora o CMake 3.0 e os mais recentes suportem a continuação de linha de argumentos entre aspas , você não pode indentar a segunda linha ou as linhas subsequentes sem obter o espaço em branco de indentação incluído em sua string.
CMake 2.8 e anterior
Você pode usar uma lista. Cada elemento da lista pode ser colocado em uma nova linha:
Uma lista usada sem aspas é concatenada sem espaço em branco:
Se você realmente precisa de uma string, pode primeiro converter a lista em uma string:
Quaisquer pontos e vírgulas em suas strings originais serão vistos como separadores de elementos de lista e removidos. Eles devem ser escapados:
fonte
Ainda é um pouco prolixo, mas se o limite de 80 caracteres realmente incomodar você, você pode anexar repetidamente à mesma variável:
Dá saída:
fonte
Não há como dividir um literal de string em várias linhas em arquivos CMakeLists.txt ou em scripts CMake. Se você incluir uma nova linha em uma string, haverá uma nova linha literal na própria string.
No entanto, o CMake usa espaços em branco para separar os argumentos, de modo que você pode alterar um espaço que é um separador de argumento em uma nova linha em qualquer lugar que desejar, sem alterar o comportamento.
Você poderia reformular esta linha mais longa:
como essas duas linhas mais curtas:
Eles são totalmente equivalentes.
fonte
O exemplo da pergunta original é apenas sobre uma string relativamente curta. Para strings mais longas (incluindo os exemplos dados em outras respostas), um argumento de colchete pode ser melhor. Da documentação:
fonte
\n
s. Se você não quiser isso, não acho que os argumentos dos colchetes sejam sua solução.Para aqueles que foram trazidos aqui de Como faço para dividir uma expressão do gerador CMake em várias linhas? Eu gostaria de adicionar algumas notas.
O método de continuação de linha não funcionará, o CMake não pode analisar uma lista de gerador feita com espaços em branco (indentação) e continuação de linha.
Embora a solução de string (CONCAT) forneça uma expressão geradora que pode ser avaliada, a expressão avaliada será cercada por aspas se o resultado contiver um espaço.
Para cada opção individual a ser adicionada, uma lista de gerador separada deve ser construída, portanto, as opções de empilhamento como fiz a seguir farão com que a compilação falhe:
Isso ocorre porque as opções resultantes são passadas para o compilador entre aspas
Para avaliar expressões geradoras extensas representadas usando a solução de string (CONCAT), cada expressão geradora deve ser avaliada em uma única opção sem espaços:
Isso pode não estar relacionado à pergunta para a qual estou postando uma resposta; infelizmente, a pergunta que estou respondendo está marcada incorretamente como uma duplicata desta pergunta.
As listas de geradores não são tratadas e analisadas da mesma forma que as strings e, por isso, há medidas adicionais que devem ser tomadas para dividir uma lista de geradores em várias linhas.
fonte
Para manter uma boa indentação em seu código, é simples o suficiente apenas fazer
Ou forme uma string diretamente com
como na resposta de Douglas que tem mais detalhes. No entanto, pensei que isso poderia apenas resumir o ponto essencial.
fonte