我需要linux中mktemp命令的CMake模拟。宏提供了什么?如何在CMake中创建临时目录?
3
A
回答
2
没有直接的CMake模拟“mktemp”。
从CMake的脚本或文件的CMakeLists.txt里面,最好的办法是使用
file(MAKE_DIRECTORY "/path/to/dir/name")
命令,并给它,你知道你有写权限的目录的名称。帮助文件命令在这里找到:http://cmake.org/cmake/help/cmake-2-8-docs.html#command:file
你也可能只使用
$ENV{TMP}
如果有指向你的系统提供的临时目录的环境变量。
如果直接调用CMake的,你也可以使用
cmake -E make_directory /path/to/dir/name
最后,也看到了execute_process命令,它允许您从CMake的脚本或CMakeLists文件中调用任意的命令行工具和捕获输出。如果你有另外一个你可以调用的工具,这可能会很有用,它可以为你提供mktemp的功能。 http://cmake.org/cmake/help/cmake-2-8-docs.html#command:execute_process
3
也正在寻找此评估表达式,建议在CMake Wiki。写了一些宏和生成临时文件名和执行他们的例子:
#!/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)
输出:
Hai
A: Test
B: Test
注意,在Linux下,你可以设置此脚本可执行文件和使用cmake -P
运行它。用于测试东西。
0
我实现了下面的宏:
#!/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()
用法:
# 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}")
在我的Windows环境下的输出例( “myapp7” 相同,因为删除):
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. 在Haskell中创建临时目录
- 2. org.apache.jmeter.report.dashboard.GenerationException:无法创建临时目录“temp”
- 3. 无法创建临时目录
- 4. 如何创建一个临时目录,并在Python
- 5. 如何自动创建(并删除)Makefile中的临时目录?
- 6. 可以在系统的临时目录中创建flymake的临时文件吗?
- 7. 如何在使用java 1.6的Java应用程序内创建临时目录?
- 8. 如何获取Django中临时目录的子目录路径
- 9. SSIS - 如何在飞行Ole db目的地创建临时表
- 10. 在shell脚本中临时目录中的临时操作
- 11. 如何在Yocto中创建cmake食谱?
- 12. 如何在%appdata%中创建目录%
- 13. 如何在java swing中创建目录
- 14. 如何在SQL中创建目录?
- 15. 如何在Scripter Automation中创建目录
- 16. 当我创建一个临时文件/目录时,它何时会被删除?
- 17. 在TeamCity中禁用MSTest临时目录
- 18. 阿帕奇星火无法创建临时目录
- 19. 多处理python-server创建太多临时目录
- 20. Lucene 4.9:使用文档创建临时目录
- 21. docker-compose内部错误:无法创建临时目录
- 22. iOS:什么是创建临时目录的安全方式?
- 23. 在maven中需要时创建目录
- 24. 创建临时表
- 25. 创建临时表
- 26. 创建临时表
- 27. 从纯C在windows中创建一个唯一的临时目录
- 28. 如何使用ifnull创建临时表
- 29. CMake的构建和项目目录
- 30. 如何在jstl中从临时目录导入jsp
感谢这一点。但我怎么能生成名称,所以我会确保没有同名的目录存在? – krvladislav 2011-06-20 14:01:43