Diferença entre CMAKE_CURRENT_SOURCE_DIR e CMAKE_CURRENT_LIST_DIR

105

Do Wiki:

CMAKE_CURRENT_SOURCE_DIR este é o diretório onde o CMakeLists.txt processado atualmente está localizado

CMAKE_CURRENT_LIST_DIR (desde 2.8.3) este é o diretório do listfile sendo processado atualmente.

Do Docs:

CMAKE_CURRENT_SOURCE_DIR: O caminho para o diretório de origem que está sendo processado. Este é o caminho completo para o diretório de origem que está sendo processado pelo cmake.

CMAKE_CURRENT_LIST_DIR: Diretório completo do listfile atualmente em processamento. Conforme o CMake processa os arquivos de lista em seu projeto, esta variável sempre será definida para o diretório onde o arquivo de lista que está sendo processado atualmente (CMAKE_CURRENT_LIST_FILE) está localizado. O valor tem escopo dinâmico. Quando CMake começa a processar comandos em um arquivo fonte, ele define esta variável para o diretório onde este arquivo está localizado. Quando CMake termina de processar comandos do arquivo, ele restaura o valor anterior. Portanto, o valor da variável dentro de uma macro ou função é o diretório do arquivo que invoca a entrada mais inferior na pilha de chamadas, não o diretório do arquivo que contém a macro ou definição de função.

Sob quais circunstâncias essas variáveis ​​teriam valores diferentes?

William Payne
fonte
10
E também como eles diferem de simples e agradáveis ./?
kyb

Respostas:

138

As variáveis CMAKE_CURRENT_SOURCE_DIRe CMAKE_CURRENT_LIST_DIRpodem referir-se a diferentes diretórios para um arquivo de lista CMake que é incluído por outro arquivo com o comando include . Por exemplo, se um CMakeLists.txtestá presente em um diretório projecte contém a seguinte diretiva

include(src/CMakeLists.txt)

então, while src/CMakeLists.txtestá sendo processado CMAKE_CURRENT_LIST_DIRfará referência a project/srcenquanto CMAKE_CURRENT_SOURCE_DIRainda aponta para o diretório externo project.

CMAKE_CURRENT_LIST_DIRé útil quando você precisa localizar arquivos de recursos, como arquivos de modelo ou scripts em lote, localizados próximos ao CMakeLists.txtarquivo que está sendo processado.

sakra
fonte
42
+1. Eu apenas adicionaria essas CMAKE_CURRENT_LIST_DIRmudanças com cada arquivo que você include(); não precisa ser chamado CMakeLists.txt.
Angew não está mais orgulhoso de SO,
2
Boa discussão aqui sobre como usar CMAKE_CURRENT_LIST_DIRe include(...)em seus projetos com eficácia .
jmcarter9t
1
Facilmente confundido porque CMAKE_CURRENT_SOURCE_DIRé mais semelhante a do CMAKE_SOURCE_DIRque os documentos sugerem.
Malaquias
E com add_subdirectory()? Ambas as variáveis ​​apontarão para a pasta?
einpoklum