Skip to content

Commit 0d6a0c5

Browse files
committed
Update: dependency tests for updated resolve_target_linking
Add checks on the link object lists built for archives and executables in 'resolve_target_linking'
1 parent f63a416 commit 0d6a0c5

File tree

1 file changed

+66
-18
lines changed

1 file changed

+66
-18
lines changed

fpm/test/fpm_test/test_module_dependencies.f90

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
!> Define tests for the `fpm_sources` module (module dependency checking)
22
module test_module_dependencies
33
use testsuite, only : new_unittest, unittest_t, error_t, test_failed
4-
use fpm_targets, only: targets_from_sources, resolve_module_dependencies
4+
use fpm_targets, only: targets_from_sources, resolve_module_dependencies, &
5+
resolve_target_linking
56
use fpm_model, only: fpm_model_t, srcfile_t, build_target_t, build_target_ptr, &
67
FPM_UNIT_UNKNOWN, FPM_UNIT_PROGRAM, FPM_UNIT_MODULE, &
78
FPM_UNIT_SUBMODULE, FPM_UNIT_SUBPROGRAM, FPM_UNIT_CSOURCE, &
89
FPM_UNIT_CHEADER, FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, &
910
FPM_SCOPE_DEP, FPM_SCOPE_APP, FPM_SCOPE_TEST, &
1011
FPM_TARGET_EXECUTABLE, FPM_TARGET_OBJECT, FPM_TARGET_ARCHIVE
11-
use fpm_strings, only: string_t
12+
use fpm_strings, only: string_t, operator(.in.)
1213
implicit none
1314
private
1415

@@ -71,14 +72,17 @@ subroutine test_library_module_use(error)
7172
if (allocated(error)) then
7273
return
7374
end if
74-
75+
7576
if (size(model%targets) /= 3) then
7677
call test_failed(error,'Incorrect number of model%targets - expecting three')
7778
return
7879
end if
7980

81+
call resolve_target_linking(model%targets)
82+
8083
call check_target(model%targets(1)%ptr,type=FPM_TARGET_ARCHIVE,n_depends=2, &
81-
deps = [model%targets(2),model%targets(3)],error=error)
84+
deps = [model%targets(2),model%targets(3)], &
85+
links = model%targets(2:3), error=error)
8286

8387
if (allocated(error)) return
8488

@@ -146,8 +150,10 @@ subroutine test_scope(exe_scope,error)
146150
return
147151
end if
148152

153+
call resolve_target_linking(model%targets)
154+
149155
call check_target(model%targets(1)%ptr,type=FPM_TARGET_ARCHIVE,n_depends=1, &
150-
deps=[model%targets(2)],error=error)
156+
deps=[model%targets(2)],links=[model%targets(2)],error=error)
151157

152158
if (allocated(error)) return
153159

@@ -162,7 +168,8 @@ subroutine test_scope(exe_scope,error)
162168
if (allocated(error)) return
163169

164170
call check_target(model%targets(4)%ptr,type=FPM_TARGET_EXECUTABLE,n_depends=2, &
165-
deps=[model%targets(1),model%targets(3)],error=error)
171+
deps=[model%targets(1),model%targets(3)], &
172+
links=[model%targets(3)], error=error)
166173

167174
if (allocated(error)) return
168175

@@ -202,20 +209,22 @@ subroutine test_program_with_module(error)
202209
return
203210
end if
204211

212+
call resolve_target_linking(model%targets)
213+
205214
call check_target(model%targets(1)%ptr,type=FPM_TARGET_OBJECT,n_depends=0, &
206215
source=sources(1),error=error)
207216

208217
if (allocated(error)) return
209218

210219
call check_target(model%targets(2)%ptr,type=FPM_TARGET_EXECUTABLE,n_depends=1, &
211-
deps=[model%targets(1)],error=error)
220+
deps=[model%targets(1)],links=[model%targets(1)],error=error)
212221

213222
if (allocated(error)) return
214223

215224
end subroutine test_program_with_module
216225

217226

218-
!> Check program using a module in same directory
227+
!> Check program using modules in same directory
219228
subroutine test_program_own_module_use(error)
220229

221230
!> Error handling
@@ -233,21 +242,25 @@ subroutine test_scope(exe_scope,error)
233242
integer, intent(in) :: exe_scope
234243
type(error_t), allocatable, intent(out) :: error
235244

