aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-02-26 22:22:35 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2019-02-27 14:08:08 +0200
commit39e6dc58854d65938507afdcf5719c9e86f74af4 (patch)
treea0531049cdee1569fdd98d7ebbaa47cededd3198
parent97555cf6d97dbcdadd3851c996bd27a66bab1bfb (diff)
downloadmeson-39e6dc58854d65938507afdcf5719c9e86f74af4.zip
meson-39e6dc58854d65938507afdcf5719c9e86f74af4.tar.gz
meson-39e6dc58854d65938507afdcf5719c9e86f74af4.tar.bz2
correct Fortran self-dep logic
corrected, generalized self-referential Fortran fix further refine logic
-rw-r--r--mesonbuild/backend/ninjabackend.py28
-rw-r--r--test cases/fortran/4 self dependency/meson.build2
-rw-r--r--test cases/fortran/4 self dependency/subprojects/sub1/main.f906
-rw-r--r--test cases/fortran/4 self dependency/subprojects/sub1/meson.build3
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')