[Scummvm-tracker] [ScummVM] #10878: WIN32: Disabled engine files are included as resources

ScummVM trac at scummvm.org
Tue Jan 29 06:32:42 CET 2019


#10878: WIN32: Disabled engine files are included as resources
----------------------+-------------------------
Reporter:  sluicebox  |      Owner:  (none)
    Type:  defect     |     Status:  new
Priority:  normal     |  Component:  Port: Win32
Keywords:             |       Game:
----------------------+-------------------------
 Windows builds are including data files for disabled engines as embedded
 resources. It's not clear to me that the scheme of excluding disabled
 engine files, introduced 8 years ago, has ever worked. That's plausible
 since it wouldn't have broken anything, it would have just potentially
 added extra bytes to the exe. This applies to both mingw and visual studio
 builds.

 The root cause is simple: STATIC_PLUGIN, which plugins.h defines as 1, is
 never defined for the resource compiler.

 Engine data files are included in scummvm.rc as such:


 {{{
 #if ENABLE_HUGO       == STATIC_PLUGIN
 hugo.dat               FILE    "dists/engine-data/hugo.dat"
 #endif
 }}}


 The goal is to only include a file if the engine is enabled AND as a
 static plugin. (DYNAMIC_PLUGIN = 2)

 The ENABLE_* identifiers are correctly being passed to the resource
 compiler but there is nothing that informs the resource compiler of
 STATIC_PLUGIN. Since STATIC_PLUGIN is undefined, the resource compiler
 evaluates each of these preprocessor statements as true regardless of
 ENABLE_*, causing all files to always be included. You can easily confirm
 this by replacing ENABLE_HUGO with a made-up identifier and inspecting the
 resulting exe, it will contain hugo.dat. (I sent away for the HUGO II:
 WHODUNNIT hint book in the early 90s because I was stuck at the chasm for
 months. YOU JUST WALK ACROSS IT?! Permanently turned me off to bananas.
 But I did learn the word chasm. Thanks England.)

 There are of course endless ways to inform a component about a simple
 definition, so I defer to someone with more seniority as to which the most
 scummvmy way is, but I have some observations to assist. STATIC_PLUGIN is
 defined in plugins.h. Assuming you don't want to do anything crass like
 repeat the definition, the best thing to do is probably factor the
 *_PLUGIN definitions out to a very small and simple .h file so that
 scummvm.rc can #include it, similar to internal_version.h. In a perfect
 world you could just #include plugins.h in scummvm.rc, but the resource
 compiler isn't a c++ compiler, and you'll get into trouble. Microsoft's
 resource compiler is guaranteed to accept #includes of .c and .h files,
 ignoring everything but preprocessor macros, and indeed that ball of wax
 works at the moment
 (https://blogs.msdn.microsoft.com/oldnewthing/20171004-00/?p=97126), but
 mingw gets into trouble because it doesn't have its own dedicated hack-
 fest, it just hands the work off to gcc's preprocessor, and the world of
 c++ that plugins.h drags in breaks down in my mingw environment. Factoring
 out the plugin definitions into a simple .h will make life simple for both
 resource compilers and we won't have to worry about some unexpected c++
 indirectly breaking it in the future.

 I don't know what the timetable is for a 2.1 release but there are a
 number of in-progress engines with data files and if this isn't resolved
 before then the 2.1 exe will end up containing them.

 Huge thanks to SupSuper for helping in getting to the bottom of this and
 walking me though getting a mingw environment setup like the child that I
 am. Windows masochists of the world, unite!

 [ Fair warning: if this isn't addressed I will belligerently submit my own
 PR that will make everyone mad =) ]

-- 
Ticket URL: <https://bugs.scummvm.org/ticket/10878>
ScummVM <https://bugs.scummvm.org>
ScummVM


More information about the Scummvm-tracker mailing list