Merge topic 'export-EXPORT-subcommand'
98b9f52
Help: Document export(EXPORT) in the cmake-packages manual.a1d2bda
Don't copy find_dependency in configure_package_config_file.f4f6529
Help: cmake-packages: Add missing slash.cbe7e8f
export: Implement EXPORT subcommand (#9822)
This commit is contained in:
commit
6cff2afc8b
|
@ -5,8 +5,7 @@ Export targets from the build tree for use by outside projects.
|
|||
|
||||
::
|
||||
|
||||
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
|
||||
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])
|
||||
export(EXPORT <export-name> [NAMESPACE <namespace>] [FILE <filename>])
|
||||
|
||||
Create a file <filename> that may be included by outside projects to
|
||||
import targets from the current project's build tree. This is useful
|
||||
|
@ -14,14 +13,10 @@ during cross-compiling to build utility executables that can run on
|
|||
the host platform in one project and then import them into another
|
||||
project being compiled for the target platform. If the NAMESPACE
|
||||
option is given the <namespace> string will be prepended to all target
|
||||
names written to the file. If the APPEND option is given the
|
||||
generated code will be appended to the file instead of overwriting it.
|
||||
The EXPORT_LINK_INTERFACE_LIBRARIES keyword, if present, causes the
|
||||
contents of the properties matching
|
||||
``(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?`` to be exported, when
|
||||
policy CMP0022 is NEW. If a library target is included in the export
|
||||
but a target to which it links is not included the behavior is
|
||||
unspecified.
|
||||
names written to the file.
|
||||
|
||||
Target installations are associated with the export <export-name>
|
||||
using the ``EXPORT`` option of the :command:`install(TARGETS)` command.
|
||||
|
||||
The file created by this command is specific to the build tree and
|
||||
should never be installed. See the install(EXPORT) command to export
|
||||
|
@ -30,6 +25,21 @@ targets from an installation tree.
|
|||
The properties set on the generated IMPORTED targets will have the
|
||||
same values as the final values of the input TARGETS.
|
||||
|
||||
::
|
||||
|
||||
export(TARGETS [target1 [target2 [...]]] [NAMESPACE <namespace>]
|
||||
[APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])
|
||||
|
||||
This signature is similar to the ``EXPORT`` signature, but targets are listed
|
||||
explicitly rather than specified as an export-name. If the APPEND option is
|
||||
given the generated code will be appended to the file instead of overwriting it.
|
||||
The EXPORT_LINK_INTERFACE_LIBRARIES keyword, if present, causes the
|
||||
contents of the properties matching
|
||||
``(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)?`` to be exported, when
|
||||
policy CMP0022 is NEW. If a library target is included in the export
|
||||
but a target to which it links is not included the behavior is
|
||||
unspecified.
|
||||
|
||||
::
|
||||
|
||||
export(PACKAGE <name>)
|
||||
|
|
|
@ -266,6 +266,7 @@ shared library:
|
|||
project(UpstreamLib)
|
||||
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
|
||||
|
||||
set(Upstream_VERSION 3.4.1)
|
||||
|
||||
|
@ -292,11 +293,20 @@ shared library:
|
|||
|
||||
include(CMakePackageConfigHelpers)
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/ClimbingStatsConfigVersion.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
|
||||
VERSION ${Upstream_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion
|
||||
)
|
||||
|
||||
export(EXPORT ClimbingStatsTargets
|
||||
FILE "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsTargets.cmake"
|
||||
NAMESPACE Upstream::
|
||||
)
|
||||
configure_file(cmake/ClimbingStatsConfig.cmake
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfig.cmake"
|
||||
COPY_ONLY
|
||||
)
|
||||
|
||||
set(ConfigPackageLocation lib/cmake/ClimbingStats)
|
||||
install(EXPORT ClimbingStatsTargets
|
||||
FILE
|
||||
|
@ -309,7 +319,7 @@ shared library:
|
|||
install(
|
||||
FILES
|
||||
cmake/ClimbingStatsConfig.cmake
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/ClimbingStatsConfigVersion.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
|
||||
DESTINATION
|
||||
${ConfigPackageLocation}
|
||||
COMPONENT
|
||||
|
@ -354,6 +364,14 @@ should be provided by the ``ClimbingStats`` package, they should
|
|||
be in a separate file which is installed to the same location as the
|
||||
``ClimbingStatsConfig.cmake`` file, and included from there.
|
||||
|
||||
The :command:`export(EXPORT)` command creates an :prop_tgt:`IMPORTED` targets
|
||||
definition file which is specific to the build-tree. This can similiarly be
|
||||
used with a suitable package configuration file and package version file to
|
||||
define a package for the build tree which may be used without installation.
|
||||
Consumers of the build tree can simply ensure that the
|
||||
:variable:`CMAKE_PREFIX_PATH` contains the build directory, or set the
|
||||
``ClimbingStats_DIR`` to ``<build_dir>/ClimbingStats`` in the cache.
|
||||
|
||||
This can also be extended to cover dependencies:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
@ -375,7 +393,7 @@ dependencies of a package should be found in the ``Config.cmake`` file:
|
|||
|
||||
.. code-block:: cmake
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(CMakeFindDependencyMacro)
|
||||
find_dependency(Stats 2.6.4)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
|
||||
|
@ -392,7 +410,7 @@ be true. This can be tested with logic in the package configuration file:
|
|||
|
||||
.. code-block:: cmake
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(CMakeFindDependencyMacro)
|
||||
find_dependency(Stats 2.6.4)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
|
||||
|
@ -405,7 +423,7 @@ be true. This can be tested with logic in the package configuration file:
|
|||
set(ClimbingStats_FOUND False)
|
||||
set(ClimbingStats_NOTFOUND_MESSAGE "Specified unsupported component: ${_comp}")
|
||||
endif()
|
||||
include("${CMAKE_CURRENT_LIST_DIR}ClimbingStats${_comp}Targets.cmake")
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStats${_comp}Targets.cmake")
|
||||
endforeach()
|
||||
|
||||
Here, the ``ClimbingStats_NOTFOUND_MESSAGE`` is set to a diagnosis that the package
|
||||
|
|
|
@ -11,8 +11,7 @@
|
|||
# CONFIGURE_PACKAGE_CONFIG_FILE(<input> <output> INSTALL_DESTINATION <path>
|
||||
# [PATH_VARS <var1> <var2> ... <varN>]
|
||||
# [NO_SET_AND_CHECK_MACRO]
|
||||
# [NO_CHECK_REQUIRED_COMPONENTS_MACRO]
|
||||
# [NO_FIND_DEPENDENCY_MACRO])
|
||||
# [NO_CHECK_REQUIRED_COMPONENTS_MACRO])
|
||||
#
|
||||
#
|
||||
#
|
||||
|
@ -196,7 +195,6 @@
|
|||
include(CMakeParseArguments)
|
||||
|
||||
include(WriteBasicConfigVersionFile)
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
macro(WRITE_BASIC_PACKAGE_VERSION_FILE)
|
||||
write_basic_config_version_file(${ARGN})
|
||||
|
@ -205,7 +203,7 @@ endmacro()
|
|||
set(cfpch_dir ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
function(CONFIGURE_PACKAGE_CONFIG_FILE _inputFile _outputFile)
|
||||
set(options NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO NO_FIND_DEPENDENCY_MACRO)
|
||||
set(options NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
||||
set(oneValueArgs INSTALL_DESTINATION )
|
||||
set(multiValueArgs PATH_VARS )
|
||||
|
||||
|
@ -291,11 +289,6 @@ endmacro()
|
|||
")
|
||||
endif()
|
||||
|
||||
if(NOT CCF_NO_FIND_DEPENDENCY_MACRO)
|
||||
file(READ "${cfpch_dir}/CMakeFindDependencyMacro.cmake" find_dependency_macro)
|
||||
set(PACKAGE_INIT "${PACKAGE_INIT} ${find_dependency_macro}")
|
||||
endif()
|
||||
|
||||
set(PACKAGE_INIT "${PACKAGE_INIT}
|
||||
####################################################################################")
|
||||
|
||||
|
|
|
@ -13,11 +13,14 @@
|
|||
|
||||
#include "cmLocalGenerator.h"
|
||||
#include "cmGlobalGenerator.h"
|
||||
#include "cmExportSet.h"
|
||||
#include "cmTargetExport.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmExportBuildFileGenerator::cmExportBuildFileGenerator()
|
||||
{
|
||||
this->Makefile = 0;
|
||||
this->ExportSet = 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -26,9 +29,11 @@ bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
|
|||
{
|
||||
std::string expectedTargets;
|
||||
std::string sep;
|
||||
std::vector<std::string> targets;
|
||||
this->GetTargets(targets);
|
||||
for(std::vector<std::string>::const_iterator
|
||||
tei = this->Targets.begin();
|
||||
tei != this->Targets.end(); ++tei)
|
||||
tei = targets.begin();
|
||||
tei != targets.end(); ++tei)
|
||||
{
|
||||
cmTarget *te = this->Makefile->FindTargetToUse(tei->c_str());
|
||||
expectedTargets += sep + this->Namespace + te->GetExportName();
|
||||
|
@ -152,6 +157,12 @@ cmExportBuildFileGenerator
|
|||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmExportBuildFileGenerator::SetExportSet(cmExportSet *exportSet)
|
||||
{
|
||||
this->ExportSet = exportSet;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmExportBuildFileGenerator
|
||||
|
@ -231,6 +242,23 @@ cmExportBuildFileGenerator::HandleMissingTarget(
|
|||
link_libs += dependee->GetExportName();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmExportBuildFileGenerator
|
||||
::GetTargets(std::vector<std::string> &targets) const
|
||||
{
|
||||
if (this->ExportSet)
|
||||
{
|
||||
for(std::vector<cmTargetExport*>::const_iterator
|
||||
tei = this->ExportSet->GetTargetExports()->begin();
|
||||
tei != this->ExportSet->GetTargetExports()->end(); ++tei)
|
||||
{
|
||||
targets.push_back((*tei)->Target->GetName());
|
||||
}
|
||||
return;
|
||||
}
|
||||
targets = this->Targets;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::vector<std::string>
|
||||
cmExportBuildFileGenerator
|
||||
|
@ -246,8 +274,8 @@ cmExportBuildFileGenerator
|
|||
expIt = exportSets.begin(); expIt != exportSets.end(); ++expIt)
|
||||
{
|
||||
const cmExportBuildFileGenerator* exportSet = expIt->second;
|
||||
std::vector<std::string> const& targets = exportSet->GetTargets();
|
||||
|
||||
std::vector<std::string> targets;
|
||||
exportSet->GetTargets(targets);
|
||||
if (std::find(targets.begin(), targets.end(), name) != targets.end())
|
||||
{
|
||||
namespaces.push_back(exportSet->GetNamespace());
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#include "cmExportFileGenerator.h"
|
||||
#include "cmListFileCache.h"
|
||||
|
||||
class cmExportSet;
|
||||
|
||||
/** \class cmExportBuildFileGenerator
|
||||
* \brief Generate a file exporting targets from a build tree.
|
||||
*
|
||||
|
@ -32,11 +34,11 @@ public:
|
|||
/** Set the list of targets to export. */
|
||||
void SetTargets(std::vector<std::string> const& targets)
|
||||
{ this->Targets = targets; }
|
||||
std::vector<std::string> const& GetTargets() const
|
||||
{ return this->Targets; }
|
||||
void GetTargets(std::vector<std::string> &targets) const;
|
||||
void AppendTargets(std::vector<std::string> const& targets)
|
||||
{ this->Targets.insert(this->Targets.end(),
|
||||
targets.begin(), targets.end()); }
|
||||
void SetExportSet(cmExportSet*);
|
||||
|
||||
/** Set whether to append generated code to the output file. */
|
||||
void SetAppendMode(bool append) { this->AppendMode = append; }
|
||||
|
@ -75,6 +77,7 @@ protected:
|
|||
FindNamespaces(cmMakefile* mf, const std::string& name);
|
||||
|
||||
std::vector<std::string> Targets;
|
||||
cmExportSet *ExportSet;
|
||||
std::vector<cmTarget*> Exports;
|
||||
cmMakefile* Makefile;
|
||||
cmListFileBacktrace Backtrace;
|
||||
|
|
|
@ -30,14 +30,12 @@ cmExportCommand::cmExportCommand()
|
|||
,ArgumentGroup()
|
||||
,Targets(&Helper, "TARGETS")
|
||||
,Append(&Helper, "APPEND", &ArgumentGroup)
|
||||
,ExportSetName(&Helper, "EXPORT", &ArgumentGroup)
|
||||
,Namespace(&Helper, "NAMESPACE", &ArgumentGroup)
|
||||
,Filename(&Helper, "FILE", &ArgumentGroup)
|
||||
,ExportOld(&Helper, "EXPORT_LINK_INTERFACE_LIBRARIES", &ArgumentGroup)
|
||||
{
|
||||
// at first TARGETS
|
||||
this->Targets.Follows(0);
|
||||
// and after that the other options in any order
|
||||
this->ArgumentGroup.Follows(&this->Targets);
|
||||
this->ExportSet = 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,6 +53,16 @@ bool cmExportCommand
|
|||
{
|
||||
return this->HandlePackage(args);
|
||||
}
|
||||
else if (args[0] == "EXPORT")
|
||||
{
|
||||
this->ExportSetName.Follows(0);
|
||||
this->ArgumentGroup.Follows(&this->ExportSetName);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->Targets.Follows(0);
|
||||
this->ArgumentGroup.Follows(&this->Targets);
|
||||
}
|
||||
|
||||
std::vector<std::string> unknownArgs;
|
||||
this->Helper.Parse(&args, &unknownArgs);
|
||||
|
@ -65,31 +73,32 @@ bool cmExportCommand
|
|||
return false;
|
||||
}
|
||||
|
||||
if (this->Targets.WasFound() == false)
|
||||
{
|
||||
this->SetError("TARGETS option missing.");
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string fname;
|
||||
if(!this->Filename.WasFound())
|
||||
{
|
||||
this->SetError("FILE <filename> option missing.");
|
||||
return false;
|
||||
if (args[0] != "EXPORT")
|
||||
{
|
||||
this->SetError("FILE <filename> option missing.");
|
||||
return false;
|
||||
}
|
||||
fname = this->ExportSetName.GetString() + ".cmake";
|
||||
}
|
||||
|
||||
// Make sure the file has a .cmake extension.
|
||||
if(cmSystemTools::GetFilenameLastExtension(this->Filename.GetCString())
|
||||
!= ".cmake")
|
||||
else
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "FILE option given filename \"" << this->Filename.GetString()
|
||||
<< "\" which does not have an extension of \".cmake\".\n";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
// Make sure the file has a .cmake extension.
|
||||
if(cmSystemTools::GetFilenameLastExtension(this->Filename.GetCString())
|
||||
!= ".cmake")
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "FILE option given filename \"" << this->Filename.GetString()
|
||||
<< "\" which does not have an extension of \".cmake\".\n";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
fname = this->Filename.GetString();
|
||||
}
|
||||
|
||||
// Get the file to write.
|
||||
std::string fname = this->Filename.GetString();
|
||||
if(cmSystemTools::FileIsFullPath(fname.c_str()))
|
||||
{
|
||||
if(!this->Makefile->CanIWriteThisFile(fname.c_str()))
|
||||
|
@ -104,57 +113,95 @@ bool cmExportCommand
|
|||
else
|
||||
{
|
||||
// Interpret relative paths with respect to the current build dir.
|
||||
fname = this->Makefile->GetCurrentOutputDirectory();
|
||||
fname += "/";
|
||||
fname += this->Filename.GetString();
|
||||
std::string dir = this->Makefile->GetCurrentOutputDirectory();
|
||||
fname = dir + "/" + fname;
|
||||
}
|
||||
|
||||
for(std::vector<std::string>::const_iterator
|
||||
currentTarget = this->Targets.GetVector().begin();
|
||||
currentTarget != this->Targets.GetVector().end();
|
||||
++currentTarget)
|
||||
std::vector<std::string> targets;
|
||||
|
||||
cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator()
|
||||
->GetGlobalGenerator();
|
||||
|
||||
if(args[0] == "EXPORT")
|
||||
{
|
||||
if (this->Makefile->IsAlias(currentTarget->c_str()))
|
||||
if (this->Append.IsEnabled())
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "given ALIAS target \"" << *currentTarget
|
||||
<< "\" which may not be exported.";
|
||||
e << "EXPORT signature does not recognise the APPEND option.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if(cmTarget* target =
|
||||
this->Makefile->GetLocalGenerator()->
|
||||
GetGlobalGenerator()->FindTarget(0, currentTarget->c_str()))
|
||||
if (this->ExportOld.IsEnabled())
|
||||
{
|
||||
if(target->GetType() == cmTarget::OBJECT_LIBRARY)
|
||||
cmOStringStream e;
|
||||
e << "EXPORT signature does not recognise the "
|
||||
"EXPORT_LINK_INTERFACE_LIBRARIES option.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
cmExportSetMap &setMap = gg->GetExportSets();
|
||||
std::string setName = this->ExportSetName.GetString();
|
||||
if (setMap.find(setName) == setMap.end())
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "Export set \"" << setName << "\" not found.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
this->ExportSet = setMap[setName];
|
||||
}
|
||||
else if (this->Targets.WasFound())
|
||||
{
|
||||
for(std::vector<std::string>::const_iterator
|
||||
currentTarget = this->Targets.GetVector().begin();
|
||||
currentTarget != this->Targets.GetVector().end();
|
||||
++currentTarget)
|
||||
{
|
||||
if (this->Makefile->IsAlias(currentTarget->c_str()))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "given OBJECT library \"" << *currentTarget
|
||||
e << "given ALIAS target \"" << *currentTarget
|
||||
<< "\" which may not be exported.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if(cmTarget* target = gg->FindTarget(0, currentTarget->c_str()))
|
||||
{
|
||||
if(target->GetType() == cmTarget::OBJECT_LIBRARY)
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "given OBJECT library \"" << *currentTarget
|
||||
<< "\" which may not be exported.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "given target \"" << *currentTarget
|
||||
<< "\" which is not built by this project.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
}
|
||||
targets.push_back(*currentTarget);
|
||||
}
|
||||
else
|
||||
if (this->Append.IsEnabled())
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "given target \"" << *currentTarget
|
||||
<< "\" which is not built by this project.";
|
||||
this->SetError(e.str().c_str());
|
||||
return false;
|
||||
if (cmExportBuildFileGenerator *ebfg = gg->GetExportedTargetsFile(fname))
|
||||
{
|
||||
ebfg->AppendTargets(targets);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator()
|
||||
->GetGlobalGenerator();
|
||||
if (this->Append.IsEnabled())
|
||||
else
|
||||
{
|
||||
if (cmExportBuildFileGenerator *ebfg = gg->GetExportedTargetsFile(fname))
|
||||
{
|
||||
ebfg->AppendTargets(this->Targets.GetVector());
|
||||
return true;
|
||||
}
|
||||
this->SetError("EXPORT or TARGETS specifier missing.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Setup export file generation.
|
||||
|
@ -162,7 +209,14 @@ bool cmExportCommand
|
|||
ebfg->SetExportFile(fname.c_str());
|
||||
ebfg->SetNamespace(this->Namespace.GetCString());
|
||||
ebfg->SetAppendMode(this->Append.IsEnabled());
|
||||
ebfg->SetTargets(this->Targets.GetVector());
|
||||
if (this->ExportSet)
|
||||
{
|
||||
ebfg->SetExportSet(this->ExportSet);
|
||||
}
|
||||
else
|
||||
{
|
||||
ebfg->SetTargets(targets);
|
||||
}
|
||||
ebfg->SetMakefile(this->Makefile);
|
||||
ebfg->SetExportOld(this->ExportOld.IsEnabled());
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "cmCommand.h"
|
||||
|
||||
class cmExportBuildFileGenerator;
|
||||
class cmExportSet;
|
||||
|
||||
/** \class cmExportLibraryDependenciesCommand
|
||||
* \brief Add a test to the lists of tests to run.
|
||||
|
@ -52,10 +53,13 @@ private:
|
|||
cmCommandArgumentGroup ArgumentGroup;
|
||||
cmCAStringVector Targets;
|
||||
cmCAEnabler Append;
|
||||
cmCAString ExportSetName;
|
||||
cmCAString Namespace;
|
||||
cmCAString Filename;
|
||||
cmCAEnabler ExportOld;
|
||||
|
||||
cmExportSet *ExportSet;
|
||||
|
||||
friend class cmExportBuildFileGenerator;
|
||||
std::string ErrorMessage;
|
||||
|
||||
|
|
|
@ -23,11 +23,6 @@ set_property(TARGET sharedlib PROPERTY INTERFACE_COMPILE_DEFINITIONS "SHAREDLIB_
|
|||
add_library(sharediface INTERFACE)
|
||||
target_link_libraries(sharediface INTERFACE sharedlib)
|
||||
|
||||
export(TARGETS sharediface sharedlib headeronly
|
||||
NAMESPACE bld::
|
||||
FILE ../ExportInterfaceBuildTree.cmake
|
||||
)
|
||||
|
||||
install(TARGETS headeronly sharediface sharedlib
|
||||
EXPORT expInterface
|
||||
RUNTIME DESTINATION bin
|
||||
|
@ -47,3 +42,8 @@ install(FILES
|
|||
)
|
||||
|
||||
install(EXPORT expInterface NAMESPACE exp:: DESTINATION lib/exp)
|
||||
|
||||
export(EXPORT expInterface
|
||||
NAMESPACE bld::
|
||||
FILE ../ExportInterfaceBuildTree.cmake
|
||||
)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,4 @@
|
|||
CMake Error at AppendExport.cmake:8 \(export\):
|
||||
export EXPORT signature does not recognise the APPEND option.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,8 @@
|
|||
add_library(foo empty.cpp)
|
||||
export(TARGETS foo FILE "${CMAKE_CURRENT_BINARY_DIR}/foo.cmake")
|
||||
install(TARGETS foo EXPORT fooExport
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib
|
||||
)
|
||||
export(EXPORT fooExport APPEND FILE "${CMAKE_CURRENT_BINARY_DIR}/foo.cmake")
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,4 @@
|
|||
CMake Error at NoExportSet.cmake:2 \(export\):
|
||||
export Export set "fooExport" not found.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
export(EXPORT fooExport)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,5 @@
|
|||
CMake Error at OldIface.cmake:8 \(export\):
|
||||
export EXPORT signature does not recognise the
|
||||
EXPORT_LINK_INTERFACE_LIBRARIES option.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,10 @@
|
|||
add_library(foo empty.cpp)
|
||||
export(TARGETS foo FILE "${CMAKE_CURRENT_BINARY_DIR}/foo.cmake")
|
||||
install(TARGETS foo EXPORT fooExport
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib
|
||||
)
|
||||
export(EXPORT fooExport
|
||||
EXPORT_LINK_INTERFACE_LIBRARIES
|
||||
)
|
|
@ -1,3 +1,6 @@
|
|||
include(RunCMake)
|
||||
|
||||
run_cmake(TargetNotFound)
|
||||
run_cmake(AppendExport)
|
||||
run_cmake(OldIface)
|
||||
run_cmake(NoExportSet)
|
||||
|
|
Loading…
Reference in New Issue