diff options
9 files changed, 64 insertions, 65 deletions
diff --git a/.github/workflows/unusedargs_missingreturn.yml b/.github/workflows/unusedargs_missingreturn.yml index 859dec2..3e82568 100644 --- a/.github/workflows/unusedargs_missingreturn.yml +++ b/.github/workflows/unusedargs_missingreturn.yml @@ -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 diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 7846b0d..9004165 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -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 diff --git a/test cases/fortran/15 include/include_hierarchy.f90 b/test cases/fortran/15 include/include_hierarchy.f90 index 661aa62..0598d87 100644 --- a/test cases/fortran/15 include/include_hierarchy.f90 +++ b/test cases/fortran/15 include/include_hierarchy.f90 @@ -1,3 +1,4 @@ +program test_include_hier implicit none diff --git a/test cases/fortran/15 include/include_syntax.f90 b/test cases/fortran/15 include/include_syntax.f90 index d35e0ce..5f7eb9f 100644 --- a/test cases/fortran/15 include/include_syntax.f90 +++ b/test cases/fortran/15 include/include_syntax.f90 @@ -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
\ No newline at end of file +end program diff --git a/test cases/fortran/15 include/include_tests.f90 b/test cases/fortran/15 include/include_tests.f90 deleted file mode 100644 index 56e4619..0000000 --- a/test cases/fortran/15 include/include_tests.f90 +++ /dev/null @@ -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
\ No newline at end of file diff --git a/test cases/fortran/15 include/meson.build b/test cases/fortran/15 include/meson.build index 2196d13..6ba0afa 100644 --- a/test cases/fortran/15 include/meson.build +++ b/test cases/fortran/15 include/meson.build @@ -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)
\ No newline at end of file +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 diff --git a/test cases/fortran/15 include/subprojects/cmake_inc/CMakeLists.txt b/test cases/fortran/15 include/subprojects/cmake_inc/CMakeLists.txt new file mode 100644 index 0000000..1ffe882 --- /dev/null +++ b/test cases/fortran/15 include/subprojects/cmake_inc/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.17) +project(cmake_inc LANGUAGES Fortran) + +add_executable(main main.f90) diff --git a/test cases/fortran/15 include/subprojects/cmake_inc/main.f90 b/test cases/fortran/15 include/subprojects/cmake_inc/main.f90 new file mode 100644 index 0000000..dd2991d --- /dev/null +++ b/test cases/fortran/15 include/subprojects/cmake_inc/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 diff --git a/test cases/fortran/15 include/subprojects/cmake_inc/thousand.f90 b/test cases/fortran/15 include/subprojects/cmake_inc/thousand.f90 new file mode 100644 index 0000000..08a4048 --- /dev/null +++ b/test cases/fortran/15 include/subprojects/cmake_inc/thousand.f90 @@ -0,0 +1 @@ +integer, parameter :: thousand = 1000 |