Diferencia entre CMAKE_CURRENT_SOURCE_DIR y CMAKE_CURRENT_LIST_DIR

105

De la Wiki:

CMAKE_CURRENT_SOURCE_DIR este es el directorio donde se encuentra el CMakeLists.txt actualmente procesado

CMAKE_CURRENT_LIST_DIR (desde 2.8.3) este es el directorio del archivo de lista que se está procesando actualmente.

De los Documentos:

CMAKE_CURRENT_SOURCE_DIR: la ruta al directorio de origen que se está procesando actualmente. Esta es la ruta completa al directorio de origen que cmake está procesando actualmente.

CMAKE_CURRENT_LIST_DIR: directorio completo del archivo de lista que se está procesando actualmente. A medida que CMake procesa los archivos de lista en su proyecto, esta variable siempre se establecerá en el directorio donde se encuentra el archivo de lista que se está procesando actualmente (CMAKE_CURRENT_LIST_FILE). El valor tiene alcance dinámico. Cuando CMake comienza a procesar comandos en un archivo fuente, establece esta variable en el directorio donde se encuentra este archivo. Cuando CMake termina de procesar los comandos del archivo, restaura el valor anterior. Por lo tanto, el valor de la variable dentro de una macro o función es el directorio del archivo que invoca la entrada más baja en la pila de llamadas, no el directorio del archivo que contiene la macro o la definición de la función.

¿En qué circunstancias estas variables tendrían valores diferentes?

William Payne
fuente
10
¿Y también en qué se diferencian de lo simple y agradable ./?
kyb

Respuestas:

139

Las variables CMAKE_CURRENT_SOURCE_DIRy CMAKE_CURRENT_LIST_DIRpueden hacer referencia a diferentes directorios para un archivo de lista de CMake que se incluye en otro archivo con el comando include . Por ejemplo, si a CMakeLists.txtestá presente en un directorio projecty contiene la siguiente directiva

include(src/CMakeLists.txt)

luego, mientras src/CMakeLists.txtse está procesando, CMAKE_CURRENT_LIST_DIRse referirá a project/srcmientras que CMAKE_CURRENT_SOURCE_DIRaún apunta al directorio externo project.

CMAKE_CURRENT_LIST_DIRresulta útil cuando necesita localizar archivos de recursos como archivos de plantilla o scripts por lotes que se encuentran junto al CMakeLists.txtarchivo que se está procesando actualmente.

sakra
fuente
42
+1. Solo agregaría que CMAKE_CURRENT_LIST_DIRcambia con cada archivo include(); no tiene que ser llamado CMakeLists.txt.
Angew ya no está orgulloso de SO
2
Buena discusión aquí sobre cómo usar de manera efectiva CMAKE_CURRENT_LIST_DIRy include(...)en sus proyectos.
jmcarter9t
1
Se confunde fácilmente porque CMAKE_CURRENT_SOURCE_DIRes más similar a lo CMAKE_SOURCE_DIRque implican los documentos.
Malaquías
Y con add_subdirectory()? ¿Apuntarán ambas variables a la carpeta?
einpoklum