From 38655bb5d62f72519684218dc45a727886cbc9bb Mon Sep 17 00:00:00 2001 From: William Deegan Date: Mon, 19 Jun 2023 23:39:04 +0000 Subject: Clean up and simplify logic. TODO: scons -c isn't removing the .di files. Mainly these changes only work for dmd at present --- SCons/Defaults.py | 3 +++ SCons/Tool/DCommon.py | 14 ++++++++------ SCons/Tool/DCommon.xml | 5 ++--- SCons/Tool/default.xml | 5 ++--- SCons/Tool/dmd.py | 10 +++++++--- SCons/Tool/ldc.py | 9 +++++++-- test/D/di/Image/SConstruct_template | 15 ++++++++++----- 7 files changed, 39 insertions(+), 22 deletions(-) diff --git a/SCons/Defaults.py b/SCons/Defaults.py index 15041a5..a680cb4 100644 --- a/SCons/Defaults.py +++ b/SCons/Defaults.py @@ -677,6 +677,9 @@ def __lib_either_version_flag(env, version_var1, version_var2, flags_var): return None + + + ConstructionEnvironment = { 'BUILDERS': {}, 'SCANNERS': [SCons.Tool.SourceFileScanner], diff --git a/SCons/Tool/DCommon.py b/SCons/Tool/DCommon.py index b4c5d85..d0c07a3 100644 --- a/SCons/Tool/DCommon.py +++ b/SCons/Tool/DCommon.py @@ -58,12 +58,14 @@ def allAtOnceEmitter(target, source, env): return target, source def DObjectEmitter(target,source,env): - if "DINTFDIR" in env and len(env["DINTFDIR"]): - if (len(target) != 1): - raise Exception("expect only one object target") - targetBase, targetName = os.path.split(SCons.Util.to_String(target[0])) - extraTarget = os.path.join(targetBase,str(env["DINTFDIR"]),targetName[:-len(env["OBJSUFFIX"])] + env["DIFILESUFFIX"]) - target.append(extraTarget) + di_file_dir = env.get('DI_FILE_DIR', False) + # TODO: Verify sane DI_FILE_DIR? + if di_file_dir: + di_file_suffix = env.subst('$DI_FILE_SUFFIX', target=target, source=source) + file_base = os.path.basename(target[0].get_path()) + # print(f'DObjectEmitter: {di_file_dir}/*{file_base}*{di_file_suffix}') + target.append(env.fs.File(f"{file_base}{di_file_suffix}", di_file_dir)) + # print("New Target:%s"%" ".join([str(t) for t in target])) return (target,source) def DStaticObjectEmitter(target,source,env): diff --git a/SCons/Tool/DCommon.xml b/SCons/Tool/DCommon.xml index 636329c..6b4ebf1 100644 --- a/SCons/Tool/DCommon.xml +++ b/SCons/Tool/DCommon.xml @@ -1,9 +1,8 @@ None: env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = '${_concat(DINTFDIRPREFIX, DINTFDIR, DINTFDIRSUFFIX, __env__, Dirs, TARGET, SOURCE)}' + + env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" + env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' @@ -105,7 +107,6 @@ def generate(env) -> None: env['DFLAGS'] = [] env['DVERSIONS'] = [] env['DDEBUG'] = [] - env['DINTFDIR'] = [] if env['DC']: DCommon.addDPATHToEnv(env, env['DC']) @@ -119,7 +120,10 @@ def generate(env) -> None: env['DFLAGPREFIX'] = '-' env['DFLAGSUFFIX'] = '' env['DFILESUFFIX'] = '.d' - env['DIFILESUFFIX'] = '.di' + + env['DI_FILE_DIR'] = '' + env['DI_FILE_SUFFIX'] = '.di' + env['DINTFDIRPREFIX'] = '-Hd=' env['DINTFDIRSUFFIX'] = '' diff --git a/SCons/Tool/ldc.py b/SCons/Tool/ldc.py index 8d9f920..9fe4343 100644 --- a/SCons/Tool/ldc.py +++ b/SCons/Tool/ldc.py @@ -71,7 +71,9 @@ def generate(env) -> None: env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = '${_concat(DINTFDIRPREFIX, DINTFDIR, DINTFDIRSUFFIX, __env__, Dirs, TARGET, SOURCE)}' + + env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" + env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' @@ -95,7 +97,10 @@ def generate(env) -> None: env['DFLAGPREFIX'] = '-' env['DFLAGSUFFIX'] = '' env['DFILESUFFIX'] = '.d' - env['DIFILESUFFIX'] = '.di' + + env['DI_FILE_DIR'] = '' + env['DI_FILE_SUFFIX'] = '.di' + env['DINTFDIRPREFIX'] = '-Hd=' env['DINTFDIRSUFFIX'] = '' diff --git a/test/D/di/Image/SConstruct_template b/test/D/di/Image/SConstruct_template index bd33320..d734329 100644 --- a/test/D/di/Image/SConstruct_template +++ b/test/D/di/Image/SConstruct_template @@ -4,11 +4,16 @@ import os DefaultEnvironment(tools=[]) -environment = Environment( - tools=['link','ar' ,'{}'] +env = Environment( + tools=['link','ar' ,'{}'], + DPATH=['include'], + DI_FILE_DIR='include' ) -o1 = environment.Object('source/helloWorld.d',DINTFDIR = "../include")[0] -o2 = environment.Object('helloWorldMain.d',DPATH="include") -environment.Program('hw', [o2,o1]) +# o1 = env.Object('source/helloWorld.d') +# o2 = env.Object('helloWorldMain.d') +# env.Program('hw', [o1[0], o2[0]]) + +# Alternatively +env.Program('hw', ['helloWorldMain.d','source/helloWorld.d']) -- cgit v0.12 From aa2d2d3dab51a472dee8742e6e133c38a078144c Mon Sep 17 00:00:00 2001 From: William Deegan Date: Tue, 20 Jun 2023 16:09:35 +0000 Subject: Switch D Scanner logic to prefer .di over .d when satisfying includes per https://dlang.org/dmd-linux.html#interface-files --- SCons/Scanner/D.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SCons/Scanner/D.py b/SCons/Scanner/D.py index 9bc608f..fbb2894 100644 --- a/SCons/Scanner/D.py +++ b/SCons/Scanner/D.py @@ -48,9 +48,11 @@ class D(Classic): # translate dots (package separators) to slashes inc = include.replace('.', '/') - i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path) + # According to https://dlang.org/dmd-linux.html#interface-files + # Prefer .di files over .d files when processing includes(imports) + i = SCons.Node.FS.find_file(inc + '.di', (source_dir,) + path) if i is None: - i = SCons.Node.FS.find_file(inc + '.di', (source_dir,) + path) + i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path) return i, include def find_include_names(self, node): -- cgit v0.12 From ab642d1295eb4d350404f4402387c166c8f60894 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Tue, 20 Jun 2023 16:10:13 +0000 Subject: Use pathlib to get file stem to build D interface filename. Add new DINTFOR and variables to gdc --- SCons/Tool/DCommon.py | 4 ++-- SCons/Tool/gdc.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/SCons/Tool/DCommon.py b/SCons/Tool/DCommon.py index d0c07a3..3cd3dab 100644 --- a/SCons/Tool/DCommon.py +++ b/SCons/Tool/DCommon.py @@ -29,8 +29,8 @@ Coded by Russel Winder (russel@winder.org.uk) 2012-09-06 """ +from pathlib import Path import os.path -import SCons.Util def isD(env, source) -> int: if not source: @@ -62,7 +62,7 @@ def DObjectEmitter(target,source,env): # TODO: Verify sane DI_FILE_DIR? if di_file_dir: di_file_suffix = env.subst('$DI_FILE_SUFFIX', target=target, source=source) - file_base = os.path.basename(target[0].get_path()) + file_base = Path(target[0].get_path()).stem # print(f'DObjectEmitter: {di_file_dir}/*{file_base}*{di_file_suffix}') target.append(env.fs.File(f"{file_base}{di_file_suffix}", di_file_dir)) # print("New Target:%s"%" ".join([str(t) for t in target])) diff --git a/SCons/Tool/gdc.py b/SCons/Tool/gdc.py index e0f9888..4a99edc 100644 --- a/SCons/Tool/gdc.py +++ b/SCons/Tool/gdc.py @@ -67,7 +67,7 @@ def generate(env) -> None: env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = '${_concat(DINTFDIRPREFIX, DINTFDIR, DINTFDIRSUFFIX, __env__, Dirs, TARGET, SOURCE)}' + env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' @@ -91,7 +91,8 @@ def generate(env) -> None: env['DFLAGPREFIX'] = '-' env['DFLAGSUFFIX'] = '' env['DFILESUFFIX'] = '.d' - env['DIFILESUFFIX'] = '.di' + env['DI_FILE_DIR'] = '' + env['DI_FILE_SUFFIX'] = '.di' env['DINTFDIRPREFIX'] = '-Hd' env['DINTFDIRSUFFIX'] = '' -- cgit v0.12 From 966dddf8631d77adcaaca4ba6dc37082368647a4 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Tue, 20 Jun 2023 16:19:57 +0000 Subject: changed new vars to be DI_FILE_* instead of DINTF*. Updated docs, changes, release --- RELEASE.txt | 6 ++++-- SCons/Tool/DCommon.xml | 8 ++++---- SCons/Tool/dmd.py | 10 +++++----- SCons/Tool/gdc.py | 12 ++++++------ SCons/Tool/ldc.py | 11 +++++------ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index b6ab921..ce05c11 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -16,8 +16,10 @@ Here is a summary of the changes since 4.5.2: NEW FUNCTIONALITY ----------------- -- D compilers : added support for generation of .di interface files - +- D compilers : added support for generation of .di interface files. + New variables DI_FILE_DIR, DI_FILE_DIR_PREFIX, DI_FILE_DIR_SUFFIX, + DI_FILE_SUFFIX. + DEPRECATED FUNCTIONALITY ------------------------ diff --git a/SCons/Tool/DCommon.xml b/SCons/Tool/DCommon.xml index 6b4ebf1..80b0b15 100644 --- a/SCons/Tool/DCommon.xml +++ b/SCons/Tool/DCommon.xml @@ -349,7 +349,7 @@ See also &cv-link-DLINKFLAGS; for linking static objects. - + Suffix of d include files default is .di @@ -357,7 +357,7 @@ Suffix of d include files default is .di - + Path where .di files will be generated @@ -365,7 +365,7 @@ Path where .di files will be generated - + Prefix to send the di path argument to compiler @@ -373,7 +373,7 @@ Prefix to send the di path argument to compiler - + Suffix to send the di path argument to compiler diff --git a/SCons/Tool/dmd.py b/SCons/Tool/dmd.py index c61e503..c3ac0ca 100644 --- a/SCons/Tool/dmd.py +++ b/SCons/Tool/dmd.py @@ -91,17 +91,17 @@ def generate(env) -> None: shared_obj.add_emitter('.d', DCommon.DSharedObjectEmitter) env['DC'] = env.Detect(['dmd', 'ldmd2', 'gdmd']) or 'dmd' - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -c -of$TARGET $SOURCES' + env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -of$TARGET $SOURCES' env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" + env['_DI_FLAGS'] = "${DI_FILE_DIR and DI_FILE_DIR_PREFIX+DI_FILE_DIR+DI_FILE_DIR_SUFFFIX}" env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' - env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -c -fPIC -of$TARGET $SOURCES' + env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -fPIC -of$TARGET $SOURCES' env['DPATH'] = ['#/'] env['DFLAGS'] = [] @@ -124,8 +124,8 @@ def generate(env) -> None: env['DI_FILE_DIR'] = '' env['DI_FILE_SUFFIX'] = '.di' - env['DINTFDIRPREFIX'] = '-Hd=' - env['DINTFDIRSUFFIX'] = '' + env['DI_FILE_DIR_PREFIX'] = '-Hd=' + env['DI_FILE_DIR_SUFFFIX'] = '' env['DLINK'] = '$DC' env['DLINKFLAGS'] = SCons.Util.CLVar('') diff --git a/SCons/Tool/gdc.py b/SCons/Tool/gdc.py index 4a99edc..9f29d72 100644 --- a/SCons/Tool/gdc.py +++ b/SCons/Tool/gdc.py @@ -63,21 +63,20 @@ def generate(env) -> None: shared_obj.add_emitter('.d', DCommon.DSharedObjectEmitter) env['DC'] = env.Detect('gdc') or 'gdc' - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -c -o $TARGET $SOURCES' + env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -o $TARGET $SOURCES' env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" + env['_DI_FLAGS'] = "${DI_FILE_DIR and DI_FILE_DIR_PREFIX+DI_FILE_DIR+DI_FILE_DIR_SUFFFIX}" env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' - env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -fPIC -c -o $TARGET $SOURCES' + env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -fPIC -c -o $TARGET $SOURCES' env['DPATH'] = ['#/'] env['DFLAGS'] = [] env['DVERSIONS'] = [] env['DDEBUG'] = [] - env['DINTFDIR'] = [] if env['DC']: DCommon.addDPATHToEnv(env, env['DC']) @@ -91,10 +90,11 @@ def generate(env) -> None: env['DFLAGPREFIX'] = '-' env['DFLAGSUFFIX'] = '' env['DFILESUFFIX'] = '.d' + env['DI_FILE_DIR'] = '' env['DI_FILE_SUFFIX'] = '.di' - env['DINTFDIRPREFIX'] = '-Hd' - env['DINTFDIRSUFFIX'] = '' + env['DI_FILE_DIR_PREFIX'] = '-Hd' + env['DI_FILE_DIR_SUFFFIX'] = '' env['DLINK'] = '$DC' env['DLINKFLAGS'] = SCons.Util.CLVar('') diff --git a/SCons/Tool/ldc.py b/SCons/Tool/ldc.py index 9fe4343..5fb6070 100644 --- a/SCons/Tool/ldc.py +++ b/SCons/Tool/ldc.py @@ -67,23 +67,22 @@ def generate(env) -> None: shared_obj.add_emitter('.d', DCommon.DSharedObjectEmitter) env['DC'] = env.Detect('ldc2') or 'ldc2' - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -c -of=$TARGET $SOURCES' + env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -of=$TARGET $SOURCES' env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}' env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}' env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}' - env['_DINTFDIR'] = "${DI_FILE_DIR and DINTFDIRPREFIX+DI_FILE_DIR+DINTFDIRSUFFIX}" + env['_DI_FLAGS'] = "${DI_FILE_DIR and DI_FILE_DIR_PREFIX+DI_FILE_DIR+DI_FILE_DIR_SUFFFIX}" env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}' env['SHDC'] = '$DC' - env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DINTFDIR -c -relocation-model=pic -of=$TARGET $SOURCES' + env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS $_DI_FLAGS -c -relocation-model=pic -of=$TARGET $SOURCES' env['DPATH'] = ['#/'] env['DFLAGS'] = [] env['DVERSIONS'] = [] env['DDEBUG'] = [] - env['DINTFDIR'] = [] if env['DC']: DCommon.addDPATHToEnv(env, env['DC']) @@ -101,8 +100,8 @@ def generate(env) -> None: env['DI_FILE_DIR'] = '' env['DI_FILE_SUFFIX'] = '.di' - env['DINTFDIRPREFIX'] = '-Hd=' - env['DINTFDIRSUFFIX'] = '' + env['DI_FILE_DIR_PREFIX'] = '-Hd=' + env['DI_FILE_DIR_SUFFFIX'] = '' env['DLINK'] = '$DC' env['DLINKFLAGS'] = SCons.Util.CLVar('') -- cgit v0.12 From 4f362a0e2c52c96c5f637492bfcc7d4a1ca7ee11 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Tue, 20 Jun 2023 17:28:42 +0000 Subject: [ci skip] CHANGES.txt added new variables to blurb --- CHANGES.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 9c773bb..7d17c3e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -34,7 +34,9 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER a .py extension to open a file that is not an absolute path. - SCons test runner now uses pathlib to normalize and compare paths to test files. - - D compilers : added support for generation of .di interface files + - D compilers : added support for generation of .di interface files. + New variables DI_FILE_DIR, DI_FILE_DIR_PREFIX, DI_FILE_DIR_SUFFIX, + DI_FILE_SUFFIX. - Fixed: when using the mingw tool, if an msys2 Python is used (os.sep is '/' rather than the Windows default '\'), certain Configure checks could fail due to the construction of the path to run the compiled check. -- cgit v0.12