aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fpm/src/fpm.f906
-rw-r--r--fpm/test/fpm_test/test_module_dependencies.f90106
2 files changed, 108 insertions, 4 deletions
diff --git a/fpm/src/fpm.f90 b/fpm/src/fpm.f90
index d58bd17..1d2b0ae 100644
--- a/fpm/src/fpm.f90
+++ b/fpm/src/fpm.f90
@@ -27,7 +27,7 @@ use, intrinsic :: iso_fortran_env, only: error_unit
implicit none
private
public :: cmd_build, cmd_run
-public :: build_model
+public :: build_model, check_modules_for_duplicates
contains
@@ -185,7 +185,7 @@ subroutine build_model(model, settings, package, error)
! Check for duplicate modules
call check_modules_for_duplicates(model, duplicates_found)
if (duplicates_found) then
- error stop
+ error stop 'Error: One or more duplicate module names found.'
end if
end subroutine build_model
@@ -220,7 +220,7 @@ subroutine check_modules_for_duplicates(model, duplicates_found)
if (allocated(model%packages(k)%sources(l)%modules_provided)) then
do m=1,size(model%packages(k)%sources(l)%modules_provided)
if (model%packages(k)%sources(l)%modules_provided(m)%s.in.modules(:modi-1)) then
- write(error_unit, *) "Warning: Module ",model%packages(k)%sources(l)%modules_provided(m)%s," is duplicate"
+ write(error_unit, *) "Warning: Module ",model%packages(k)%sources(l)%modules_provided(m)%s," is a duplicate"
duplicates_found = .true.
else
modules(modi) = model%packages(k)%sources(l)%modules_provided(m)
diff --git a/fpm/test/fpm_test/test_module_dependencies.f90 b/fpm/test/fpm_test/test_module_dependencies.f90
index 7f6c0be..fc580bc 100644
--- a/fpm/test/fpm_test/test_module_dependencies.f90
+++ b/fpm/test/fpm_test/test_module_dependencies.f90
@@ -10,6 +10,7 @@ module test_module_dependencies
FPM_UNIT_CHEADER, FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, &
FPM_SCOPE_DEP, FPM_SCOPE_APP, FPM_SCOPE_TEST
use fpm_strings, only: string_t, operator(.in.)
+ use fpm, only: check_modules_for_duplicates
implicit none
private
@@ -40,7 +41,17 @@ contains
& new_unittest("invalid-library-use", &
test_invalid_library_use, should_fail=.true.), &
& new_unittest("invalid-own-module-use", &
- test_invalid_own_module_use, should_fail=.true.) &
+ test_invalid_own_module_use, should_fail=.true.), &
+ & new_unittest("package-with-no-duplicates", &
+ test_package_with_no_module_duplicates), &
+ & new_unittest("package-with-duplicates-in-same-source", &
+ test_package_module_duplicates_same_source, should_fail=.true.), &
+ & new_unittest("package-with-duplicates-in-same-source", &
+ test_package_module_duplicates_same_source, should_fail=.true.), &
+ & new_unittest("package-with-duplicates-in-one-package", &
+ test_package_module_duplicates_one_package, should_fail=.true.), &
+ & new_unittest("package-with-duplicates-in-two-packages", &
+ test_package_module_duplicates_two_packages, should_fail=.true.) &
]
end subroutine collect_module_dependencies
@@ -392,6 +403,99 @@ contains
end subroutine test_invalid_own_module_use
+ !> Check program with no duplicate modules
+ subroutine test_package_with_no_module_duplicates(error)
+
+ type(error_t), allocatable, intent(out) :: error
+
+ type(fpm_model_t) :: model
+ logical :: duplicates_found
+
+ allocate(model%packages(1))
+ allocate(model%packages(1)%sources(2))
+
+ model%packages(1)%sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="src/my_mod_1.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1')])
+
+ model%packages(1)%sources(2) = new_test_source(FPM_UNIT_MODULE,file_name="src/my_mod_2.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_2')])
+
+ call check_modules_for_duplicates(model, duplicates_found)
+ if (duplicates_found) then
+ call test_failed(error,'Duplicate modules found')
+ return
+ end if
+ end subroutine test_package_with_no_module_duplicates
+
+ !> Check program with duplicate modules in same source file
+ subroutine test_package_module_duplicates_same_source(error)
+
+ type(error_t), allocatable, intent(out) :: error
+
+ type(fpm_model_t) :: model
+ logical :: duplicates_found
+
+ allocate(model%packages(1))
+ allocate(model%packages(1)%sources(1))
+
+ model%packages(1)%sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="src/my_mod_1.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1'), string_t('my_mod_1')])
+
+ call check_modules_for_duplicates(model, duplicates_found)
+ if (duplicates_found) then
+ call test_failed(error,'Duplicate modules found')
+ return
+ end if
+ end subroutine test_package_module_duplicates_same_source
+
+ !> Check program with duplicate modules in two different source files in one package
+ subroutine test_package_module_duplicates_one_package(error)
+
+ type(error_t), allocatable, intent(out) :: error
+
+ type(fpm_model_t) :: model
+ logical :: duplicates_found
+
+ allocate(model%packages(1))
+ allocate(model%packages(1)%sources(2))
+
+ model%packages(1)%sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="src/my_mod_1_a.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1')])
+
+ model%packages(1)%sources(2) = new_test_source(FPM_UNIT_MODULE,file_name="src/my_mod_1_b.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1')])
+
+ call check_modules_for_duplicates(model, duplicates_found)
+ if (duplicates_found) then
+ call test_failed(error,'Duplicate modules found')
+ return
+ end if
+ end subroutine test_package_module_duplicates_one_package
+
+ !> Check program with duplicate modules in two different packages
+ subroutine test_package_module_duplicates_two_packages(error)
+
+ type(error_t), allocatable, intent(out) :: error
+
+ type(fpm_model_t) :: model
+ logical :: duplicates_found
+
+ allocate(model%packages(2))
+ allocate(model%packages(1)%sources(1))
+ allocate(model%packages(2)%sources(1))
+
+ model%packages(1)%sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="src/subdir1/my_mod_1.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1')])
+
+ model%packages(2)%sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="src/subdir2/my_mod_1.f90", &
+ scope = FPM_SCOPE_LIB, provides=[string_t('my_mod_1')])
+
+ call check_modules_for_duplicates(model, duplicates_found)
+ if (duplicates_found) then
+ call test_failed(error,'Duplicate modules found')
+ return
+ end if
+ end subroutine test_package_module_duplicates_two_packages
!> Helper to create a new srcfile_t
function new_test_source(type,file_name, scope, uses, provides) result(src)