[Scons-users] env.MergeFlags does not accept dict CPPDEFINES

Olivier Renaud orenaud at coventor.com
Thu Jul 13 05:23:54 EDT 2017


I would like to present to you an issue I have, and maybe submit it to 
the bugtracker if appropriate.

I am trying to use the MergeFlags method of Environment. The docstring 
of this method says:

         Merge the dict in args into the construction variables of this
         env, or the passed-in dict.  If args is not a dict, it is
         converted into a dict using ParseFlags.  If unique is not set,
         the flags are appended rather than merged.

It does not give details about what kind of flags are supported, though. 
As a user, I would expect CPPDEFINES to be supported as a flag that can 
be merged into the env.

The user manual for CPPDEFINES 
says that it can be:
- a string (for a single define)
- a list of strings
- a list of tuples (each containing 2 strings)
- a list of lists (each containing 2 strings)
- a dictionary

The problem is that the implementation of MergeFlags seems to support 
the merging of lists of strings only, and can behave poorly or raise an 
exception when using other variants.

Some examples:

     # Example 1: list of tuples + list of tuples => OK
     env_cppdefines = [('MY_DEF', 'hello')]
     flags_cppdefines = [('OTHER_DEF', 'goodbye')]

     env = Environment(CPPDEFINES = env_cppdefines)
     env.MergeFlags({'CPPDEFINES': flags_cppdefines})

     print env.Dump('CPPDEFINES')
     print env.subst('$_CPPDEFFLAGS')
     [('MY_DEF', 'hello'), ('OTHER_DEF', 'goodbye')]
     /DMY_DEF=hello /DOTHER_DEF=goodbye

     # Example 2: list + list => OK
     env_cppdefines = ['MY_DEF']
     flags_cppdefines = ['OTHER_DEF']
     ['MY_DEF', 'OTHER_DEF']

     # Example 3: dict + dict => Exception
     env_cppdefines = {'MY_DEF': 'hello'}
     flags_cppdefines = {'OTHER_DEF': 'goodbye'}
     AttributeError: 'dict' object has no attribute 'insert':
       File "C:\Users\me\tmp\bug_scons\SConstruct", line 5:
         env.MergeFlags({'CPPDEFINES': flags_cppdefines})
"c:\python27\lib\site-packages\scons-2.5.1\SCons\Environment.py", line 841:
         value.insert(0, orig)

     # Example 4: list + identical list => OK
     env_cppdefines = ['MY_DEF']
     flags_cppdefines = ['MY_DEF']

     # Example 5: dict + identical list => duplication
     env_cppdefines = {'MY_DEF': None}
     flags_cppdefines = ['MY_DEF']
     [{ 'MY_DEF': None}, 'MY_DEF']

Is it correct for me to expect MergeFlags to work with CPPDEFINES, and 
in particular to work with the dictionary versions of it?

Best regards,
Olivier Renaud

More information about the Scons-users mailing list