Skip to content

Instantly share code, notes, and snippets.

@scivision
Last active October 24, 2022 20:28
Show Gist options
  • Save scivision/2581385d2a5187426020dc17f111d9a2 to your computer and use it in GitHub Desktop.
Save scivision/2581385d2a5187426020dc17f111d9a2 to your computer and use it in GitHub Desktop.
CMake generate new temporary directory or temporary filename
#include <stdio.h>
int main(void){
char name[L_tmpnam];
if(tmpnam(name) == NULL){
printf("Temporary file name: %s\n", name);
return 0;
}
return 1;
}
#include <cstdio>
#include <iostream>
int main(){
char name[L_tmpnam];
if(std::tmpnam(name)){
std::cout << "Temporary file name: " << name << std::endl;
return 0;
}
return 1;
}
function(get_temp_dir ovar)
find_program(mktemp NAMES mktemp)
if(mktemp)
execute_process(COMMAND mktemp -d OUTPUT_VARIABLE out OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE ret)
if(ret EQUAL 0)
set(${ovar} ${out} PARENT_SCOPE)
return()
endif()
endif()
find_program(pwsh NAMES pwsh)
if(pwsh)
execute_process(COMMAND pwsh -c "[System.IO.Path]::GetTempPath()" OUTPUT_VARIABLE out OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE ret)
if(ret EQUAL 0)
string(RANDOM LENGTH 12 _s)
set(out ${out}${_s})
file(MAKE_DIRECTORY ${out})
set(${ovar} ${out} PARENT_SCOPE)
return()
endif()
endif()
message(FATAL_ERROR "Could not find mktemp or pwsh to make temporary directory")
endfunction(get_temp_dir)
# demo
get_temp_dir(TEMPDIR)
message(STATUS "temporary directory: ${TEMPDIR}")
function(get_temp_file ovar)
find_program(mktemp NAMES mktemp)
if(mktemp)
execute_process(COMMAND mktemp OUTPUT_VARIABLE out OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE ret)
if(ret EQUAL 0)
set(${ovar} ${out} PARENT_SCOPE)
return()
endif()
endif()
find_program(pwsh NAMES pwsh)
if(pwsh)
execute_process(COMMAND pwsh -c "New-TemporaryFile | Select -ExpandProperty FullName" OUTPUT_VARIABLE out OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE ret)
if(ret EQUAL 0)
set(${ovar} ${out} PARENT_SCOPE)
return()
endif()
endif()
message(FATAL_ERROR "Could not find mktemp or pwsh to make temporary file")
endfunction(get_temp_file)
# demo
get_temp_file(TEMPFILE)
message(STATUS "temporary file: ${TEMPFILE}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment