ソースを参照

cmcldeps: Avoid passing /nologo more than once to RC compiler

`rc /nologo /nologo ...` fails:

    fatal error RC1106: invalid option: -ologo

Fixes: #24974
Inspired-by: Benjamin Buch <[email protected]>
Brad King 2 年 前
コミット
0e1abf7afa
1 ファイル変更11 行追加2 行削除
  1. 11 2
      Source/cmcldeps.cxx

+ 11 - 2
Source/cmcldeps.cxx

@@ -249,7 +249,16 @@ int main()
 
   if (lang == "RC") {
     // "misuse" cl.exe to get headers from .rc files
-    std::string clrest = " /nologo /showIncludes " + rest;
+
+    // Make sure there is at most one /nologo option.
+    bool const haveNologo = (rest.find("/nologo ") != std::string::npos ||
+                             rest.find("-nologo ") != std::string::npos);
+    cmSystemTools::ReplaceString(rest, "-nologo ", " ");
+    cmSystemTools::ReplaceString(rest, "/nologo ", " ");
+    std::string clrest = rest;
+    if (haveNologo) {
+      rest = "/nologo " + rest;
+    }
 
     // rc /fo X.dir\x.rc.res  =>  cl -FoX.dir\x.rc.res.obj
     // The object will not actually be written.
@@ -257,7 +266,7 @@ int main()
     cmSystemTools::ReplaceString(clrest, "-fo ", " ");
     cmSystemTools::ReplaceString(clrest, objfile, "-Fo" + objfile + ".obj");
 
-    cl = "\"" + cl + "\" /P /DRC_INVOKED /TC ";
+    cl = "\"" + cl + "\" /P /DRC_INVOKED /nologo /showIncludes /TC ";
 
     // call cl in object dir so the .i is generated there
     std::string objdir;