Add EXPORT_NAME property.

This allows for example, the buildsystem to use names like 'boost_any'
instead of the overly generic 'any', and still be able to generate
IMPORTED targets called 'boost::any'.
This commit is contained in:
Stephen Kelly 2013-05-17 10:12:02 +02:00
parent edeabd18e6
commit b5d6f5dd5b
14 changed files with 122 additions and 17 deletions

View File

@ -30,7 +30,7 @@ bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
tei = this->Exports->begin(); tei = this->Exports->begin();
tei != this->Exports->end(); ++tei) tei != this->Exports->end(); ++tei)
{ {
expectedTargets += sep + this->Namespace + (*tei)->GetName(); expectedTargets += sep + this->Namespace + (*tei)->GetExportName();
sep = " "; sep = " ";
cmTarget* te = *tei; cmTarget* te = *tei;
if(this->ExportedTargets.insert(te).second) if(this->ExportedTargets.insert(te).second)
@ -189,7 +189,7 @@ cmExportBuildFileGenerator::HandleMissingTarget(
// Assume the target will be exported by another command. // Assume the target will be exported by another command.
// Append it with the export namespace. // Append it with the export namespace.
link_libs += this->Namespace; link_libs += this->Namespace;
link_libs += dependee->GetName(); link_libs += dependee->GetExportName();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -376,7 +376,7 @@ void cmExportFileGenerator::GenerateInterfaceProperties(cmTarget *target,
if (!properties.empty()) if (!properties.empty())
{ {
std::string targetName = this->Namespace; std::string targetName = this->Namespace;
targetName += target->GetName(); targetName += target->GetExportName();
os << "set_target_properties(" << targetName << " PROPERTIES\n"; os << "set_target_properties(" << targetName << " PROPERTIES\n";
for(ImportPropertyMap::const_iterator pi = properties.begin(); for(ImportPropertyMap::const_iterator pi = properties.begin();
pi != properties.end(); ++pi) pi != properties.end(); ++pi)
@ -407,7 +407,7 @@ cmExportFileGenerator::AddTargetNamespace(std::string &input,
} }
if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end()) if(this->ExportedTargets.find(tgt) != this->ExportedTargets.end())
{ {
input = this->Namespace + input; input = this->Namespace + tgt->GetExportName();
} }
else else
{ {
@ -772,7 +772,8 @@ cmExportFileGenerator
{ {
// Construct the imported target name. // Construct the imported target name.
std::string targetName = this->Namespace; std::string targetName = this->Namespace;
targetName += target->GetName();
targetName += target->GetExportName();
// Create the imported target. // Create the imported target.
os << "# Create imported target " << targetName << "\n"; os << "# Create imported target " << targetName << "\n";
@ -835,7 +836,8 @@ cmExportFileGenerator
{ {
// Construct the imported target name. // Construct the imported target name.
std::string targetName = this->Namespace; std::string targetName = this->Namespace;
targetName += target->GetName();
targetName += target->GetExportName();
// Set the import properties. // Set the import properties.
os << "# Import target \"" << targetName << "\" for configuration \"" os << "# Import target \"" << targetName << "\" for configuration \""
@ -954,7 +956,7 @@ cmExportFileGenerator
{ {
// Construct the imported target name. // Construct the imported target name.
std::string targetName = this->Namespace; std::string targetName = this->Namespace;
targetName += target->GetName(); targetName += target->GetExportName();
os << "list(APPEND _IMPORT_CHECK_TARGETS " << targetName << " )\n" os << "list(APPEND _IMPORT_CHECK_TARGETS " << targetName << " )\n"
"list(APPEND _IMPORT_CHECK_FILES_FOR_" << targetName << " "; "list(APPEND _IMPORT_CHECK_FILES_FOR_" << targetName << " ";

View File

@ -47,7 +47,7 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
tei = this->IEGen->GetExportSet()->GetTargetExports()->begin(); tei = this->IEGen->GetExportSet()->GetTargetExports()->begin();
tei != this->IEGen->GetExportSet()->GetTargetExports()->end(); ++tei) tei != this->IEGen->GetExportSet()->GetTargetExports()->end(); ++tei)
{ {
expectedTargets += sep + this->Namespace + (*tei)->Target->GetName(); expectedTargets += sep + this->Namespace + (*tei)->Target->GetExportName();
sep = " "; sep = " ";
cmTargetExport const* te = *tei; cmTargetExport const* te = *tei;
if(this->ExportedTargets.insert(te->Target).second) if(this->ExportedTargets.insert(te->Target).second)
@ -395,13 +395,14 @@ cmExportInstallFileGenerator::HandleMissingTarget(
std::string& link_libs, std::vector<std::string>& missingTargets, std::string& link_libs, std::vector<std::string>& missingTargets,
cmMakefile* mf, cmTarget* depender, cmTarget* dependee) cmMakefile* mf, cmTarget* depender, cmTarget* dependee)
{ {
std::string name = dependee->GetName(); const std::string name = dependee->GetName();
std::vector<std::string> namespaces = this->FindNamespaces(mf, name); std::vector<std::string> namespaces = this->FindNamespaces(mf, name);
int targetOccurrences = (int)namespaces.size(); int targetOccurrences = (int)namespaces.size();
if (targetOccurrences == 1) if (targetOccurrences == 1)
{ {
std::string missingTarget = namespaces[0]; std::string missingTarget = namespaces[0];
missingTarget += name;
missingTarget += dependee->GetExportName();
link_libs += missingTarget; link_libs += missingTarget;
missingTargets.push_back(missingTarget); missingTargets.push_back(missingTarget);
} }

View File

@ -866,6 +866,13 @@ void cmTarget::DefineProperties(cmake *cm)
"This property is the configuration-specific version of " "This property is the configuration-specific version of "
"OSX_ARCHITECTURES."); "OSX_ARCHITECTURES.");
cm->DefineProperty
("EXPORT_NAME", cmProperty::TARGET,
"Exported name for target files.",
"This sets the name for the IMPORTED target generated when it this "
"target is is exported. "
"If not set, the logical target name is used by default.");
cm->DefineProperty cm->DefineProperty
("OUTPUT_NAME", cmProperty::TARGET, ("OUTPUT_NAME", cmProperty::TARGET,
"Output name for target files.", "Output name for target files.",
@ -2719,6 +2726,14 @@ void cmTarget::SetProperty(const char* prop, const char* value)
new cmTargetInternals::IncludeDirectoriesEntry(cge)); new cmTargetInternals::IncludeDirectoriesEntry(cge));
return; return;
} }
if(strcmp(prop,"EXPORT_NAME") == 0 && this->IsImported())
{
cmOStringStream e;
e << "EXPORT_NAME property can't be set on imported targets (\""
<< this->Name << "\")\n";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
return;
}
if (strcmp(prop, "LINK_LIBRARIES") == 0) if (strcmp(prop, "LINK_LIBRARIES") == 0)
{ {
this->Internal->LinkInterfaceIncludeDirectoriesEntries.clear(); this->Internal->LinkInterfaceIncludeDirectoriesEntries.clear();
@ -2753,6 +2768,14 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value))); new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value)));
return; return;
} }
if(strcmp(prop,"EXPORT_NAME") == 0 && this->IsImported())
{
cmOStringStream e;
e << "EXPORT_NAME property can't be set on imported targets (\""
<< this->Name << "\")\n";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
return;
}
if (strcmp(prop, "LINK_LIBRARIES") == 0) if (strcmp(prop, "LINK_LIBRARIES") == 0)
{ {
if (cmGeneratorExpression::IsValidTargetName(value) if (cmGeneratorExpression::IsValidTargetName(value)
@ -2769,6 +2792,26 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
this->MaybeInvalidatePropertyCache(prop); this->MaybeInvalidatePropertyCache(prop);
} }
//----------------------------------------------------------------------------
const char* cmTarget::GetExportName()
{
const char *exportName = this->GetProperty("EXPORT_NAME");
if (exportName && *exportName)
{
if (!cmGeneratorExpression::IsValidTargetName(exportName))
{
cmOStringStream e;
e << "EXPORT_NAME property \"" << exportName << "\" for \""
<< this->GetName() << "\": is not valid.";
cmSystemTools::Error(e.str().c_str());
return "";
}
return exportName;
}
return this->GetName();
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmTarget::AppendBuildInterfaceIncludes() void cmTarget::AppendBuildInterfaceIncludes()
{ {

View File

@ -85,6 +85,7 @@ public:
///! Set/Get the name of the target ///! Set/Get the name of the target
const char* GetName() const {return this->Name.c_str();} const char* GetName() const {return this->Name.c_str();}
const char* GetExportName();
///! Set the cmMakefile that owns this target ///! Set the cmMakefile that owns this target
void SetMakefile(cmMakefile *mf); void SetMakefile(cmMakefile *mf);

View File

@ -165,6 +165,8 @@ set_property(TARGET testLibRequired APPEND PROPERTY
include(GenerateExportHeader) include(GenerateExportHeader)
add_subdirectory(renamed)
add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp) add_library(testSharedLibRequired SHARED testSharedLibRequired.cpp)
generate_export_header(testSharedLibRequired) generate_export_header(testSharedLibRequired)
set_property(TARGET testSharedLibRequired set_property(TARGET testSharedLibRequired
@ -219,13 +221,12 @@ set_property(TARGET testSharedLibDepends APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibDepends>" INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibDepends>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
) )
set_property(TARGET testSharedLibDepends APPEND PROPERTY
LINK_INTERFACE_LIBRARIES
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>
)
# LINK_PRIVATE because the LINK_INTERFACE_LIBRARIES is specified above. # LINK_PRIVATE because the LINK_INTERFACE_LIBRARIES is specified above.
target_link_libraries(testSharedLibDepends LINK_PRIVATE testSharedLibRequired) target_link_libraries(testSharedLibDepends LINK_PRIVATE testSharedLibRequired)
target_link_libraries(testSharedLibDepends LINK_PUBLIC renamed_on_export)
target_link_libraries(testSharedLibDepends LINK_INTERFACE_LIBRARIES
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>)
install(TARGETS testLibRequired install(TARGETS testLibRequired
testLibIncludeRequired1 testLibIncludeRequired1
@ -310,7 +311,7 @@ add_subdirectory(sublib) # For CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE test.
# Export from build tree. # Export from build tree.
export(TARGETS testExe1 testLib1 testLib2 testLib3 export(TARGETS testExe1 testLib1 testLib2 testLib3
testExe2libImp testLib3Imp testLib3ImpDep subdirlib testExe2libImp testLib3Imp testLib3ImpDep subdirlib
testSharedLibRequired testSharedLibDepends testSharedLibRequired testSharedLibDepends renamed_on_export
NAMESPACE bld_ NAMESPACE bld_
FILE ExportBuildTree.cmake FILE ExportBuildTree.cmake
) )

View File

@ -0,0 +1,20 @@
add_library(renamed_on_export SHARED renamed.cxx)
generate_export_header(renamed_on_export)
target_include_directories(renamed_on_export
PUBLIC "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/renamed>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
)
set_property(TARGET renamed_on_export
PROPERTY
EXPORT_NAME renamed
)
install(FILES
"${CMAKE_CURRENT_SOURCE_DIR}/renamed.h"
"${CMAKE_CURRENT_BINARY_DIR}/renamed_on_export_export.h"
DESTINATION include/renamed
)
install(TARGETS renamed_on_export
EXPORT exp DESTINATION lib )

View File

@ -0,0 +1,7 @@
#include "renamed.h"
int Renamed::foo()
{
return 0;
}

View File

@ -0,0 +1,12 @@
#ifndef RENAMED_H
#define RENAMED_H
#include "renamed_on_export_export.h"
struct RENAMED_ON_EXPORT_EXPORT Renamed
{
int foo();
};
#endif

View File

@ -4,5 +4,6 @@
int TestSharedLibDepends::foo() int TestSharedLibDepends::foo()
{ {
TestSharedLibRequired req; TestSharedLibRequired req;
return req.foo(); Renamed renamed;
return req.foo() + renamed.foo();
} }

View File

@ -5,6 +5,7 @@
#include "testsharedlibdepends_export.h" #include "testsharedlibdepends_export.h"
#include "testSharedLibRequired.h" #include "testSharedLibRequired.h"
#include "renamed.h"
struct TESTSHAREDLIBDEPENDS_EXPORT TestSharedLibDepends struct TESTSHAREDLIBDEPENDS_EXPORT TestSharedLibDepends
{ {

View File

@ -183,6 +183,12 @@ else()
endif() endif()
endif() endif()
add_executable(exp_renamed_test renamed_test.cpp)
target_link_libraries(exp_renamed_test exp_renamed)
add_executable(bld_renamed_test renamed_test.cpp)
target_link_libraries(bld_renamed_test bld_renamed)
if (run_pic_test) if (run_pic_test)
target_compile_definitions(deps_shared_iface PRIVATE CHECK_PIC_WORKS) target_compile_definitions(deps_shared_iface PRIVATE CHECK_PIC_WORKS)
endif() endif()

View File

@ -22,6 +22,7 @@
#ifdef TEST_SUBDIR_LIB #ifdef TEST_SUBDIR_LIB
#include "subdir.h" #include "subdir.h"
#include "renamed.h"
#endif #endif
int main(int,char **) int main(int,char **)
@ -31,11 +32,12 @@ int main(int,char **)
#ifdef TEST_SUBDIR_LIB #ifdef TEST_SUBDIR_LIB
SubDirObject sdo; SubDirObject sdo;
Renamed ren;
#endif #endif
return dep.foo() + req.foo() return dep.foo() + req.foo()
#ifdef TEST_SUBDIR_LIB #ifdef TEST_SUBDIR_LIB
+ sdo.foo() + sdo.foo() + ren.foo()
#endif #endif
; ;
} }

View File

@ -0,0 +1,8 @@
#include "renamed.h"
int main(int, char **)
{
Renamed ren;
return ren.foo();
}