Skip to content

Commit

Permalink
VS: Fix nowarn compiler option to accept warning numbers.
Browse files Browse the repository at this point in the history
Warning disables are transferred to the VS IDE `<NoWarn>` node.

Fixes: #18878
  • Loading branch information
wilstark authored and bradking committed Feb 7, 2019
1 parent 6f23321 commit 8226979
Show file tree
Hide file tree
Showing 12 changed files with 132 additions and 16 deletions.
2 changes: 2 additions & 0 deletions Source/cmGlobalVisualStudio10Generator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -1136,6 +1136,8 @@ static unsigned int cmLoadFlagTableSpecial(Json::Value entry,
value |= cmIDEFlagTable::CaseInsensitive;
} else if (s == "SpaceAppendable") {
value |= cmIDEFlagTable::SpaceAppendable;
} else if (s == "CommaAppendable") {
value |= cmIDEFlagTable::CommaAppendable;
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions Source/cmIDEFlagTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ struct cmIDEFlagTable
SpaceAppendable = (1 << 7), // a flag that if specified multiple times
// should have its value appended to the
// old value with spaces
CommaAppendable = (1 << 8), // a flag that if specified multiple times
// should have its value appended to the
// old value with commas (e.g. C# /nowarn

UserValueIgnored = UserValue | UserIgnored,
UserValueRequired = UserValue | UserRequired
Expand Down
2 changes: 2 additions & 0 deletions Source/cmIDEOptions.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ void cmIDEOptions::FlagMapUpdate(cmIDEFlagTable const* entry,
this->FlagMap[entry->IDEName].push_back(new_value);
} else if (entry->special & cmIDEFlagTable::SpaceAppendable) {
this->FlagMap[entry->IDEName].append_with_space(new_value);
} else if (entry->special & cmIDEFlagTable::CommaAppendable) {
this->FlagMap[entry->IDEName].append_with_comma(new_value);
} else {
// Use the user-specified value.
this->FlagMap[entry->IDEName] = new_value;
Expand Down
12 changes: 11 additions & 1 deletion Source/cmIDEOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,22 @@ class cmIDEOptions
this->derived::operator=(r);
return *this;
}
FlagValue& append_with_comma(std::string const& r)
{
return append_with_separator(r, ',');
}
FlagValue& append_with_space(std::string const& r)
{
return append_with_separator(r, ' ');
}

private:
FlagValue& append_with_separator(std::string const& r, char separator)
{
this->resize(1);
std::string& l = this->operator[](0);
if (!l.empty()) {
l += " ";
l += separator;
}
l += r;
return *this;
Expand Down
10 changes: 7 additions & 3 deletions Templates/MSBuild/FlagTables/v10_CSharp.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,15 @@
"flags": []
},
{
"name": "DisabledWarnings",
"switch": "nowarn",
"name": "NoWarn",
"switch": "nowarn:",
"comment": "",
"value": "",
"flags": []
"flags": [
"UserValue",
"UserRequired",
"CommaAppendable"
]
},
{
"name": "CheckForOverflowUnderflow",
Expand Down
10 changes: 7 additions & 3 deletions Templates/MSBuild/FlagTables/v11_CSharp.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,15 @@
"flags": []
},
{
"name": "DisabledWarnings",
"switch": "nowarn",
"name": "NoWarn",
"switch": "nowarn:",
"comment": "",
"value": "",
"flags": []
"flags": [
"UserValue",
"UserRequired",
"CommaAppendable"
]
},
{
"name": "CheckForOverflowUnderflow",
Expand Down
10 changes: 7 additions & 3 deletions Templates/MSBuild/FlagTables/v12_CSharp.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,15 @@
"flags": []
},
{
"name": "DisabledWarnings",
"switch": "nowarn",
"name": "NoWarn",
"switch": "nowarn:",
"comment": "",
"value": "",
"flags": []
"flags": [
"UserValue",
"UserRequired",
"CommaAppendable"
]
},
{
"name": "CheckForOverflowUnderflow",
Expand Down
10 changes: 7 additions & 3 deletions Templates/MSBuild/FlagTables/v140_CSharp.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,15 @@
"flags": []
},
{
"name": "DisabledWarnings",
"switch": "nowarn",
"name": "NoWarn",
"switch": "nowarn:",
"comment": "",
"value": "",
"flags": []
"flags": [
"UserValue",
"UserRequired",
"CommaAppendable"
]
},
{
"name": "CheckForOverflowUnderflow",
Expand Down
10 changes: 7 additions & 3 deletions Templates/MSBuild/FlagTables/v141_CSharp.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,15 @@
"flags": []
},
{
"name": "DisabledWarnings",
"switch": "nowarn",
"name": "NoWarn",
"switch": "nowarn:",
"comment": "",
"value": "",
"flags": []
"flags": [
"UserValue",
"UserRequired",
"CommaAppendable"
]
},
{
"name": "CheckForOverflowUnderflow",
Expand Down
1 change: 1 addition & 0 deletions Tests/RunCMake/VS10Project/RunCMakeTest.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
include(RunCMake)

run_cmake(VsCSharpCompilerOpts)
run_cmake(ExplicitCMakeLists)
run_cmake(SourceGroupCMakeLists)

Expand Down
64 changes: 64 additions & 0 deletions Tests/RunCMake/VS10Project/VsCSharpCompilerOpts-check.cmake
Original file line number Diff line number Diff line change
@@ -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 "^ *<NoWarn>.*505.*</NoWarn> *$") AND
(line MATCHES "^ *<NoWarn>.*707.*</NoWarn> *$") AND
(line MATCHES "^ *<NoWarn>.*808.*</NoWarn> *$") AND
(line MATCHES "^ *<NoWarn>.*909.*</NoWarn> *$")
)
set(debugOK TRUE)
elseif(inRelease AND
(NOT (line MATCHES "^ *<NoWarn>.*505.*</NoWarn> *$")) AND
(line MATCHES "^ *<NoWarn>.*707.*</NoWarn> *$") AND
(line MATCHES "^ *<NoWarn>.*808.*</NoWarn> *$") AND
(line MATCHES "^ *<NoWarn>.*909.*</NoWarn> *$")
)
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 warning config 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 warning config correctly.")
set(RunCMake_TEST_FAILED "Failed to set Release configuration defines correctly.")
print_csprojfile()
return()
endif()
14 changes: 14 additions & 0 deletions Tests/RunCMake/VS10Project/VsCSharpCompilerOpts.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
enable_language(CSharp)

add_library(foo SHARED
foo.cs)

set_target_properties(foo PROPERTIES
LINKER_LANGUAGE CSharp)


# Issue 18878
target_compile_options(foo PRIVATE "/platform:anycpu" "/nowarn:707,808" "/nowarn:909" )

# Debug only warning disable
set(CMAKE_CSharp_FLAGS_DEBUG "${CMAKE_CSharp_FLAGS_DEBUG} /nowarn:505")

0 comments on commit 8226979

Please sign in to comment.