236-
type(srcfile_t) :: sources(2)
245+
type(srcfile_t) :: sources(3)
237246
type(fpm_model_t) :: model
238247
character(:), allocatable :: scope_str
239248

240249
model%output_directory = ''
241250

242251
scope_str = merge('FPM_SCOPE_APP ','FPM_SCOPE_TEST',exe_scope==FPM_SCOPE_APP)//' - '
243252

244-
sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="app/app_mod.f90", &
253+
sources(1) = new_test_source(FPM_UNIT_MODULE,file_name="app/app_mod1.f90", &
245254
scope = exe_scope, &
246-
provides=[string_t('app_mod')])
255+
provides=[string_t('app_mod1')])
247256

248-
sources(2) = new_test_source(FPM_UNIT_PROGRAM,file_name="app/my_program.f90", &
257+
sources(2) = new_test_source(FPM_UNIT_MODULE,file_name="app/app_mod2.f90", &
258+
scope = exe_scope, &
259+
provides=[string_t('app_mod2')],uses=[string_t('app_mod1')])
260+
261+
sources(3) = new_test_source(FPM_UNIT_PROGRAM,file_name="app/my_program.f90", &
249262
scope=exe_scope, &
250-
uses=[string_t('app_mod')])
263+
uses=[string_t('app_mod2')])
251264

252265
call targets_from_sources(model,sources)
253266
call resolve_module_dependencies(model%targets,error)
@@ -256,11 +269,12 @@ subroutine test_scope(exe_scope,error)
256269
return
257270
end if
258271

259-
if (size(model%targets) /= 3) then
272+
if (size(model%targets) /= 4) then
260273
call test_failed(error,scope_str//'Incorrect number of model%targets - expecting three')
261274
return
262275
end if
263276

277+
call resolve_target_linking(model%targets)
264278

265279
call check_target(model%targets(1)%ptr,type=FPM_TARGET_OBJECT,n_depends=0, &
266280
source=sources(1),error=error)
@@ -272,11 +286,16 @@ subroutine test_scope(exe_scope,error)
272286

273287
if (allocated(error)) return
274288

275-
call check_target(model%targets(3)%ptr,type=FPM_TARGET_EXECUTABLE,n_depends=1, &
276-
deps=[model%targets(2)],error=error)
289+
call check_target(model%targets(3)%ptr,type=FPM_TARGET_OBJECT,n_depends=1, &
290+
source=sources(3),deps=[model%targets(2)],error=error)
291+
292+
if (allocated(error)) return
293+
294+
call check_target(model%targets(4)%ptr,type=FPM_TARGET_EXECUTABLE,n_depends=1, &
295+
deps=[model%targets(3)],links=model%targets(1:3), error=error)
277296

278297
if (allocated(error)) return
279-
298+
280299
end subroutine test_scope
281300
end subroutine test_program_own_module_use
282301

@@ -414,12 +433,13 @@ end function new_test_source
414433

415434

416435
!> Helper to check an expected output target
417-
subroutine check_target(target,type,n_depends,deps,source,error)
436+
subroutine check_target(target,type,n_depends,deps,links,source,error)
418437
type(build_target_t), intent(in) :: target
419438
integer, intent(in) :: type
420439
integer, intent(in) :: n_depends
421440
type(srcfile_t), intent(in), optional :: source
422441
type(build_target_ptr), intent(in), optional :: deps(:)
442+
type(build_target_ptr), intent(in), optional :: links(:)
423443
type(error_t), intent(out), allocatable :: error
424444

425445
integer :: i
@@ -448,6 +468,34 @@ subroutine check_target(target,type,n_depends,deps,source,error)
448468

449469
end if
450470

471+
if (present(links)) then
472+
473+
do i=1,size(links)
474+
475+
if (.not.(links(i)%ptr%output_file .in. target%link_objects)) then
476+
call test_failed(error,'Missing object ('//links(i)%ptr%output_file//&
477+
') for executable "'//target%output_file//'"')
478+
return
479+
end if
480+
481+
end do
482+
483+
if (size(links) > size(target%link_objects)) then
484+
485+
call test_failed(error,'There are missing link objects for target "'&
486+
//target%output_file//'"')
487+
return
488+
489+
elseif (size(links) < size(target%link_objects)) then
490+
491+
call test_failed(error,'There are more link objects than expected for target "'&
492+
//target%output_file//'"')
493+
return
494+
495+
end if
496+
497+
end if
498+
451499
if (present(source)) then
452500

453501
if (allocated(target%source)) then

0 commit comments

Comments
 (0)