summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCalum Robinson <calum.robinson@sias.com>2024-09-17 15:30:44 (GMT)
committerCalum Robinson <calum.robinson@sias.com>2024-09-18 17:26:27 (GMT)
commitfd668186530d88340ecf32d2b55859a8cf6a8cb4 (patch)
tree3f226aeeb17a19a791c41d384089d7dc7750b93f
parentb69b5a94d1a30a71b76b05a025b13a505dcda67b (diff)
downloadCMake-fd668186530d88340ecf32d2b55859a8cf6a8cb4.zip
CMake-fd668186530d88340ecf32d2b55859a8cf6a8cb4.tar.gz
CMake-fd668186530d88340ecf32d2b55859a8cf6a8cb4.tar.bz2
VS: Fix custom commands for DOTNET_SDK builds
Fixes: #23723
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx37
-rw-r--r--Source/cmVisualStudio10TargetGenerator.h2
-rw-r--r--Tests/RunCMake/VsDotnetSdk/RunCMakeTest.cmake2
-rw-r--r--Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-build-stdout.txt1
-rw-r--r--Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-result.txt0
-rw-r--r--Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-stderr.txt7
-rw-r--r--Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource.cmake5
7 files changed, 21 insertions, 33 deletions
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 883d787..71a140b 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -907,16 +907,6 @@ void cmVisualStudio10TargetGenerator::WriteSdkStyleProjectFile(
return;
}
- if (this->HasCustomCommandsSource()) {
- std::string message = cmStrCat(
- "The target \"", this->GeneratorTarget->GetName(),
- "\" does not currently support add_custom_command as the Visual Studio "
- "generators have not yet learned how to generate custom commands in "
- ".Net SDK-style projects.");
- this->Makefile->IssueMessage(MessageType::FATAL_ERROR, message);
- return;
- }
-
Elem e0(BuildFileStream, "Project");
e0.Attribute("Sdk", *this->GeneratorTarget->GetProperty("DOTNET_SDK"));
@@ -1016,6 +1006,7 @@ void cmVisualStudio10TargetGenerator::WriteSdkStyleProjectFile(
}
this->WriteDotNetDocumentationFile(e0);
+ this->WriteCustomCommands(e0);
this->WriteAllSources(e0);
this->WriteEmbeddedResourceGroup(e0);
this->WriteXamlFilesGroup(e0);
@@ -1077,15 +1068,6 @@ void cmVisualStudio10TargetGenerator::WriteCommonPropertyGroupGlobals(Elem& e1)
}
}
-bool cmVisualStudio10TargetGenerator::HasCustomCommandsSource() const
-{
- auto const& config_sources = this->GeneratorTarget->GetAllConfigSources();
- return std::any_of(config_sources.begin(), config_sources.end(),
- [](cmGeneratorTarget::AllConfigSource const& si) {
- return si.Source->GetCustomCommand();
- });
-}
-
void cmVisualStudio10TargetGenerator::WritePackageReferences(Elem& e0)
{
std::vector<std::string> packageReferences =
@@ -1843,6 +1825,15 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule(
symbolic = sf->GetPropertyAsBool("SYMBOLIC");
}
}
+
+ // Without UpToDateCheckInput VS will ignore the dependency files
+ // when doing it's fast up-to-date check and the command will not run
+ if (this->ProjectType == VsProjectType::csproj &&
+ this->GeneratorTarget->IsDotNetSdkTarget()) {
+ Elem e1(e0, "ItemGroup");
+ Elem e2(e1, "UpToDateCheckInput");
+ e2.Attribute("Include", dep);
+ }
}
}
if (this->ProjectType != VsProjectType::csproj) {
@@ -1936,10 +1927,16 @@ void cmVisualStudio10TargetGenerator::WriteCustomRuleCSharp(
}
this->CSharpCustomCommandNames.insert(name);
Elem e1(e0, "Target");
- e1.Attribute("Condition", this->CalcCondition(config));
+ e1.Attribute("Condition", cmStrCat("'$(Configuration)' == '", config, '\''));
e1.S << "\n Name=\"" << name << "\"";
e1.S << "\n Inputs=\"" << cmVS10EscapeAttr(inputs) << "\"";
e1.S << "\n Outputs=\"" << cmVS10EscapeAttr(outputs) << "\"";
+
+ // Run before sources are compiled...
+ e1.S << "\n BeforeTargets=\"CoreCompile\""; // BeforeBuild
+ // ...but after output directory has been created
+ e1.S << "\n DependsOnTargets=\"PrepareForBuild\"";
+
if (!comment.empty()) {
Elem(e1, "Exec").Attribute("Command", cmStrCat("echo ", comment));
}
diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h
index aae9ca3..9b7ae10 100644
--- a/Source/cmVisualStudio10TargetGenerator.h
+++ b/Source/cmVisualStudio10TargetGenerator.h
@@ -289,8 +289,6 @@ private:
void WriteCommonPropertyGroupGlobals(
cmVisualStudio10TargetGenerator::Elem& e1);
- bool HasCustomCommandsSource() const;
-
std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
const std::string& propName);
diff --git a/Tests/RunCMake/VsDotnetSdk/RunCMakeTest.cmake b/Tests/RunCMake/VsDotnetSdk/RunCMakeTest.cmake
index 68a6d5c..276451d 100644
--- a/Tests/RunCMake/VsDotnetSdk/RunCMakeTest.cmake
+++ b/Tests/RunCMake/VsDotnetSdk/RunCMakeTest.cmake
@@ -1,7 +1,6 @@
cmake_policy(SET CMP0053 NEW)
include(RunCMake)
-run_cmake(VsDotnetSdkCustomCommandsSource)
run_cmake(VsDotnetSdkStartupObject)
run_cmake(VsDotnetSdkDefines)
run_cmake(DotnetSdkVariables)
@@ -30,3 +29,4 @@ endfunction()
runCmakeAndBuild(VsDotnetSdkCustomCommandsTarget)
runCmakeAndBuild(VsDotnetSdkNugetRestore)
+runCmakeAndBuild(VsDotnetSdkCustomCommandsSource)
diff --git a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-build-stdout.txt b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-build-stdout.txt
new file mode 100644
index 0000000..9afaa2b
--- /dev/null
+++ b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-build-stdout.txt
@@ -0,0 +1 @@
+Generating bar.cs
diff --git a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-result.txt b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-result.txt
deleted file mode 100644
index e69de29..0000000
--- a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-result.txt
+++ /dev/null
diff --git a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-stderr.txt b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-stderr.txt
deleted file mode 100644
index 90af627..0000000
--- a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource-stderr.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-CMake Error in CMakeLists.txt:
- The target "foo" does not currently support add_custom_command as the
- Visual Studio generators have not yet learned how to generate custom
- commands in .Net SDK-style projects.
-
-
-CMake Generate step failed. Build files cannot be regenerated correctly.
diff --git a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource.cmake b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource.cmake
index af18946..d6166db 100644
--- a/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource.cmake
+++ b/Tests/RunCMake/VsDotnetSdk/VsDotnetSdkCustomCommandsSource.cmake
@@ -7,9 +7,8 @@ endif()
set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk")
add_custom_command(
OUTPUT bar.cs
- COMMAND copy /A ${CMAKE_CURRENT_SOURCE_DIR}/lib1.cs
- bar.cs
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib1.cs
+ COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/lib1.cs" bar.cs
+ DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/lib1.cs"
VERBATIM)
add_library(foo SHARED bar.cs)