diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 9f9574d6a..d69019b29 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -38,7 +38,10 @@ from ..mesonlib import get_compiler_for_source, has_path_sep from .backends import CleanTrees from ..build import InvalidArguments -FORTRAN_SUBMOD_PAT = r"\s*submodule\s*\((\w+:?\w+)\)\s*(\w+)\s*$" +FORTRAN_INCLUDE_PAT = r"#?include\s*['\"](\w+\.\w+)['\"]" +FORTRAN_MODULE_PAT = r"\s*\bmodule\b\s+(?!procedure)(\w+)" +FORTRAN_SUBMOD_PAT = r"\s*submodule\s*\((\w+:?\w+)\)\s*(\w+)" +FORTRAN_USE_PAT = r"\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)" if mesonlib.is_windows(): quote_func = lambda s: '"{}"'.format(s) @@ -1820,7 +1823,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) self.fortran_deps[target.get_basename()] = {} return - modre = re.compile(r"\s*\bmodule\b\s+(\w+)\s*$", re.IGNORECASE) + modre = re.compile(FORTRAN_MODULE_PAT, re.IGNORECASE) submodre = re.compile(FORTRAN_SUBMOD_PAT, re.IGNORECASE) module_files = {} submodule_files = {} @@ -1860,7 +1863,7 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) self.fortran_deps[target.get_basename()] = {**module_files, **submodule_files} - def get_fortran_deps(self, compiler: FortranCompiler, src: str, target) -> List[str]: + def get_fortran_deps(self, compiler: FortranCompiler, src: Path, target) -> List[str]: """ Find all module and submodule needed by a Fortran target """ @@ -2750,7 +2753,7 @@ def load(build_dir): return obj -def _scan_fortran_file_deps(src: str, srcdir: Path, dirname: Path, tdeps, compiler) -> List[str]: +def _scan_fortran_file_deps(src: Path, srcdir: Path, dirname: Path, tdeps, compiler) -> List[str]: """ scan a Fortran file for dependencies. Needs to be distinct from target to allow for recursion induced by `include` statements.er @@ -2767,8 +2770,8 @@ def _scan_fortran_file_deps(src: str, srcdir: Path, dirname: Path, tdeps, compil * `submodre` is for Fortran >= 2008 `submodule` """ - incre = re.compile(r"#?include\s*['\"](\w+\.\w+)['\"]\s*$", re.IGNORECASE) - usere = re.compile(r"\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)", re.IGNORECASE) + incre = re.compile(FORTRAN_INCLUDE_PAT, re.IGNORECASE) + usere = re.compile(FORTRAN_USE_PAT, re.IGNORECASE) submodre = re.compile(FORTRAN_SUBMOD_PAT, re.IGNORECASE) mod_files = [] @@ -2816,7 +2819,7 @@ def _scan_fortran_file_deps(src: str, srcdir: Path, dirname: Path, tdeps, compil parents = submodmatch.group(1).lower().split(':') assert len(parents) in (1, 2), ( 'submodule ancestry must be specified as' - ' ancestor:parent but Meson found {}'.parents) + ' ancestor:parent but Meson found {}'.format(parents)) ancestor_child = '_'.join(parents) if ancestor_child not in tdeps: diff --git a/test cases/fortran/12 submodule/a3.f90 b/test cases/fortran/12 submodule/a3.f90 index d6929b0c6..21aa3555a 100644 --- a/test cases/fortran/12 submodule/a3.f90 +++ b/test cases/fortran/12 submodule/a3.f90 @@ -1,4 +1,4 @@ -submodule (a1:a2) a3 +submodule (a1:a2) a3 ! testing inline comment contains diff --git a/test cases/fortran/15 include/inc1.f90 b/test cases/fortran/15 include/inc1.f90 index 0aec9ba25..163f5864b 100644 --- a/test cases/fortran/15 include/inc1.f90 +++ b/test cases/fortran/15 include/inc1.f90 @@ -2,4 +2,4 @@ real :: pi = 4.*atan(1.) real :: tau -include "inc2.f90" +include "inc2.f90" ! testing inline comment diff --git a/test cases/fortran/2 modules/comment_mod.f90 b/test cases/fortran/2 modules/comment_mod.f90 new file mode 100644 index 000000000..917f6be9a --- /dev/null +++ b/test cases/fortran/2 modules/comment_mod.f90 @@ -0,0 +1,6 @@ +module line ! inline comment +implicit none + +real :: length + +end module line diff --git a/test cases/fortran/2 modules/meson.build b/test cases/fortran/2 modules/meson.build index 030f25598..fb58b9db4 100644 --- a/test cases/fortran/2 modules/meson.build +++ b/test cases/fortran/2 modules/meson.build @@ -1,4 +1,7 @@ project('modules', 'fortran') -e = executable('modprog', 'stuff.f90', 'prog.f90') +commented = library('commented', 'comment_mod.f90') + +e = executable('modprog', 'mymod.f90', 'prog.f90', + link_with: commented) test('moduletest', e) diff --git a/test cases/fortran/2 modules/mymod.f90 b/test cases/fortran/2 modules/mymod.f90 new file mode 100644 index 000000000..f8e7929ed --- /dev/null +++ b/test cases/fortran/2 modules/mymod.f90 @@ -0,0 +1,6 @@ +module circle +implicit none + +real, parameter :: pi = 4.*atan(1.) +real :: radius +end module circle diff --git a/test cases/fortran/2 modules/prog.f90 b/test cases/fortran/2 modules/prog.f90 index c3998cc5e..93b310f58 100644 --- a/test cases/fortran/2 modules/prog.f90 +++ b/test cases/fortran/2 modules/prog.f90 @@ -1,7 +1,11 @@ -PROGRAM prog +use circle, only: pi +use line, only: length +implicit none -use Circle -IMPLICIT NONE +print *,'pi=',pi -END PROGRAM prog +length = pi +print *, length + +end program diff --git a/test cases/fortran/2 modules/stuff.f90 b/test cases/fortran/2 modules/stuff.f90 deleted file mode 100644 index 4a6399bb6..000000000 --- a/test cases/fortran/2 modules/stuff.f90 +++ /dev/null @@ -1,5 +0,0 @@ -MODULE Circle - REAL, PARAMETER :: Pi = 3.1415927 - REAL :: radius -END MODULE Circle - diff --git a/test cases/fortran/8 module names/test.f90 b/test cases/fortran/8 module names/test.f90 index 28847fb5f..756a163e3 100644 --- a/test cases/fortran/8 module names/test.f90 +++ b/test cases/fortran/8 module names/test.f90 @@ -1,5 +1,5 @@ use mymod1 -use MyMod2 +use MyMod2 ! test inline comment implicit none