Merge pull request #7689 from scivision/fortran_inc

correct Fortran include algorithm
pull/7671/head
Jussi Pakkanen 4 years ago committed by GitHub
commit 97177bc12a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      .github/workflows/unusedargs_missingreturn.yml
  2. 42
      mesonbuild/backend/ninjabackend.py
  3. 1
      test cases/fortran/15 include/include_hierarchy.f90
  4. 4
      test cases/fortran/15 include/include_syntax.f90
  5. 24
      test cases/fortran/15 include/include_tests.f90
  6. 13
      test cases/fortran/15 include/meson.build
  7. 4
      test cases/fortran/15 include/subprojects/cmake_inc/CMakeLists.txt
  8. 9
      test cases/fortran/15 include/subprojects/cmake_inc/main.f90
  9. 1
      test cases/fortran/15 include/subprojects/cmake_inc/thousand.f90

@ -4,6 +4,10 @@ name: UnusedMissingReturn
# * missing return values
# * strict prototypes
# some users have default configs that will needlessly fail Meson self-tests due to these syntax.
env:
CFLAGS: "-Werror=unused-parameter -Werror=return-type -Werror=strict-prototypes"
CPPFLAGS: "-Werror=unused-parameter -Werror=return-type"
FFLAGS: "-fimplicit-none"
on:
push:
@ -31,10 +35,10 @@ on:
jobs:
linux:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v1
- uses: actions/setup-python@v1
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install Compilers
@ -42,30 +46,19 @@ jobs:
sudo apt update -yq
sudo apt install -yq --no-install-recommends g++ gfortran ninja-build gobjc gobjc++
- run: python run_project_tests.py --only cmake common fortran platform-linux "objective c" "objective c++"
env:
CI: "1"
CFLAGS: "-Werror=unused-parameter -Werror=return-type -Werror=strict-prototypes"
CPPFLAGS: "-Werror=unused-parameter -Werror=return-type"
FFLAGS: "-fimplicit-none"
windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-python@v1
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.x'
# ninja==1.10 pypi release didn't ship with windows binaries, which causes
# pip to try to build it which fails on Windows. Pin the previous version
# for now. We can update once that's fixed.
# https://pypi.org/project/ninja/1.10.0/#files
- run: pip install ninja==1.9.0.post1 pefile
- run: pip install ninja pefile
- run: python run_project_tests.py --only platform-windows
env:
CI: "1"
CFLAGS: "-Werror=unused-parameter -Werror=return-type -Werror=strict-prototypes"
CPPFLAGS: "-Werror=unused-parameter -Werror=return-type"
FFLAGS: "-fimplicit-none"
CC: gcc
CXX: g++
FC: gfortran

