This patch adds support for compiling Windows resource files
(.rc) and pre-compiled resource files (.res) directly through the
GCC driver on PECOFF targets.

Previously, users had to manually invoke windres to compile resource
files before linking:

    windres -o resource.o resource.rc
    gcc main.c resource.o -o program.exe

With this patch, GCC can handle resource files automatically:

    gcc main.c resource.rc -o program.exe
    gcc main.c resource.res -o program.exe

Now, for an explanation of each line of the spec:

If any of -E -M or -MM were passed, do nothing. No object files are output.
    "%{!E:%{!M:%{!MM:windres \

For multilib configurations, tell windres to write out the correct COFF format
    %{m32:--target=pe-i386} %{m64:--target=pe-x86-64} \

Pass through -I -D -U on to windres, because it supports them.
    %{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \

If -c is passed, pass through -o to windres, if it was specified. Otherwise,
 output to the input basename with .o suffix. Else, output to a
 temp file that will be deleted after linking.
    %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}",

gcc/ChangeLog:

        PR driver/108866
        * gcc.cc (default_compilers): Add EXTRA_DEFAULT_COMPILERS so the config
        of a target can add an extra compiler spec to default_compilers.
        * config/i386/cygming.h: Add EXTRA_DEFAULT_COMPILERS spec for windres.
        * config/aarch64/cygming.h: Likewise.

Signed-off-by: Peter Damianov <[email protected]>
---
v3: Remove -m64 from aarch64, it doesn't exist.

 gcc/config/aarch64/cygming.h | 10 ++++++++++
 gcc/config/i386/cygming.h    | 11 +++++++++++
 gcc/gcc.cc                   |  5 +++++
 3 files changed, 26 insertions(+)

diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h
index 1c7f8f58e64..d26d65684a5 100644
--- a/gcc/config/aarch64/cygming.h
+++ b/gcc/config/aarch64/cygming.h
@@ -254,4 +254,14 @@ still needed for compilation.  */
 #undef  TARGET_ASM_LTO_END
 #define TARGET_ASM_LTO_END mingw_pe_asm_lto_end
 
+/* Support for Windows resource files.  */
+#define EXTRA_DEFAULT_COMPILERS \
+  {".rc", "@windres", 0, 0, 0}, \
+  {".res", "@windres", 0, 0, 0}, \
+  {"@windres", \
+   "%{!E:%{!M:%{!MM:windres \
+      %{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
+      %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
+   0, 0, 0},
+
 #endif
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 0a3173c4e93..23077f4fd52 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -474,3 +474,14 @@ do {                                               \
   (ix86_cmodel == CM_LARGE_PIC || ix86_cmodel == CM_MEDIUM_PIC)
 
 #define HAVE_64BIT_POINTERS TARGET_64BIT_DEFAULT
+
+/* Support for Windows resource files.  */
+#define EXTRA_DEFAULT_COMPILERS \
+  {".rc", "@windres", 0, 0, 0}, \
+  {".res", "@windres", 0, 0, 0}, \
+  {"@windres", \
+   "%{!E:%{!M:%{!MM:windres \
+      %{m32:--target=pe-i386} %{m64:--target=pe-x86-64} \
+      %{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
+      %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
+   0, 0, 0},
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index b5d0f759f14..bfe262bdc2d 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -1517,6 +1517,11 @@ static const struct compiler default_compilers[] =
 #endif
    , 0, 0, 0},
 
+#ifndef EXTRA_DEFAULT_COMPILERS
+#define EXTRA_DEFAULT_COMPILERS
+#endif
+  EXTRA_DEFAULT_COMPILERS
+
 #include "specs.h"
   /* Mark end of table.  */
   {0, 0, 0, 0, 0}
-- 
2.47.3

Reply via email to