[Scons-users] Assembly compiler flags

Mats Wichmann mats at wichmann.us
Tue Oct 10 11:54:04 EDT 2023


On 10/10/23 08:49, Keith Snively wrote:
> I have a project that invokes an assembler as part of the compilation 
> process. Starting with version 4.5.0, there appears to be an issue with 
> the flags that are supplied to the compiler though.  Basically, it is 
> taking the flags supplied to CPPDEFINES and truncating them to the first 
> letter only.
> 
> In this case, I am compiling boost.  Here is a SConstruct excerpt that 
> sets the CPPDEFINES:
> 
> local_env = env.Clone()
> 
> local_env.AppendUnique(CPPDEFINES = ['BOOST_ALL_NO_LIB=1', 
> 'BOOST_CHRONO_DYN_LINK=1', 'BOOST_CONTEXT_DYN_LINK=1',
>                                       'BOOST_CONTEXT_SOURCE', 
> 'BOOST_DISABLE_ASSERTS', 'BOOST_THREAD_BUILD_DLL=1',
>                                       'BOOST_THREAD_USE_DLL=1', 'NDEBUG'])
> 
> ...
> library_build = local_env.SharedLibrary(target=path.join(env['MY_LIBS'], 
> lib_target), source=sources)
> 
> The expected compile output (On Windows using VS 2019) is:
> 
> ml64 /nologo /DUSE_CPP /DGL_GAME_WIDGETS /DNO_DEVUTIL_STRACE 
> /DBOOST_ALL_NO_LIB=1 /DBOOST_CHRONO_DYN_LINK=1 
> /DBOOST_CONTEXT_DYN_LINK=1 /DBOOST_CONTEXT_SOURCE 
> /DBOOST_DISABLE_ASSERTS /DBOOST_THREAD_BUILD_DLL=1 
> /DBOOST_THREAD_USE_DLL=1 /DNDEBUG /DBOOST_CONTEXT_EXPORT=EXPORT 
> /DBOOST_THREAD_WIN32 /D__STDC_LIMIT_MACROS /c 
> /Foasm\jump_x86_64_ms_pe_masm.obj asm\jump_x86_64_ms_pe_masm.asm
> 
> Starting with version 4.5.0, the compile output is:
> 
> ml64 /nologo /DU /DG /DN /DB /D_ /c /Foasm\jump_x86_64_ms_pe_masm.obj 
> asm\jump_x86_64_ms_pe_masm.asm
> 
> It looks like it only keeps the first letter of the defines and then 
> removes duplicates (e.g. the /DB ).

the removing duplicates is because you asked it to (AppendUnique rather 
than Append), obviously they shouldn't be getting stripped to a single 
character so they look like dupes!

This is pretty odd... construction variables for the Microsoft assembler 
are set up by the masm tool (SCons/Tool/masm.py) which: (a) doesn't know 
about ml64.exe, unless that magically falls over (actually, it's set to 
invoke the compiler, not the assmbler directly), (b) hasn't changed 
materially since 2008, and (c) doesn't do anything to the conversion of 
CPPDEFINES to command-line output (namely, _CPPDEFFLAGS) - so if this 
fails for assembly, it should fail similarly with compilation of C/C++ 
code. Does it?

There *have* been changes to the special-case code of appending to 
CPPDEFINES - since that is something I worked on, I'll look into this, 
but at the moment I can't make this happen with just trivial evaluation:

env = Environment()
env.AppendUnique(
     CPPDEFINES=[
         'BOOST_ALL_NO_LIB=1',
         'BOOST_CHRONO_DYN_LINK=1',
         'BOOST_CONTEXT_DYN_LINK=1',
         'BOOST_CONTEXT_SOURCE',
         'BOOST_DISABLE_ASSERTS',
         'BOOST_THREAD_BUILD_DLL=1',
         'BOOST_THREAD_USE_DLL=1',
         'NDEBUG',
     ]
)
print(f"{env['CPPDEFINES']=}")
print(f"_CPPDEFFLAGS={env.subst('$_CPPDEFFLAGS')}")


...\test-append-defines>py -3.12 scripts/scons.py -Q
env['CPPDEFINES']=['BOOST_ALL_NO_LIB=1', 'BOOST_CHRONO_DYN_LINK=1', 
'BOOST_CONTEXT_DYN_LINK=1', 'BOOST_CONTEXT_SOURCE', 
'BOOST_DISABLE_ASSERTS', 'BOOST_THREAD_BUILD_DLL=1', 
'BOOST_THREAD_USE_DLL=1', 'NDEBUG']
_CPPDEFFLAGS=/DBOOST_ALL_NO_LIB=1 /DBOOST_CHRONO_DYN_LINK=1 
/DBOOST_CONTEXT_DYN_LINK=1 /DBOOST_CONTEXT_SOURCE 
/DBOOST_DISABLE_ASSERTS /DBOOST_THREAD_BUILD_DLL=1 
/DBOOST_THREAD_USE_DLL=1 /DNDEBUG
scons: `.' is up to date.


A small reproducer would therefore be really helpful...





More information about the Scons-users mailing list