mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-16 05:26:58 +08:00
VS: support suppressing deployment of selected targets
Add a `VS_NO_SOLUTION_DEPLOY` target property to explicitly specify for each target whether to suppress VS solution deployment of the generated target project. Fixes: #18953
This commit is contained in:
@@ -334,6 +334,7 @@ Properties on Targets
|
|||||||
/prop_tgt/VS_IOT_STARTUP_TASK
|
/prop_tgt/VS_IOT_STARTUP_TASK
|
||||||
/prop_tgt/VS_KEYWORD
|
/prop_tgt/VS_KEYWORD
|
||||||
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
|
/prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
|
||||||
|
/prop_tgt/VS_NO_SOLUTION_DEPLOY
|
||||||
/prop_tgt/VS_SCC_AUXPATH
|
/prop_tgt/VS_SCC_AUXPATH
|
||||||
/prop_tgt/VS_SCC_LOCALPATH
|
/prop_tgt/VS_SCC_LOCALPATH
|
||||||
/prop_tgt/VS_SCC_PROJECTNAME
|
/prop_tgt/VS_SCC_PROJECTNAME
|
||||||
|
46
Help/prop_tgt/VS_NO_SOLUTION_DEPLOY.rst
Normal file
46
Help/prop_tgt/VS_NO_SOLUTION_DEPLOY.rst
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
VS_NO_SOLUTION_DEPLOY
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Specify that the target should not be marked for deployment to a Windows CE
|
||||||
|
or Windows Phone device in the generated Visual Studio solution.
|
||||||
|
|
||||||
|
Be default, all EXE and shared library (DLL) targets are marked to deploy to
|
||||||
|
the target device in the generated Visual Studio solution.
|
||||||
|
|
||||||
|
Generator expressions are supported.
|
||||||
|
|
||||||
|
There are reasons one might want to exclude a target / generated project from
|
||||||
|
deployment:
|
||||||
|
|
||||||
|
- The library or executable may not be necessary in the primary deploy/debug
|
||||||
|
scenario, and excluding from deployment saves time in the
|
||||||
|
develop/download/debug cycle.
|
||||||
|
- There may be insufficient space on the target device to accommodate all of
|
||||||
|
the build products.
|
||||||
|
- Visual Studio 2013 requires a target device IP address be entered for each
|
||||||
|
target marked for deployment. For large numbers of targets, this can be
|
||||||
|
tedious.
|
||||||
|
NOTE: Visual Studio *will* deploy all project dependencies of a project
|
||||||
|
tagged for deployment to the IP address configured for that project even
|
||||||
|
if those dependencies are not tagged for deployment.
|
||||||
|
|
||||||
|
|
||||||
|
Example 1
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
This shows setting the variable for the target foo.
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
add_library(foo SHARED foo.cpp)
|
||||||
|
set_property(TARGET foo PROPERTY VS_NO_SOLUTION_DEPLOY ON)
|
||||||
|
|
||||||
|
Example 2
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
This shows setting the variable for the Release configuration only.
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
add_library(foo SHARED foo.cpp)
|
||||||
|
set_property(TARGET foo PROPERTY VS_NO_SOLUTION_DEPLOY "$<CONFIG:Release>")
|
6
Help/release/dev/vs-wince-no-deploy.rst
Normal file
6
Help/release/dev/vs-wince-no-deploy.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
vs_wince_no_deploy
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* A :prop_tgt:`VS_NO_SOLUTION_DEPLOY` target property was added to
|
||||||
|
tell :ref:`Visual Studio Generators` whether to deploy an artifact
|
||||||
|
to the WinCE or Windows Phone target device.
|
@@ -252,15 +252,10 @@ cmGlobalVisualStudio11Generator::GetInstalledWindowsCESDKs()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalVisualStudio11Generator::NeedsDeploy(
|
bool cmGlobalVisualStudio11Generator::TargetSystemSupportsDeployment() const
|
||||||
cmStateEnums::TargetType type) const
|
|
||||||
{
|
{
|
||||||
if ((type == cmStateEnums::EXECUTABLE ||
|
return this->SystemIsWindowsPhone || this->SystemIsWindowsStore ||
|
||||||
type == cmStateEnums::SHARED_LIBRARY) &&
|
cmGlobalVisualStudio10Generator::TargetSystemSupportsDeployment();
|
||||||
(this->SystemIsWindowsPhone || this->SystemIsWindowsStore)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return cmGlobalVisualStudio10Generator::NeedsDeploy(type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalVisualStudio11Generator::IsWindowsDesktopToolsetInstalled() const
|
bool cmGlobalVisualStudio11Generator::IsWindowsDesktopToolsetInstalled() const
|
||||||
|
@@ -45,8 +45,8 @@ protected:
|
|||||||
bool UseFolderProperty() const override;
|
bool UseFolderProperty() const override;
|
||||||
static std::set<std::string> GetInstalledWindowsCESDKs();
|
static std::set<std::string> GetInstalledWindowsCESDKs();
|
||||||
|
|
||||||
/** Return true if the configuration needs to be deployed */
|
/** Return true if target system supports debugging deployment. */
|
||||||
bool NeedsDeploy(cmStateEnums::TargetType type) const override;
|
bool TargetSystemSupportsDeployment() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class Factory;
|
class Factory;
|
||||||
|
@@ -273,7 +273,7 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations(
|
|||||||
: this->GetPlatformName())
|
: this->GetPlatformName())
|
||||||
<< "\n";
|
<< "\n";
|
||||||
}
|
}
|
||||||
if (this->NeedsDeploy(target.GetType())) {
|
if (this->NeedsDeploy(target, dstConfig)) {
|
||||||
fout << "\t\t{" << guid << "}." << i << "|" << this->GetPlatformName()
|
fout << "\t\t{" << guid << "}." << i << "|" << this->GetPlatformName()
|
||||||
<< ".Deploy.0 = " << dstConfig << "|"
|
<< ".Deploy.0 = " << dstConfig << "|"
|
||||||
<< (!platformMapping.empty() ? platformMapping
|
<< (!platformMapping.empty() ? platformMapping
|
||||||
@@ -284,11 +284,32 @@ void cmGlobalVisualStudio8Generator::WriteProjectConfigurations(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalVisualStudio8Generator::NeedsDeploy(
|
bool cmGlobalVisualStudio8Generator::NeedsDeploy(
|
||||||
cmStateEnums::TargetType type) const
|
cmGeneratorTarget const& target, const char* config) const
|
||||||
{
|
{
|
||||||
bool needsDeploy =
|
cmStateEnums::TargetType type = target.GetType();
|
||||||
(type == cmStateEnums::EXECUTABLE || type == cmStateEnums::SHARED_LIBRARY);
|
bool noDeploy = DeployInhibited(target, config);
|
||||||
return this->TargetsWindowsCE() && needsDeploy;
|
return !noDeploy &&
|
||||||
|
(type == cmStateEnums::EXECUTABLE ||
|
||||||
|
type == cmStateEnums::SHARED_LIBRARY) &&
|
||||||
|
this->TargetSystemSupportsDeployment();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cmGlobalVisualStudio8Generator::DeployInhibited(
|
||||||
|
cmGeneratorTarget const& target, const char* config) const
|
||||||
|
{
|
||||||
|
bool rVal = false;
|
||||||
|
if (const char* propStr = target.GetProperty("VS_NO_SOLUTION_DEPLOY")) {
|
||||||
|
cmGeneratorExpression ge;
|
||||||
|
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(propStr);
|
||||||
|
std::string prop = cge->Evaluate(target.LocalGenerator, config);
|
||||||
|
rVal = cmSystemTools::IsOn(prop);
|
||||||
|
}
|
||||||
|
return rVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cmGlobalVisualStudio8Generator::TargetSystemSupportsDeployment() const
|
||||||
|
{
|
||||||
|
return this->TargetsWindowsCE();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cmGlobalVisualStudio8Generator::ComputeTargetDepends()
|
bool cmGlobalVisualStudio8Generator::ComputeTargetDepends()
|
||||||
|
@@ -54,7 +54,15 @@ protected:
|
|||||||
bool AddCheckTarget();
|
bool AddCheckTarget();
|
||||||
|
|
||||||
/** Return true if the configuration needs to be deployed */
|
/** Return true if the configuration needs to be deployed */
|
||||||
virtual bool NeedsDeploy(cmStateEnums::TargetType type) const;
|
virtual bool NeedsDeploy(cmGeneratorTarget const& target,
|
||||||
|
const char* config) const;
|
||||||
|
|
||||||
|
/** Returns true if deployment has been disabled in cmake file. */
|
||||||
|
bool DeployInhibited(cmGeneratorTarget const& target,
|
||||||
|
const char* config) const;
|
||||||
|
|
||||||
|
/** Returns true if the target system support debugging deployment. */
|
||||||
|
virtual bool TargetSystemSupportsDeployment() const;
|
||||||
|
|
||||||
static cmIDEFlagTable const* GetExtraFlagTableVS8();
|
static cmIDEFlagTable const* GetExtraFlagTableVS8();
|
||||||
void WriteSolutionConfigurations(
|
void WriteSolutionConfigurations(
|
||||||
|
@@ -40,3 +40,62 @@ if(NOT FoundToolsVersion4)
|
|||||||
set(RunCMake_TEST_FAILED "Failed to find correct ToolsVersion=\"4.0\" .")
|
set(RunCMake_TEST_FAILED "Failed to find correct ToolsVersion=\"4.0\" .")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test solution file deployment items.
|
||||||
|
#
|
||||||
|
|
||||||
|
set(vcSlnFile "${RunCMake_TEST_BINARY_DIR}/VsCEDebuggerDeploy.sln")
|
||||||
|
if(NOT EXISTS "${vcSlnFile}")
|
||||||
|
set(RunCMake_TEST_FAILED "Solution file ${vcSlnFile} does not exist.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if( NOT ${CMAKE_SYSTEM_NAME} STREQUAL "WindowsCE" )
|
||||||
|
set(RunCMake_TEST_FAILED "Test only valid for WindowsCE")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
set(FooProjGUID "")
|
||||||
|
set(FoundFooProj FALSE)
|
||||||
|
set(InFooProj FALSE)
|
||||||
|
set(FoundReleaseDeploy FALSE)
|
||||||
|
set(DeployConfigs Debug MinSizeRel RelWithDebInfo )
|
||||||
|
|
||||||
|
file(STRINGS "${vcSlnFile}" lines)
|
||||||
|
foreach(line IN LISTS lines)
|
||||||
|
#message(STATUS "${line}")
|
||||||
|
if( (NOT InFooProj ) AND (line MATCHES "^[ \\t]*Project\\(\"{[A-F0-9-]+}\"\\) = \"foo\", \"foo.vcxproj\", \"({[A-F0-9-]+})\"[ \\t]*$"))
|
||||||
|
# First, identify the GUID for the foo project, and record it.
|
||||||
|
set(FoundFooProj TRUE)
|
||||||
|
set(InFooProj TRUE)
|
||||||
|
set(FooProjGUID ${CMAKE_MATCH_1})
|
||||||
|
elseif(InFooProj AND line MATCHES "EndProject")
|
||||||
|
set(InFooProj FALSE)
|
||||||
|
elseif((NOT InFooProj) AND line MATCHES "${FooProjGUID}\\.Release.*\\.Deploy\\.0")
|
||||||
|
# If foo's Release configuration is set to deploy, this is the error.
|
||||||
|
set(FoundReleaseDeploy TRUE)
|
||||||
|
endif()
|
||||||
|
if( line MATCHES "{[A-F0-9-]+}\\.([^\\|]+).*\\.Deploy\\.0" )
|
||||||
|
# Check that the other configurations ARE set to deploy.
|
||||||
|
list( REMOVE_ITEM DeployConfigs ${CMAKE_MATCH_1})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(FoundReleaseDeploy)
|
||||||
|
set(RunCMake_TEST_FAILED "Release deployment not inhibited by VS_NO_SOLUTION_DEPLOY_Release.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT FoundFooProj)
|
||||||
|
set(RunCMake_TEST_FAILED "Failed to find foo project in the solution.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(LENGTH DeployConfigs length)
|
||||||
|
if( length GREATER 0 )
|
||||||
|
set(RunCMake_TEST_FAILED "Failed to find Deploy lines for non-Release configurations. (${length})")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
@@ -4,10 +4,11 @@ set(DEPLOY_DIR
|
|||||||
"temp\\foodir"
|
"temp\\foodir"
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(foo foo.cpp)
|
add_library(foo SHARED foo.cpp)
|
||||||
|
|
||||||
set_target_properties(foo
|
set_target_properties(foo
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
DEPLOYMENT_ADDITIONAL_FILES "foo.dll|\\foo\\src\\dir\\on\\host|$(RemoteDirectory)|0;bar.dll|\\bar\\src\\dir|$(RemoteDirectory)bardir|0"
|
DEPLOYMENT_ADDITIONAL_FILES "foo.dll|\\foo\\src\\dir\\on\\host|$(RemoteDirectory)|0;bar.dll|\\bar\\src\\dir|$(RemoteDirectory)bardir|0"
|
||||||
DEPLOYMENT_REMOTE_DIRECTORY ${DEPLOY_DIR}
|
DEPLOYMENT_REMOTE_DIRECTORY ${DEPLOY_DIR}
|
||||||
|
VS_NO_SOLUTION_DEPLOY $<CONFIG:Release>
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user