J'ai besoin de l'instruction CMake analogue de mktemp sous linux. Quelle macro fournit cela?Comment créer un répertoire temporaire dans CMake?
Répondre
Il n'y a pas d'analogue CMake direct de "mktemp".
De l'intérieur d'un script ou d'un fichier CMake CMakeLists.txt, votre meilleur pari est d'utiliser le
file(MAKE_DIRECTORY "/path/to/dir/name")
commande
, et lui donner un nom d'un répertoire que vous savez que vous avez accès en écriture à. Aide pour la commande de fichier se trouve ici: http://cmake.org/cmake/help/cmake-2-8-docs.html#command:file
Vous pouvez aussi éventuellement utiliser simplement
$ENV{TMP}
s'il y a une variable d'environnement que vous pointe vers un système fourni par répertoire temporaire.
Si vous invoquez CMake directement, vous pouvez également utiliser
cmake -E make_directory /path/to/dir/name
Enfin, voir aussi la commande execute_process, ce qui vous permet d'appeler des outils de ligne de commande arbitraire à partir d'un fichier script CMake ou CMakeLists et capturer la sortie. Cela peut s'avérer utile si vous avez un autre outil que vous pouvez appeler qui vous donne la fonctionnalité mktemp. http://cmake.org/cmake/help/cmake-2-8-docs.html#command:execute_process
Était à la recherche de cela aussi pour évaluer les expressions comme suggéré dans le CMake Wiki. A écrit quelques macros et un exemple pour générer des noms de fichiers temporaires et les exécuter:
#!/usr/bin/cmake -P
macro(temp_name fname)
if(${ARGC} GREATER 1) # Have to escape ARGC to correctly compare
set(_base ${ARGV1})
else(${ARGC} GREATER 1)
set(_base ".cmake-tmp")
endif(${ARGC} GREATER 1)
set(_counter 0)
while(EXISTS "${_base}${_counter}")
math(EXPR _counter "${_counter} + 1")
endwhile(EXISTS "${_base}${_counter}")
set(${fname} "${_base}${_counter}")
endmacro(temp_name)
# Evaluate expression
# Suggestion from the Wiki: http://cmake.org/Wiki/CMake/Language_Syntax
# Unfortunately, no built-in stuff for this: http://public.kitware.com/Bug/view.php?id=4034
macro(eval expr)
temp_name(_fname)
file(WRITE ${_fname} "${expr}")
include(${_fname})
file(REMOVE ${_fname})
endmacro(eval)
# Examples
eval("message(\"Hai\")")
set(funcs a;b)
macro(test_a arg)
message("A: ${arg}")
endmacro(test_a)
macro(test_b arg)
message("B: ${arg}")
endmacro(test_b)
foreach(func ${funcs})
set(func_name test_${func})
eval("${func_name}(\"Test\")")
endforeach(func)
Sortie:
Hai
A: Test
B: Test
Notez que sous Linux, vous pouvez définir ce script exécutable et l'exécuter en utilisant cmake -P
. Utile pour tester des choses.
I mis en œuvre la macro suivante:
#!/usr/bin/cmake -P
include(CMakeParseArguments)
function(MKTEMP)
set(options CREATE_FOLDER CREATE_FILE)
set(oneValueArgs PREFIX PARENT OUTPUT_VARIABLE)
cmake_parse_arguments(MKTEMP "${options}" "${oneValueArgs}" "" ${ARGN})
if(NOT DEFINED MKTEMP_CREATE_FOLDER)
set(MKTEMP_CREATE_FOLDER FALSE)
endif()
if(NOT DEFINED MKTEMP_CREATE_FILE)
set(MKTEMP_CREATE_FILE FALSE)
endif()
if(MKTEMP_CREATE_FOLDER AND MKTEMP_CREATE_FILE)
# Can not create folder and file with the same name
message(FATAL_ERROR "Both flags CREATE_FOLDER and CREATE_FILE are set")
endif()
if(NOT DEFINED MKTEMP_PREFIX)
set(MKTEMP_PREFIX "tmp")
endif()
if(NOT DEFINED MKTEMP_PARENT)
set(MKTEMP_PARENT "$ENV{TMP}")
endif()
set(_COUNTER 0)
while(EXISTS "${MKTEMP_PARENT}/${MKTEMP_PREFIX}${_COUNTER}")
math(EXPR _COUNTER "${_COUNTER} + 1")
endwhile()
set(_NAME "${MKTEMP_PARENT}/${MKTEMP_PREFIX}${_COUNTER}")
set(${MKTEMP_OUTPUT_VARIABLE} "${_NAME}" PARENT_SCOPE)
if(MKTEMP_CREATE_FOLDER)
file(MAKE_DIRECTORY "${_NAME}")
elseif(MKTEMP_CREATE_FILE)
file(WRITE "${_NAME}" "")
endif()
endfunction()
Utilisation:
# only generate name - with default prefix ("tmp")
MKTEMP(OUTPUT_VARIABLE TMPONLYNAME)
message("TMPONLYNAME is ${TMPONLYNAME}")
# only generate name - with custom prefix ("myapp")
MKTEMP(PREFIX "myapp" OUTPUT_VARIABLE TMPONLYNAME)
message("TMPONLYNAME is ${TMPONLYNAME}")
# only generate name - use current folder as temp
MKTEMP(PARENT "." OUTPUT_VARIABLE TMPONLYNAME)
message("TMPONLYNAME is ${TMPONLYNAME}")
# create file
MKTEMP(PREFIX "myapp" OUTPUT_VARIABLE TMPFILE CREATE_FILE)
message("TMPFILE is ${TMPFILE}")
# ... work with file ...
file(REMOVE "${TMPFILE}")
# create folder
MKTEMP(PREFIX "myapp" OUTPUT_VARIABLE TMPFOLDER CREATE_FOLDER)
message("TMPFOLDER is ${TMPFOLDER}")
# ... work with folder ...
file(REMOVE_RECURSE "${TMPFOLDER}")
Exemple de sortie sur mon environnement Windows ("myapp7" même en raison de la suppression):
TMPONLYNAME is C:\Users\msuslov\AppData\Local\Temp\tmp1
TMPONLYNAME is C:\Users\msuslov\AppData\Local\Temp\myapp7
TMPONLYNAME is .\tmp0
TMPFILE is C:\Users\msuslov\AppData\Local\Temp\myapp7
TMPFOLDER is C:\Users\msuslov\AppData\Local\Temp\myapp7
- 1. Comment créer un répertoire temporaire en C++?
- 2. Opération temporaire dans un répertoire temporaire dans un script shell
- 3. comment créer un sous-répertoire dans un répertoire
- 4. Comment créer un utilisateur temporaire dans QuickBlox?
- 5. Suppression du répertoire temporaire
- 6. CMake: répertoire parent?
- 7. Comment créer (et supprimer) automatiquement un répertoire temporaire dans un Makefile?
- 8. Comment pointer cmake dans un répertoire spécifique pour la bibliothèque?
- 9. Comment laisser CMake connaître la bibliothèque dans un répertoire?
- 10. cmake déplacer le répertoire
- 11. comment créer un répertoire temporaire dans une application Java en utilisant java 1.6?
- 12. Comment créer un fichier temporaire sous iis
- 13. Comment créer un fichier .txt dans un dossier Internet temporaire?
- 14. Comment créer un fichier std :: ofstream dans un fichier temporaire?
- 15. CMake: add_custom_command avec la dépendance dans un répertoire différent
- 16. org.openqa.selenium.WebDriverException: Impossible de créer le répertoire temporaire:/sd card/1339054625829.
- 17. chemin vers le répertoire temporaire dans cpan
- 18. ont CMake changement dans le répertoire binaire
- 19. Comment créer le fichier texte dans le répertoire temporaire d'une application dans Iphone
- 20. Spécifiez le répertoire temporaire dans .jnlp
- 21. Comment créer un nom de fichier temporaire dans Erlang?
- 22. Accéder au répertoire temporaire dans Swift
- 23. Créer un répertoire dans NSTemporaryDirectory
- 24. Comment créer un répertoire virtuel?
- 25. Comment créer un répertoire immuable dans svn?
- 26. Comment créer un répertoire imbriqué dans ruby
- 27. Comment créer un répertoire dans wix?
- 28. Comment créer un répertoire dans "user.home"?
- 29. Comment créer un répertoire modifiable dans Android
- 30. Comment créer un répertoire temporaire et obtenir le chemin/nom de fichier en Python
Merci pour cela. mais comment puis-je générer le nom afin que je sois sûr qu'il n'existe pas de dir avec le même nom? – krvladislav