@ -543,10 +543,10 @@ int dummy;
# rule store as being wanted in compdb
for for_machine in MachineChoice:
for lang in self.environment.coredata.compilers[for_machine]:
rules += [ "%s%s" % (rule, ext) for rule in [self.get_compiler_rule_name(lang, for_machine)]
for ext in ['', '_RSP']]
rules += [ "%s%s" % (rule, ext) for rule in [self.get_pch_rule_name(lang, for_machine)]
for ext in ['', '_RSP']]
rules += ["%s%s" % (rule, ext) for rule in [self.get_compiler_rule_name(lang, for_machine)]
for ext in ['', '_RSP']]
rules += ["%s%s" % (rule, ext) for rule in [self.get_pch_rule_name(lang, for_machine)]
for ext in ['', '_RSP']]
compdb_options = ['-x'] if mesonlib.version_compare(self.ninja_version, '>=1.9') else []
ninja_compdb = self.ninja_command + ['-t', 'compdb'] + compdb_options + rules
builddir = self.environment.get_build_dir()
@ -990,7 +990,7 @@ int dummy;
self.build.get_subproject_dir()),
self.environment.get_build_dir(),
self.environment.get_log_dir()] +
(['--use_llvm_cov'] if use_llvm_cov else []))
(['--use_llvm_cov'] if use_llvm_cov else []))
def generate_coverage_rules(self):
e = NinjaBuildElement(self.all_outputs, 'meson-coverage', 'CUSTOM_COMMAND', 'PHONY')
@ -1560,13 +1560,13 @@ int dummy;
self.get_target_dir(target))
else:
target_slashname_workaround_dir = self.get_target_dir(target)
(rpath_args, target.rpath_dirs_to_remove) = \
rustc.build_rpath_args(self.environment,
self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
target.build_rpath,
target.install_rpath)
rpath_args, target.rpath_dirs_to_remove = (
rustc.build_rpath_args(self.environment,
self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
target.build_rpath,
target.install_rpath))
# ... but then add rustc's sysroot to account for rustup
# installations
for rpath_arg in rpath_args:
@ -2777,13 +2777,13 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
self.get_target_dir(target))
else:
target_slashname_workaround_dir = self.get_target_dir(target)
(rpath_args, target.rpath_dirs_to_remove) = \
linker.build_rpath_args(self.environment,
self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
target.build_rpath,
target.install_rpath)
(rpath_args, target.rpath_dirs_to_remove) = (
linker.build_rpath_args(self.environment,
self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
target.build_rpath,
target.install_rpath))
commands += rpath_args
# Add libraries generated by custom targets
custom_target_libraries = self.get_custom_target_provided_libraries(target)
@ -3041,7 +3041,9 @@ def _scan_fortran_file_deps(src: Path, srcdir: Path, dirname: Path, tdeps, compi
# included files
incmatch = incre.match(line)
if incmatch is not None:
incfile = srcdir / incmatch.group(1)
incfile = src.parent / incmatch.group(1)
# NOTE: src.parent is most general, in particular for CMake subproject with Fortran file
# having an `include 'foo.f'` statement.
if incfile.suffix.lower()[1:] in compiler.file_suffixes:
mod_files.extend(_scan_fortran_file_deps(incfile, srcdir, dirname, tdeps, compiler))
# modules

@ -1,3 +1,4 @@
program test_include_hier
implicit none

@ -1,3 +1,5 @@
program test_include_syntax
implicit none
integer :: x, y
@ -20,4 +22,4 @@ if (x/=4) error stop 'failed on second include'
print *, 'OK: Fortran include tests: x=',x
end program
end program

@ -1,24 +0,0 @@
implicit none
integer :: x, y
x = 1
y = 0
! include "timestwo.f90"
! double quote and inline comment check
include "timestwo.f90" ! inline comment check
if (x/=2) error stop 'failed on first include'
! leading space and single quote check
include 'timestwo.f90'
if (x/=4) error stop 'failed on second include'
! Most Fortran compilers can't handle the non-standard #include,
! including (ha!) Flang, Gfortran, Ifort and PGI.
! #include "timestwo.f90"
print *, 'OK: Fortran include tests: x=',x
end program

@ -1,8 +1,19 @@
project('Inclusive', 'fortran',
meson_version: '>= 0.51.1')
cm = import('cmake')
hier_exe = executable('include_hierarchy', 'include_hierarchy.f90')
test('Fortran include file hierarchy', hier_exe)
syntax_exe = executable('include_syntax', 'include_syntax.f90')
test('Fortran include file syntax', syntax_exe)
test('Fortran include file syntax', syntax_exe)
# older CI runs into problems with too-old Ninja and CMake and Fortran
ninja_version = run_command('ninja', '--version').stdout().strip()
cmake_version = run_command('cmake', '--version').stdout().split()[2]
if ninja_version.version_compare('>=1.10.0') and cmake_version.version_compare('>=3.17.0')
cm.subproject('cmake_inc')
else
message('SKIP: CMake Fortran subproject with include. Ninja >= 1.10 and CMake >= 3.17 needed. You have Ninja ' + ninja_version + ' and CMake ' + cmake_version)
endif

@ -0,0 +1,4 @@
cmake_minimum_required(VERSION 3.17)
project(cmake_inc LANGUAGES Fortran)
add_executable(main main.f90)

@ -0,0 +1,9 @@
program test_subproject_inc
implicit none
include 'thousand.f90'
if (thousand /= 1000) error stop 'did not include properly'
end program
Loading…
Cancel
Save