Skip to content

Conversation

jcbrill
Copy link
Contributor

@jcbrill jcbrill commented Nov 21, 2023

Prevent overwriting the PCH object node builder/emitter when the PCH source file is included in the source list.

Suppress the assignment of the static object builder/emitter when the target is the PCH object file (e.g., PCH.obj) and the source is the PCH c++ file (e.g., PCH.cpp).

When the object_emitter is called for target PCH.obj and source PCH.cpp, the target list and source list are invalidated (i.e., both are set to None).

See #2249 (comment) for discussion.

Contributor Checklist:

  • I have created a new test or updated the unit tests to cover the new/changed functionality.
  • I have updated CHANGES.txt (and read the README.rst)
  • I have updated the appropriate documentation

Suppress the assignment of the static object builder/emitter when the target is the PCH object file (e.g., PCH.obj) and the source is the PCH c++ file (e.g., PCH.cpp).

When the object_emitter is called for target PCH.obj and source PCH.cpp, the target list and source list are invalidated (i.e., both are set to None).
@jcbrill jcbrill changed the title [WIP] MSVC tool: prevent overwriting the PCH object node builder/emitter MSVC tool: prevent overwriting the PCH object node builder/emitter Nov 21, 2023
@bdbaddog bdbaddog added pch Pre-compiled header support MSVC Microsoft Visual C++ Support labels Feb 5, 2024
@@ -121,8 +124,16 @@ def object_emitter(target, source, env, parent_emitter):
# https://github.com/SCons/scons/issues/2505
pch=get_pch_node(env, target, source)
if pch:
if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj':
pch_basename = SCons.Util.splitext(str(pch))[0]
if str(target[0]) != pch_basename + '.obj':
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is okay given the pretty constrained context, but maybe ought to use $OBJSUFFIX (though then you have to subst is before using...)

@@ -40,7 +40,7 @@
env = Environment(tools=['msvc', 'mslink'])
env['PCH'] = env.PCH('Source1.cpp')[0]
env['PCHSTOP'] = 'Header1.hpp'
env.Program('foo', ['foo.cpp', 'Source2.cpp', 'Source1.cpp'])
env.Program('foo', ['Source2.cpp', 'Source1.cpp', 'foo.cpp'])
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add a comment here that the order is chosen for a specific reason, so somebody doesn't resort it later.

@@ -99,6 +99,9 @@ def pch_emitter(target, source, env):

target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work

if 'PCH' not in env or not env['PCH']:
env['PCH'] = pch

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this really needs both parts of the check I guess it's fine. The common idiom when you want to preserve any existing value (but not to also test what it is):

    env.SetDefault(PCH=pch)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't looked at this in quite awhile.

There was a comment in the issue #2249 (#2249 (comment)) where there appeared to be a reason evaluating False was important:

I wonder if the idea is to say not to set the PCH consvar manually, and instead have the PCH builder be the one that sets it.

The suggested solution was adjusted to set env['PCH']=pch in the msvc pch_emitter when either env['PCH'] is undefined or evaluates to false.

I'll have to dig back in one of these days. Unfortunately, available time is limited in the immediate short term.

Work was suspended on this for awhile because I was convinced there was a situation/confluence of events that needed state to be saved and/or maintained which is problematic. Somewhere here I had some prototype code that looked promising.

@jcbrill jcbrill changed the title MSVC tool: prevent overwriting the PCH object node builder/emitter [WIP] MSVC tool: prevent overwriting the PCH object node builder/emitter May 11, 2025
@jcbrill
Copy link
Contributor Author

jcbrill commented Jul 25, 2025

Abandoning soon: may resurrect in the future.

@jcbrill jcbrill closed this Jul 25, 2025
@jcbrill jcbrill deleted the jbrill-msvc-pchnode branch July 25, 2025 22:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
MSVC Microsoft Visual C++ Support pch Pre-compiled header support
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants