Skip to content

Commit 69a5673

Browse files
committed
Update: tree-shaking to handle submodules correctly
1 parent 089f9dc commit 69a5673

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

src/fpm_model.f90

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ module fpm_model
9595
!> Type of source unit
9696
integer :: unit_type = FPM_UNIT_UNKNOWN
9797

98+
!> Parent modules (submodules only)
99+
type(string_t), allocatable :: parent_modules(:)
100+
98101
!> Modules USEd by this source file (lowerstring)
99102
type(string_t), allocatable :: modules_used(:)
100103

@@ -224,6 +227,12 @@ function info_srcfile(source) result(s)
224227
if (i < size(source%modules_provided)) s = s // ", "
225228
end do
226229
s = s // "]"
230+
s = s // ", parent_modules=["
231+
do i = 1, size(source%parent_modules)
232+
s = s // '"' // source%parent_modules(i)%s // '"'
233+
if (i < size(source%parent_modules)) s = s // ", "
234+
end do
235+
s = s // "]"
227236
! integer :: unit_type = FPM_UNIT_UNKNOWN
228237
s = s // ", unit_type="
229238
select case(source%unit_type)

src/fpm_source_parsing.f90

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ function parse_f_source(f_filename,error) result(f_source)
7878

7979
logical :: inside_module
8080
integer :: stat
81-
integer :: fh, n_use, n_include, n_mod, i, j, ic, pass
81+
integer :: fh, n_use, n_include, n_mod, n_parent, i, j, ic, pass
8282
type(string_t), allocatable :: file_lines(:), file_lines_lower(:)
8383
character(:), allocatable :: temp_string, mod_name, string_parts(:)
8484

@@ -104,11 +104,13 @@ function parse_f_source(f_filename,error) result(f_source)
104104
n_use = 0
105105
n_include = 0
106106
n_mod = 0
107+
n_parent = 0
107108
inside_module = .false.
108109
file_loop: do i=1,size(file_lines_lower)
109110

110111
! Skip comment lines
111-
if (index(file_lines_lower(i)%s,'!') == 1) then
112+
if (index(file_lines_lower(i)%s,'!') == 1 .or. &
113+
len_trim(file_lines_lower(i)%s) < 1) then
112114
cycle
113115
end if
114116

@@ -296,6 +298,8 @@ function parse_f_source(f_filename,error) result(f_source)
296298

297299
inside_module = .true.
298300

301+
n_parent = n_parent + 1
302+
299303
if (pass == 2) then
300304

301305
if (index(temp_string,':') > 0) then
@@ -312,7 +316,7 @@ function parse_f_source(f_filename,error) result(f_source)
312316
end if
313317

314318
f_source%modules_used(n_use)%s = temp_string
315-
319+
f_source%parent_modules(n_parent)%s = temp_string
316320
f_source%modules_provided(n_mod)%s = mod_name
317321

318322
end if
@@ -379,6 +383,7 @@ function parse_f_source(f_filename,error) result(f_source)
379383
allocate(f_source%modules_used(n_use))
380384
allocate(f_source%include_dependencies(n_include))
381385
allocate(f_source%modules_provided(n_mod))
386+
allocate(f_source%parent_modules(n_parent))
382387
end if
383388

384389
end do

src/fpm_targets.f90

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,22 @@ subroutine prune_build_targets(targets)
508508

509509
end do
510510

511+
elseif (target%source%unit_type == FPM_UNIT_SUBMODULE) then
512+
! Remove submodules if their parents are not used
513+
514+
exclude_target(i) = .true.
515+
target%skip = .true.
516+
do j=1,size(target%source%parent_modules)
517+
518+
if (target%source%parent_modules(j)%s .in. modules_used) then
519+
520+
exclude_target(i) = .false.
521+
target%skip = .false.
522+
523+
end if
524+
525+
end do
526+
511527
end if
512528
end if
513529

@@ -543,7 +559,7 @@ subroutine prune_build_targets(targets)
543559
recursive subroutine collect_used_modules(target)
544560
type(build_target_t), intent(in) :: target
545561

546-
integer :: j
562+
integer :: j, k
547563

548564
if (allocated(target%source)) then
549565
do j=1,size(target%source%modules_used)
@@ -552,14 +568,28 @@ recursive subroutine collect_used_modules(target)
552568

553569
modules_used = [modules_used, target%source%modules_used(j)]
554570

571+
! Recurse into child submodules
572+
do k=1,size(targets)
573+
if (allocated(targets(k)%ptr%source)) then
574+
if (targets(k)%ptr%source%unit_type == FPM_UNIT_SUBMODULE) then
575+
if (target%source%modules_used(j)%s .in. targets(k)%ptr%source%parent_modules) then
576+
call collect_used_modules(targets(k)%ptr)
577+
end if
578+
end if
579+
end if
580+
end do
581+
555582
end if
556583

557584
end do
558585
end if
559586

587+
! Recurse into dependencies
560588
do j=1,size(target%dependencies)
561589

562-
call collect_used_modules(target%dependencies(j)%ptr)
590+
if (target%dependencies(j)%ptr%target_type /= FPM_TARGET_ARCHIVE) then
591+
call collect_used_modules(target%dependencies(j)%ptr)
592+
end if
563593

564594
end do
565595

0 commit comments

Comments
 (0)