From 540fd2f0e03f949842513a8fbb1ef86c33608fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20Aradi?= Date: Fri, 12 May 2017 14:34:19 +0200 Subject: [PATCH 1/3] Fix scanning of Fortran sources created during configuration --- mesonbuild/backend/ninjabackend.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 797fb6466..e5af9fdeb 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1693,12 +1693,13 @@ rule FORTRAN_DEP_HACK modre = re.compile(r"\s*module\s+(\w+)", re.IGNORECASE) module_files = {} for s in target.get_sources(): - # FIXME, does not work for generated Fortran sources, - # but those are really rare. I hope. + # FIXME, does not work for Fortran sources generated by + # custom_target() and generator() as those are run after + # the configuration (configure_file() is OK) if not compiler.can_compile(s): continue - filename = os.path.join(self.environment.get_source_dir(), - s.subdir, s.fname) + filename = s.absolute_path(self.environment.get_source_dir(), + self.environment.get_build_dir()) with open(filename) as f: for line in f: modmatch = modre.match(line) From 37ce7f01cf4392840a8d6652a3f0ecdff5974616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20Aradi?= Date: Fri, 12 May 2017 15:35:31 +0200 Subject: [PATCH 2/3] Add test for fortran dependency scanning fix --- test cases/fortran/7 generated/meson.build | 18 ++++++++++++++++++ test cases/fortran/7 generated/mod1.fpp | 6 ++++++ test cases/fortran/7 generated/mod2.fpp | 7 +++++++ 3 files changed, 31 insertions(+) create mode 100644 test cases/fortran/7 generated/meson.build create mode 100644 test cases/fortran/7 generated/mod1.fpp create mode 100644 test cases/fortran/7 generated/mod2.fpp diff --git a/test cases/fortran/7 generated/meson.build b/test cases/fortran/7 generated/meson.build new file mode 100644 index 000000000..3ad339e04 --- /dev/null +++ b/test cases/fortran/7 generated/meson.build @@ -0,0 +1,18 @@ +# Tests whether fortran sources files created during configuration are properly +# scanned for dependency information + +project('generated', 'fortran') + +conf_data = configuration_data() + +sources_fortran_basenames = ['mod2', 'mod1'] +preproc_sources_fortran = [] +foreach fsource_basename : sources_fortran_basenames + infilename = '@0@.fpp'.format(fsource_basename) + outfilename = '@0@.f90'.format(fsource_basename) + outfile = configure_file( + input : infilename, output : outfilename, configuration : conf_data) + preproc_sources_fortran += [outfile] +endforeach + +mylib = static_library('mylib', preproc_sources_fortran) diff --git a/test cases/fortran/7 generated/mod1.fpp b/test cases/fortran/7 generated/mod1.fpp new file mode 100644 index 000000000..c03ef1624 --- /dev/null +++ b/test cases/fortran/7 generated/mod1.fpp @@ -0,0 +1,6 @@ +module mod1 + implicit none + + integer, parameter :: modval1 = 1 + +end module mod1 diff --git a/test cases/fortran/7 generated/mod2.fpp b/test cases/fortran/7 generated/mod2.fpp new file mode 100644 index 000000000..eec931e59 --- /dev/null +++ b/test cases/fortran/7 generated/mod2.fpp @@ -0,0 +1,7 @@ +module mod2 + use mod1 + implicit none + + integer, parameter :: modval2 = 2 + +end module mod2 From 3d88ce70f46f4a39557fd58c24d126dc97dddb5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20Aradi?= Date: Sat, 13 May 2017 21:18:16 +0200 Subject: [PATCH 3/3] Turn feature test into a proper unit test --- test cases/fortran/7 generated/meson.build | 18 +++++++++++------- test cases/fortran/7 generated/mod1.fpp | 2 +- test cases/fortran/7 generated/mod2.fpp | 2 +- test cases/fortran/7 generated/prog.f90 | 9 +++++++++ 4 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 test cases/fortran/7 generated/prog.f90 diff --git a/test cases/fortran/7 generated/meson.build b/test cases/fortran/7 generated/meson.build index 3ad339e04..c2efe3413 100644 --- a/test cases/fortran/7 generated/meson.build +++ b/test cases/fortran/7 generated/meson.build @@ -4,15 +4,19 @@ project('generated', 'fortran') conf_data = configuration_data() +conf_data.set('ONE', 1) +conf_data.set('TWO', 2) -sources_fortran_basenames = ['mod2', 'mod1'] -preproc_sources_fortran = [] -foreach fsource_basename : sources_fortran_basenames - infilename = '@0@.fpp'.format(fsource_basename) - outfilename = '@0@.f90'.format(fsource_basename) +templates_basenames = ['mod2', 'mod1'] +generated_sources = [] +foreach template_basename : templates_basenames + infilename = '@0@.fpp'.format(template_basename) + outfilename = '@0@.f90'.format(template_basename) outfile = configure_file( input : infilename, output : outfilename, configuration : conf_data) - preproc_sources_fortran += [outfile] + generated_sources += [outfile] endforeach -mylib = static_library('mylib', preproc_sources_fortran) +sources = ['prog.f90'] + generated_sources +exe = executable('generated', sources) +test('generated', exe) diff --git a/test cases/fortran/7 generated/mod1.fpp b/test cases/fortran/7 generated/mod1.fpp index c03ef1624..42d1fde60 100644 --- a/test cases/fortran/7 generated/mod1.fpp +++ b/test cases/fortran/7 generated/mod1.fpp @@ -1,6 +1,6 @@ module mod1 implicit none - integer, parameter :: modval1 = 1 + integer, parameter :: modval1 = @ONE@ end module mod1 diff --git a/test cases/fortran/7 generated/mod2.fpp b/test cases/fortran/7 generated/mod2.fpp index eec931e59..594e9df6a 100644 --- a/test cases/fortran/7 generated/mod2.fpp +++ b/test cases/fortran/7 generated/mod2.fpp @@ -2,6 +2,6 @@ module mod2 use mod1 implicit none - integer, parameter :: modval2 = 2 + integer, parameter :: modval2 = @TWO@ end module mod2 diff --git a/test cases/fortran/7 generated/prog.f90 b/test cases/fortran/7 generated/prog.f90 new file mode 100644 index 000000000..c476e9c91 --- /dev/null +++ b/test cases/fortran/7 generated/prog.f90 @@ -0,0 +1,9 @@ +program prog + use mod2 + implicit none + + if (modval1 + modval2 /= 3) then + stop 1 + end if + +end program prog