2011-06-16 3 views

Répondre

2

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

+0

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

3

É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.

0

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 
Questions connexes