Merge topic 'install-files-dest-genex'
69ab5f55
Tests: Cover install(FILES) with a genex DESTINATION17aa6fd3
install: Allow generator expressions in FILES DESTINATION
This commit is contained in:
commit
cbfae8c3f2
|
@ -192,6 +192,10 @@ The list of ``files...`` given to ``FILES`` or ``PROGRAMS`` may use
|
||||||
However, if any item begins in a generator expression it must evaluate
|
However, if any item begins in a generator expression it must evaluate
|
||||||
to a full path.
|
to a full path.
|
||||||
|
|
||||||
|
The install destination given to the files install ``DESTINATION`` may
|
||||||
|
use "generator expressions" with the syntax ``$<...>``. See the
|
||||||
|
:manual:`cmake-generator-expressions(7)` manual for available expressions.
|
||||||
|
|
||||||
Installing Directories
|
Installing Directories
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
install-files-dest-genex
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
* The :command:`install(FILES)` command ``DESTINATION`` option learned to
|
||||||
|
support :manual:`generator expressions <cmake-generator-expressions(7)>`.
|
|
@ -34,6 +34,12 @@ cmInstallFilesGenerator
|
||||||
Programs(programs),
|
Programs(programs),
|
||||||
Optional(optional)
|
Optional(optional)
|
||||||
{
|
{
|
||||||
|
// We need per-config actions if the destination has generator expressions.
|
||||||
|
if(cmGeneratorExpression::Find(Destination) != std::string::npos)
|
||||||
|
{
|
||||||
|
this->ActionsPerConfig = true;
|
||||||
|
}
|
||||||
|
|
||||||
// We need per-config actions if any files have generator expressions.
|
// We need per-config actions if any files have generator expressions.
|
||||||
for(std::vector<std::string>::const_iterator i = files.begin();
|
for(std::vector<std::string>::const_iterator i = files.begin();
|
||||||
!this->ActionsPerConfig && i != files.end(); ++i)
|
!this->ActionsPerConfig && i != files.end(); ++i)
|
||||||
|
@ -56,15 +62,26 @@ void cmInstallFilesGenerator::Compute(cmLocalGenerator* lg)
|
||||||
this->LocalGenerator = lg;
|
this->LocalGenerator = lg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string
|
||||||
|
cmInstallFilesGenerator::GetDestination(std::string const& config) const
|
||||||
|
{
|
||||||
|
cmGeneratorExpression ge;
|
||||||
|
return ge.Parse(this->Destination)
|
||||||
|
->Evaluate(this->LocalGenerator->GetMakefile(), config);
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmInstallFilesGenerator::AddFilesInstallRule(
|
void cmInstallFilesGenerator::AddFilesInstallRule(
|
||||||
std::ostream& os, Indent const& indent,
|
std::ostream& os,
|
||||||
|
const std::string config,
|
||||||
|
Indent const& indent,
|
||||||
std::vector<std::string> const& files)
|
std::vector<std::string> const& files)
|
||||||
{
|
{
|
||||||
// Write code to install the files.
|
// Write code to install the files.
|
||||||
const char* no_dir_permissions = 0;
|
const char* no_dir_permissions = 0;
|
||||||
this->AddInstallRule(os,
|
this->AddInstallRule(os,
|
||||||
this->Destination,
|
this->GetDestination(config),
|
||||||
(this->Programs
|
(this->Programs
|
||||||
? cmInstallType_PROGRAMS
|
? cmInstallType_PROGRAMS
|
||||||
: cmInstallType_FILES),
|
: cmInstallType_FILES),
|
||||||
|
@ -84,7 +101,7 @@ void cmInstallFilesGenerator::GenerateScriptActions(std::ostream& os,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->AddFilesInstallRule(os, indent, this->Files);
|
this->AddFilesInstallRule(os, "", indent, this->Files);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,5 +119,5 @@ void cmInstallFilesGenerator::GenerateScriptForConfig(std::ostream& os,
|
||||||
cmSystemTools::ExpandListArgument(cge->Evaluate(
|
cmSystemTools::ExpandListArgument(cge->Evaluate(
|
||||||
this->LocalGenerator->GetMakefile(), config), files);
|
this->LocalGenerator->GetMakefile(), config), files);
|
||||||
}
|
}
|
||||||
this->AddFilesInstallRule(os, indent, files);
|
this->AddFilesInstallRule(os, config, indent, files);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,12 +32,16 @@ public:
|
||||||
|
|
||||||
void Compute(cmLocalGenerator* lg);
|
void Compute(cmLocalGenerator* lg);
|
||||||
|
|
||||||
|
std::string GetDestination(std::string const& config) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void GenerateScriptActions(std::ostream& os, Indent const& indent);
|
virtual void GenerateScriptActions(std::ostream& os, Indent const& indent);
|
||||||
virtual void GenerateScriptForConfig(std::ostream& os,
|
virtual void GenerateScriptForConfig(std::ostream& os,
|
||||||
const std::string& config,
|
const std::string& config,
|
||||||
Indent const& indent);
|
Indent const& indent);
|
||||||
void AddFilesInstallRule(std::ostream& os, Indent const& indent,
|
void AddFilesInstallRule(std::ostream& os,
|
||||||
|
const std::string config,
|
||||||
|
Indent const& indent,
|
||||||
std::vector<std::string> const& files);
|
std::vector<std::string> const& files);
|
||||||
|
|
||||||
cmLocalGenerator* LocalGenerator;
|
cmLocalGenerator* LocalGenerator;
|
||||||
|
|
|
@ -29,14 +29,14 @@ add_custom_command(TARGET testLib1 POST_BUILD
|
||||||
$<TARGET_FILE:testLib1>.genex
|
$<TARGET_FILE:testLib1>.genex
|
||||||
)
|
)
|
||||||
install(FILES $<TARGET_FILE:testLib1>.genex
|
install(FILES $<TARGET_FILE:testLib1>.genex
|
||||||
DESTINATION lib
|
DESTINATION $<1:lib>$<0:/wrong>
|
||||||
)
|
)
|
||||||
set_property(TARGET testLib1 PROPERTY MY_FILES
|
set_property(TARGET testLib1 PROPERTY MY_FILES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/testLib1file1.txt
|
${CMAKE_CURRENT_SOURCE_DIR}/testLib1file1.txt
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/testLib1file2.txt
|
${CMAKE_CURRENT_SOURCE_DIR}/testLib1file2.txt
|
||||||
)
|
)
|
||||||
install(FILES $<TARGET_PROPERTY:testLib1,MY_FILES>
|
install(FILES $<TARGET_PROPERTY:testLib1,MY_FILES>
|
||||||
DESTINATION doc
|
DESTINATION $<1:doc>$<0:/wrong>
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test library with empty link interface. Link it to an implementation
|
# Test library with empty link interface. Link it to an implementation
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
|
@ -0,0 +1,6 @@
|
||||||
|
CMake Error:
|
||||||
|
Error evaluating generator expression:
|
||||||
|
|
||||||
|
\$<NOTAGENEX>
|
||||||
|
|
||||||
|
Expression did not evaluate to a known generator expression
|
|
@ -0,0 +1 @@
|
||||||
|
install(FILES empty.c DESTINATION $<NOTAGENEX>)
|
|
@ -6,6 +6,7 @@ run_cmake(DIRECTORY-message-lazy)
|
||||||
run_cmake(SkipInstallRulesWarning)
|
run_cmake(SkipInstallRulesWarning)
|
||||||
run_cmake(SkipInstallRulesNoWarning1)
|
run_cmake(SkipInstallRulesNoWarning1)
|
||||||
run_cmake(SkipInstallRulesNoWarning2)
|
run_cmake(SkipInstallRulesNoWarning2)
|
||||||
|
run_cmake(FILES-DESTINATION-bad)
|
||||||
run_cmake(TARGETS-DESTINATION-bad)
|
run_cmake(TARGETS-DESTINATION-bad)
|
||||||
run_cmake(CMP0062-OLD)
|
run_cmake(CMP0062-OLD)
|
||||||
run_cmake(CMP0062-NEW)
|
run_cmake(CMP0062-NEW)
|
||||||
|
|
|
@ -209,9 +209,9 @@ else()
|
||||||
ARCHIVE DESTINATION MyTest/lib/static
|
ARCHIVE DESTINATION MyTest/lib/static
|
||||||
OPTIONAL # for coverage...target should always exist
|
OPTIONAL # for coverage...target should always exist
|
||||||
)
|
)
|
||||||
install(FILES lib1.h DESTINATION MyTest/include/foo)
|
install(FILES lib1.h DESTINATION MyTest/include/$<1:foo>$<0:/wrong>)
|
||||||
install(FILES lib2.h
|
install(FILES lib2.h
|
||||||
DESTINATION MyTest/include/foo
|
DESTINATION $<1:MyTest/include/foo>$<0:/wrong>
|
||||||
COMPONENT Development
|
COMPONENT Development
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE
|
PERMISSIONS OWNER_READ OWNER_WRITE
|
||||||
RENAME lib2renamed.h
|
RENAME lib2renamed.h
|
||||||
|
|
|
@ -209,9 +209,9 @@ else()
|
||||||
ARCHIVE DESTINATION MyTest/lib/static
|
ARCHIVE DESTINATION MyTest/lib/static
|
||||||
OPTIONAL # for coverage...target should always exist
|
OPTIONAL # for coverage...target should always exist
|
||||||
)
|
)
|
||||||
install(FILES lib1.h DESTINATION MyTest/include/foo)
|
install(FILES lib1.h DESTINATION MyTest/include/$<1:foo>$<0:/wrong>)
|
||||||
install(FILES lib2.h
|
install(FILES lib2.h
|
||||||
DESTINATION MyTest/include/foo
|
DESTINATION $<1:MyTest/include/foo>$<0:/wrong>
|
||||||
COMPONENT Development
|
COMPONENT Development
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE
|
PERMISSIONS OWNER_READ OWNER_WRITE
|
||||||
RENAME lib2renamed.h
|
RENAME lib2renamed.h
|
||||||
|
|
Loading…
Reference in New Issue