On Thursday 04 December 2025 21:37:15 Peter0x44 wrote:
> On 2025-12-04 18:31, Pali Rohár wrote:
> > On Thursday 04 December 2025 09:32:44 Peter Damianov wrote:
> > > 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}}}",
> >
> > Hello, what about always passing the "-O coff" parameter to windres?
> > Just in case if user call gcc with "-o file.ext" parameter and the "ext"
> Hmm. Is this really necessary? Do we not want `gcc file.c -c -o file.res`
> to emit the res instead of a coff?
If I run g++ file.cpp -c -o file.res it will compile file.cpp and produce
COFF object file named file.res. So somehow I would expect that if I run
gcc file.rc -c -o file.res then output file would be also COFF object
independently of the file extension.
> > is something not automatically detected as object coff file by windres.
> > And also what about always passing the "-J" parameter to windres? To
> > ensure that no autodetection of input file type is done by windres.
> I think I would have to duplicate and make a separate spec for .rc vs .res.
> it is guarding against something I feel is misuse. But I could be convinced
> otherwise.
gcc allows to specify language by -x argument and then extension
autodetect is not used. So for example I can store C code into file.xyz
and run: gcc -xc -c file.xyz. So if somebody would be able to call that
windres spec with forced language then this would not work correctly
without -J parameter.
> >
> > > 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
> > >