diff options
author | Michael Hirsch, Ph.D <scivision@users.noreply.github.com> | 2019-02-26 22:22:35 -0500 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2019-02-27 14:08:08 +0200 |
commit | 39e6dc58854d65938507afdcf5719c9e86f74af4 (patch) | |
tree | a0531049cdee1569fdd98d7ebbaa47cededd3198 | |
parent | 97555cf6d97dbcdadd3851c996bd27a66bab1bfb (diff) | |
download | meson-39e6dc58854d65938507afdcf5719c9e86f74af4.zip meson-39e6dc58854d65938507afdcf5719c9e86f74af4.tar.gz meson-39e6dc58854d65938507afdcf5719c9e86f74af4.tar.bz2 |
correct Fortran self-dep logic
corrected, generalized self-referential Fortran fix
further refine logic
4 files changed, 26 insertions, 13 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 0a1681f..5958af8 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1874,15 +1874,14 @@ rule FORTRAN_DEP_HACK%s # a common occurrence, which would lead to lots of # distracting noise. continue - mod_source_file = tdeps[usename] - # Check if a source uses a module it exports itself. - # Potential bug if multiple targets have a file with - # the same name. - try: - if (srcdir / mod_source_file.fname).samefile(src): + srcfile = srcdir / tdeps[usename].fname + if not srcfile.is_file(): + if srcfile.name != src.name: # generated source file + pass + else: # subproject continue - except FileNotFoundError: - pass + elif srcfile.samefile(src): # self-reference + continue mod_name = compiler.module_name_to_filename(usename) mod_files.append(str(dirname / mod_name)) @@ -1896,12 +1895,14 @@ rule FORTRAN_DEP_HACK%s for parent in parents: if parent not in tdeps: raise MesonException("submodule {} relies on parent module {} that was not found.".format(submodmatch.group(2).lower(), parent)) - - try: - if (srcdir / tdeps[parent].fname).samefile(src): + submodsrcfile = srcdir / tdeps[parent].fname + if not submodsrcfile.is_file(): + if submodsrcfile.name != src.name: # generated source file + pass + else: # subproject continue - except FileNotFoundError: - pass + elif submodsrcfile.samefile(src): # self-reference + continue mod_name = compiler.module_name_to_filename(parent) mod_files.append(str(dirname / mod_name)) @@ -2198,6 +2199,7 @@ rule FORTRAN_DEP_HACK%s for modname, srcfile in self.fortran_deps[target.get_basename()].items(): modfile = os.path.join(self.get_target_private_dir(target), compiler.module_name_to_filename(modname)) + if srcfile == src: depelem = NinjaBuildElement(self.all_outputs, modfile, 'FORTRAN_DEP_HACK' + crstr, rel_obj) depelem.write(outfile) diff --git a/test cases/fortran/4 self dependency/meson.build b/test cases/fortran/4 self dependency/meson.build index 8eef4eb..e791284 100644 --- a/test cases/fortran/4 self dependency/meson.build +++ b/test cases/fortran/4 self dependency/meson.build @@ -4,3 +4,5 @@ e = executable('selfdep', 'selfdep.f90') test('selfdep', e) library('selfmod', 'src/selfdep_mod.f90') + +subproject('sub1') diff --git a/test cases/fortran/4 self dependency/subprojects/sub1/main.f90 b/test cases/fortran/4 self dependency/subprojects/sub1/main.f90 new file mode 100644 index 0000000..873427d --- /dev/null +++ b/test cases/fortran/4 self dependency/subprojects/sub1/main.f90 @@ -0,0 +1,6 @@ +module a +end + +program b + use a +end diff --git a/test cases/fortran/4 self dependency/subprojects/sub1/meson.build b/test cases/fortran/4 self dependency/subprojects/sub1/meson.build new file mode 100644 index 0000000..606f338 --- /dev/null +++ b/test cases/fortran/4 self dependency/subprojects/sub1/meson.build @@ -0,0 +1,3 @@ +project('subproject self-def', 'fortran') + +library('subself', 'main.f90') |