ninja, rc: ignore CMAKE_NINJA_FORCE_RESPONSE_FILE for RC files

In commit v3.6.0-rc1~174^2 (Ninja: Honor CMAKE_NINJA_FORCE_RESPONSE_FILE
for compile rules, 2016-04-06), Ninja learned to look for
`CMAKE_NINJA_FORCE_RESPONSE_FILE` in the current scope or the
environment in order to force response file usage for all compilation
rules.

However, on Windows, the RC compiler goes through cmcldeps which does a
`replace(output, output + ".dep.obj")` on the command line. However,
with a response file (which we name `output + ".rsp"`), the response
file path is replaced instead causing the compiler to (correctly)
complain that the response file `output + ".dep.obj.rsp"` does not
exist.

What needs to happen is for cmcldeps to look through the response file,
replace *its* contents and place it in the `output + ".dep.obj.rsp"`
file.

Also add a test which actually compiles an RC file into a library and
executable for all generators on Windows and additionally test
`CMAKE_NINJA_FORCE_RESPONSE_FILE` for Ninja generators.

Fixes #16167.
This commit is contained in:
Ben Boeckel 2016-06-27 11:44:10 -04:00 committed by Brad King
parent d152ae123d
commit 15b3f6f0f1
6 changed files with 28 additions and 2 deletions

View File

@ -316,7 +316,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang)
std::string rspcontent;
std::string responseFlag;
if (this->ForceResponseFile()) {
if (lang != "RC" && this->ForceResponseFile()) {
rspfile = "$RSP_FILE";
responseFlag = "@" + rspfile;
rspcontent = " $DEFINES $INCLUDES $FLAGS";
@ -593,7 +593,9 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
this->SetMsvcTargetPdbVariable(vars);
int const commandLineLengthLimit = this->ForceResponseFile() ? -1 : 0;
bool const isRC = (language == "RC");
int const commandLineLengthLimit =
((!isRC && this->ForceResponseFile())) ? -1 : 0;
std::string const rspfile = objectFileName + ".rsp";
this->GetGlobalGenerator()->WriteBuild(

View File

@ -274,6 +274,9 @@ if(BUILD_TESTING)
endif()
if(TEST_RESOURCES)
ADD_TEST_MACRO(VSResource VSResource)
if (CMAKE_GENERATOR MATCHES "Ninja")
add_test_macro(VSResourceNinjaForceRSP VSResourceNinjaForceRSP)
endif ()
endif()
ADD_TEST_MACRO(MSManifest MSManifest)
ADD_TEST_MACRO(Simple Simple)

View File

@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 2.8.4)
project(VSResourceNinjaForceRSP)
set(CMAKE_NINJA_FORCE_RESPONSE_FILE TRUE)
add_library(ResourceLib lib.cpp test.rc)
add_executable(VSResourceNinjaForceRSP main.cpp test.rc)

View File

@ -0,0 +1,4 @@
int lib()
{
return 0;
}

View File

@ -0,0 +1,6 @@
int main(int argc, char** argv)
{
(void)argc;
(void)argv;
return 0;
}

View File

@ -0,0 +1,4 @@
STRINGTABLE
BEGIN
1234 "5"
END