file(GENERATE): Use permissions of input file if present.

This commit is contained in:
Stephen Kelly 2014-07-22 15:10:57 +02:00
parent db3cfc3376
commit 81afbbc09b
7 changed files with 37 additions and 3 deletions

View File

@ -36,7 +36,7 @@ cmGeneratorExpressionEvaluationFile::cmGeneratorExpressionEvaluationFile(
//----------------------------------------------------------------------------
void cmGeneratorExpressionEvaluationFile::Generate(const std::string& config,
cmCompiledGeneratorExpression* inputExpression,
std::map<std::string, std::string> &outputFiles)
std::map<std::string, std::string> &outputFiles, mode_t perm)
{
std::string rawCondition = this->Condition->GetInput();
if (!rawCondition.empty())
@ -83,11 +83,16 @@ void cmGeneratorExpressionEvaluationFile::Generate(const std::string& config,
cmGeneratedFileStream fout(outputFileName.c_str());
fout.SetCopyIfDifferent(true);
fout << outputContent;
if (fout.Close() && perm)
{
cmSystemTools::SetPermissions(outputFileName.c_str(), perm);
}
}
//----------------------------------------------------------------------------
void cmGeneratorExpressionEvaluationFile::Generate()
{
mode_t perm = 0;
std::string inputContent;
if (this->InputIsContent)
{
@ -95,6 +100,7 @@ void cmGeneratorExpressionEvaluationFile::Generate()
}
else
{
cmSystemTools::GetPermissions(this->Input.c_str(), perm);
cmsys::ifstream fin(this->Input.c_str());
if(!fin)
{
@ -131,7 +137,7 @@ void cmGeneratorExpressionEvaluationFile::Generate()
for(std::vector<std::string>::const_iterator li = allConfigs.begin();
li != allConfigs.end(); ++li)
{
this->Generate(*li, inputExpression.get(), outputFiles);
this->Generate(*li, inputExpression.get(), outputFiles, perm);
if(cmSystemTools::GetFatalErrorOccured())
{
return;

View File

@ -34,7 +34,7 @@ public:
private:
void Generate(const std::string& config,
cmCompiledGeneratorExpression* inputExpression,
std::map<std::string, std::string> &outputFiles);
std::map<std::string, std::string> &outputFiles, mode_t perm);
private:
const std::string Input;

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
^$

View File

@ -0,0 +1,5 @@
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/output_script.sh"
INPUT "${CMAKE_CURRENT_SOURCE_DIR}/input_script.sh"
)

View File

@ -35,3 +35,21 @@ unset(RunCMake_TEST_NO_CLEAN)
if (NOT timestamp_after STREQUAL timestamp)
message(SEND_ERROR "WriteIfDifferent changed output file.")
endif()
if (UNIX AND EXISTS /bin/sh)
set(RunCMake_TEST_NO_CLEAN ON)
run_cmake(CarryPermissions)
execute_process(
COMMAND "${RunCMake_BINARY_DIR}/CarryPermissions-build/output_script.sh"
OUTPUT_VARIABLE script_output
RESULT_VARIABLE script_result
ERROR_VARIABLE script_error
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (script_result)
message(SEND_ERROR "Generated script did not execute correctly: [${script_result}]\n${script_output}\n====\n${script_error}")
endif()
if (NOT script_output STREQUAL SUCCESS)
message(SEND_ERROR "Generated script did not execute correctly:\n${script_output}\n====\n${script_error}")
endif()
endif()

View File

@ -0,0 +1,3 @@
#!/bin/sh
echo "$<$<STREQUAL:foo,foo>:SUCCESS>"