diff --git a/CHANGES.txt b/CHANGES.txt index b5df280824..ef17c1648f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -69,6 +69,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER and the code adjusted. All internal usage, including tests, was dont boolean-style anyway ("if Virtualenv():"). + From Edward Peek: + - Fix the variant dir component being missing from generated source file + paths with CompilationDatabase() builder (Fixes #4003). + RELEASE 4.9.1 - Thu, 27 Mar 2025 11:40:20 -0700 diff --git a/RELEASE.txt b/RELEASE.txt index c892409bbe..575609657b 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -46,6 +46,8 @@ FIXES setting against both enable & disable strings. (Fixes #4702) - MSVS: Fix significant slowdown initializing MSVC tools when vcpkg has been installed on the system. +- Fix the variant dir component being missing from generated source file + paths with CompilationDatabase() builder (Fixes #4003). IMPROVEMENTS ------------ diff --git a/SCons/Tool/compilation_db.py b/SCons/Tool/compilation_db.py index 2b1bfb56d9..9b253ce10c 100644 --- a/SCons/Tool/compilation_db.py +++ b/SCons/Tool/compilation_db.py @@ -156,11 +156,14 @@ def write_compilation_db(target, source, env) -> None: source_file = entry['file'] output_file = entry['output'] + if not source_file.is_derived(): + source_file = source_file.srcnode() + if use_abspath: - source_file = source_file.srcnode().abspath + source_file = source_file.abspath output_file = output_file.abspath else: - source_file = source_file.srcnode().path + source_file = source_file.path output_file = output_file.path if use_path_filter and not fnmatch.fnmatch(output_file, use_path_filter): diff --git a/test/CompilationDatabase/fixture/SConstruct_variant b/test/CompilationDatabase/fixture/SConstruct_variant index eaf19e809a..c70c5273be 100644 --- a/test/CompilationDatabase/fixture/SConstruct_variant +++ b/test/CompilationDatabase/fixture/SConstruct_variant @@ -46,3 +46,6 @@ env.Program('build/main', 'build/test_main.c') env.VariantDir('build2','src', duplicate=0) env.Program('build2/main', 'build2/test_main.c') +env.VariantDir('build3','src', duplicate=0) +env.InstallAs('build3/test_main_copy.c', 'src/test_main.c') +env.Program('build3/main', 'build3/test_main_copy.c') diff --git a/test/CompilationDatabase/variant_dir.py b/test/CompilationDatabase/variant_dir.py index 21eb78b922..b0441fa9cb 100644 --- a/test/CompilationDatabase/variant_dir.py +++ b/test/CompilationDatabase/variant_dir.py @@ -78,6 +78,12 @@ "directory": "%(workdir)s", "file": "%(src_file)s", "output": "%(output2_file)s" + }, + { + "command": "%(exe)s mygcc.py cc -o %(output3_file)s -c %(variant3_src_file)s", + "directory": "%(workdir)s", + "file": "%(variant3_src_file)s", + "output": "%(output3_file)s" } ] """ % {'exe': sys.executable, @@ -85,7 +91,9 @@ 'src_file': os.path.join('src', 'test_main.c'), 'output_file': os.path.join('build', 'test_main.o'), 'output2_file': os.path.join('build2', 'test_main.o'), - 'variant_src_file': os.path.join('build', 'test_main.c') + 'output3_file': os.path.join('build3', 'test_main_copy.o'), + 'variant_src_file': os.path.join('build', 'test_main.c'), + 'variant3_src_file': os.path.join('build3', 'test_main_copy.c') } if sys.platform == 'win32': @@ -108,6 +116,12 @@ "directory": "%(workdir)s", "file": "%(abs_src_file)s", "output": "%(abs_output2_file)s" + }, + { + "command": "%(exe)s mygcc.py cc -o %(output3_file)s -c %(variant3_src_file)s", + "directory": "%(workdir)s", + "file": "%(abs_variant3_src_file)s", + "output": "%(abs_output3_file)s" } ] """ % {'exe': sys.executable, @@ -116,9 +130,14 @@ 'abs_src_file': os.path.join(test.workdir, 'src', 'test_main.c'), 'abs_output_file': os.path.join(test.workdir, 'build', 'test_main.o'), 'abs_output2_file': os.path.join(test.workdir, 'build2', 'test_main.o'), + 'abs_output3_file': os.path.join(test.workdir, 'build3', 'test_main_copy.o'), 'output_file': os.path.join('build', 'test_main.o'), 'output2_file': os.path.join('build2', 'test_main.o'), - 'variant_src_file': os.path.join('build', 'test_main.c')} + 'output3_file': os.path.join('build3', 'test_main_copy.o'), + 'abs_variant3_src_file': os.path.join(test.workdir, 'build3', 'test_main_copy.c'), + 'variant_src_file': os.path.join('build', 'test_main.c'), + 'variant3_src_file': os.path.join('build3', 'test_main_copy.c') + } if sys.platform == 'win32': example_abs_file = example_abs_file.replace('\\', '\\\\')