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:
parent
16b1a6e4e0
commit
4fbdce2b79
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue