Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MSVC tool: prevent overwriting the PCH object node builder/emitter #4444

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

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.

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