try_compile: Use random executable file name (#12957)

Append a random number to the "cmTryCompileExec" file name to avoid
rapid creation and deletion of the same executable file name.  Some
filesystems lock executable files when they are created and cause
subsequent try-compile tests to fail arbitrarily.  Use a different
name each time to avoid conflict.
This commit is contained in:
Brad King 2012-02-13 10:02:58 -05:00
parent 16b1a6e4e0
commit 4fbdce2b79
1 changed files with 9 additions and 4 deletions

View File

@ -26,6 +26,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv)
const char* sourceDirectory = argv[2].c_str(); const char* sourceDirectory = argv[2].c_str();
const char* projectName = 0; const char* projectName = 0;
const char* targetName = 0; const char* targetName = 0;
char targetNameBuf[64];
int extraArgs = 0; int extraArgs = 0;
// look for CMAKE_FLAGS and store them // look for CMAKE_FLAGS and store them
@ -281,16 +282,20 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv)
cmakeFlags.push_back(flag); cmakeFlags.push_back(flag);
} }
/* Use a random file name to avoid rapid creation and deletion
of the same executable name (some filesystems fail on that). */
sprintf(targetNameBuf, "cmTryCompileExec%u",
cmSystemTools::RandomSeed());
targetName = targetNameBuf;
/* Put the executable at a known location (for COPY_FILE). */ /* Put the executable at a known location (for COPY_FILE). */
fprintf(fout, "SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"%s\")\n", fprintf(fout, "SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"%s\")\n",
this->BinaryDirectory.c_str()); this->BinaryDirectory.c_str());
/* Create the actual executable. */ /* Create the actual executable. */
fprintf(fout, "ADD_EXECUTABLE(cmTryCompileExec \"%s\")\n",source.c_str()); fprintf(fout, "ADD_EXECUTABLE(%s \"%s\")\n", targetName, source.c_str());
fprintf(fout, fprintf(fout, "TARGET_LINK_LIBRARIES(%s ${LINK_LIBRARIES})\n",targetName);
"TARGET_LINK_LIBRARIES(cmTryCompileExec ${LINK_LIBRARIES})\n");
fclose(fout); fclose(fout);
projectName = "CMAKE_TRY_COMPILE"; projectName = "CMAKE_TRY_COMPILE";
targetName = "cmTryCompileExec";
// if the source is not in CMakeTmp // if the source is not in CMakeTmp
if(source.find("CMakeTmp") == source.npos) if(source.find("CMakeTmp") == source.npos)
{ {