VS: Honor target_compile_definitions for C# projects

Fixes: #18698
This commit is contained in:
Wil Stark
2019-01-14 13:52:25 -08:00
parent da566d4de8
commit a541d113e6
4 changed files with 87 additions and 0 deletions

View File

@@ -2620,6 +2620,10 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
}
clOptions.AddDefines(targetDefines);
if (this->ProjectType == csproj) {
clOptions.AppendFlag("DefineConstants", targetDefines);
}
// Get includes for this target
if (!this->LangForClCompile.empty()) {
clOptions.AddIncludes(

View File

@@ -14,5 +14,6 @@ run_cmake(VsCSharpCustomTags)
run_cmake(VsCSharpReferenceProps)
run_cmake(VsCSharpWithoutSources)
run_cmake(VsCSharpDeployFiles)
run_cmake(VSCSharpDefines)
run_cmake(VsSdkDirectories)
run_cmake(VsGlobals)

View File

@@ -0,0 +1,64 @@
#
# Check C# VS project for required elements.
#
set(csProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.csproj")
if(NOT EXISTS "${csProjectFile}")
set(RunCMake_TEST_FAILED "Project file ${csProjectFile} does not exist.")
return()
endif()
set(inDebug FALSE)
set(inRelease FALSE)
set(debugOK FALSE)
set(releaseOK FALSE)
file(STRINGS "${csProjectFile}" lines)
foreach(line IN LISTS lines)
#message(STATUS ${line})
if(line MATCHES "^ *<PropertyGroup .*Debug\\|(Win32|x64).*")
set(inDebug TRUE)
elseif(line MATCHES "^ *<PropertyGroup .*Release\\|(Win32|x64).*")
set(inRelease TRUE)
elseif(line MATCHES "^ *</PropertyGroup> *$")
set(inRelease FALSE)
set(inDebug FALSE)
elseif(inDebug AND
(line MATCHES "^ *<DefineConstants>.*MY_FOO_DEFINE.*</DefineConstants> *$") AND
(line MATCHES "^ *<DefineConstants>.*DEFINE_ONLY_FOR_DEBUG.*</DefineConstants> *$") AND
(line MATCHES "^ *<DefineConstants>.*MY_BAR_ASSIGNMENT=bar.*</DefineConstants> *$") AND
(NOT (line MATCHES "^ *<DefineConstants>.*DEFINE_ONLY_FOR_RELEASE.*</DefineConstants> *$"))
)
set(debugOK TRUE)
elseif(inRelease AND
(line MATCHES "^ *<DefineConstants>.*MY_FOO_DEFINE.*</DefineConstants> *$") AND
(line MATCHES "^ *<DefineConstants>.*DEFINE_ONLY_FOR_RELEASE.*</DefineConstants> *$") AND
(line MATCHES "^ *<DefineConstants>.*MY_BAR_ASSIGNMENT=bar.*</DefineConstants> *$") AND
(NOT (line MATCHES "^ *<DefineConstants>.*DEFINE_ONLY_FOR_DEBUG.*</DefineConstants> *$"))
)
set(releaseOK TRUE)
endif()
endforeach()
function(print_csprojfile)
file(STRINGS "${csProjectFile}" lines)
foreach(line IN LISTS lines)
message(STATUS ${line})
endforeach()
endfunction()
if(NOT debugOK)
message(STATUS "Failed to set Debug configuration defines correctly.")
set(RunCMake_TEST_FAILED "Failed to set Debug configuration defines correctly.")
print_csprojfile()
return()
endif()
if(NOT releaseOK)
message(STATUS "Failed to set Release configuration defines correctly.")
set(RunCMake_TEST_FAILED "Failed to set Release configuration defines correctly.")
print_csprojfile()
return()
endif()

View File

@@ -0,0 +1,18 @@
enable_language(CSharp)
add_library(foo SHARED
foo.cs)
set_target_properties(foo PROPERTIES
LINKER_LANGUAGE CSharp)
# Issue 18698
target_compile_definitions(
foo
PUBLIC
MY_FOO_DEFINE
"MY_BAR_ASSIGNMENT=bar"
$<$<CONFIG:Debug>:DEFINE_ONLY_FOR_DEBUG>
$<$<CONFIG:Release>:DEFINE_ONLY_FOR_RELEASE>
)