Skip to content

Commit 664f53b

Browse files
committed
Group sources by package in model
1 parent 4daa8dc commit 664f53b

File tree

4 files changed

+127
-96
lines changed

4 files changed

+127
-96
lines changed

fpm/src/fpm.f90

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,11 @@ subroutine build_model(model, settings, package, error)
7272

7373
model%link_flags = ''
7474

75+
allocate(model%packages(model%deps%ndep))
76+
7577
! Add sources from executable directories
7678
if (is_dir('app') .and. package%build%auto_executables) then
77-
call add_sources_from_dir(model%sources,'app', FPM_SCOPE_APP, &
79+
call add_sources_from_dir(model%packages(1)%sources,'app', FPM_SCOPE_APP, &
7880
with_executables=.true., error=error)
7981

8082
if (allocated(error)) then
@@ -83,7 +85,7 @@ subroutine build_model(model, settings, package, error)
8385

8486
end if
8587
if (is_dir('example') .and. package%build%auto_examples) then
86-
call add_sources_from_dir(model%sources,'example', FPM_SCOPE_EXAMPLE, &
88+
call add_sources_from_dir(model%packages(1)%sources,'example', FPM_SCOPE_EXAMPLE, &
8789
with_executables=.true., error=error)
8890

8991
if (allocated(error)) then
@@ -92,7 +94,7 @@ subroutine build_model(model, settings, package, error)
9294

9395
end if
9496
if (is_dir('test') .and. package%build%auto_tests) then
95-
call add_sources_from_dir(model%sources,'test', FPM_SCOPE_TEST, &
97+
call add_sources_from_dir(model%packages(1)%sources,'test', FPM_SCOPE_TEST, &
9698
with_executables=.true., error=error)
9799

98100
if (allocated(error)) then
@@ -101,7 +103,7 @@ subroutine build_model(model, settings, package, error)
101103

102104
end if
103105
if (allocated(package%executable)) then
104-
call add_executable_sources(model%sources, package%executable, FPM_SCOPE_APP, &
106+
call add_executable_sources(model%packages(1)%sources, package%executable, FPM_SCOPE_APP, &
105107
auto_discover=package%build%auto_executables, &
106108
error=error)
107109

@@ -111,7 +113,7 @@ subroutine build_model(model, settings, package, error)
111113

112114
end if
113115
if (allocated(package%example)) then
114-
call add_executable_sources(model%sources, package%example, FPM_SCOPE_EXAMPLE, &
116+
call add_executable_sources(model%packages(1)%sources, package%example, FPM_SCOPE_EXAMPLE, &
115117
auto_discover=package%build%auto_examples, &
116118
error=error)
117119

@@ -121,7 +123,7 @@ subroutine build_model(model, settings, package, error)
121123

122124
end if
123125
if (allocated(package%test)) then
124-
call add_executable_sources(model%sources, package%test, FPM_SCOPE_TEST, &
126+
call add_executable_sources(model%packages(1)%sources, package%test, FPM_SCOPE_TEST, &
125127
auto_discover=package%build%auto_tests, &
126128
error=error)
127129

@@ -139,9 +141,11 @@ subroutine build_model(model, settings, package, error)
139141
apply_defaults=.true.)
140142
if (allocated(error)) exit
141143

144+
model%packages(i)%name = dependency%name
145+
142146
if (allocated(dependency%library)) then
143147
lib_dir = join_path(dep%proj_dir, dependency%library%source_dir)
144-
call add_sources_from_dir(model%sources, lib_dir, FPM_SCOPE_LIB, &
148+
call add_sources_from_dir(model%packages(i)%sources, lib_dir, FPM_SCOPE_LIB, &
145149
error=error)
146150
if (allocated(error)) exit
147151
end if
@@ -153,7 +157,7 @@ subroutine build_model(model, settings, package, error)
153157
end do
154158
if (allocated(error)) return
155159

156-
call targets_from_sources(model,model%sources)
160+
call targets_from_sources(model)
157161

158162
do i = 1, size(model%link_libraries)
159163
model%link_flags = model%link_flags // " -l" // model%link_libraries(i)%s

fpm/src/fpm_model.f90

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,18 @@ module fpm_model
111111
end type srcfile_t
112112

113113

114+
!> Type for describing a single package
115+
type package_t
116+
117+
!> Name of package
118+
character(:), allocatable :: name
119+
120+
!> Array of sources
121+
type(srcfile_t), allocatable :: sources(:)
122+
123+
end type package_t
124+
125+
114126
!> Wrapper type for constructing arrays of `[[build_target_t]]` pointers
115127
type build_target_ptr
116128

@@ -158,15 +170,15 @@ module fpm_model
158170
end type build_target_t
159171

160172

161-
!> Type describing everything required to build a package
162-
!> and its dependencies.
173+
!> Type describing everything required to build
174+
!> the root package and its dependencies.
163175
type :: fpm_model_t
164176

165-
!> Name of package
177+
!> Name of root package
166178
character(:), allocatable :: package_name
167179

168-
!> Array of sources
169-
type(srcfile_t), allocatable :: sources(:)
180+
!> Array of packages (including the root package)
181+
type(package_t), allocatable :: packages(:)
170182

171183
!> Array of targets with module-dependencies resolved
172184
type(build_target_ptr), allocatable :: targets(:)

fpm/src/fpm_targets.f90

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,12 @@ module fpm_targets
5353
!>
5454
!> @note Inter-object dependencies based on modules used and provided are generated separately
5555
!> in `[[resolve_module_dependencies]]` after all targets have been enumerated.
56-
subroutine targets_from_sources(model,sources)
56+
subroutine targets_from_sources(model)
5757

5858
!> The package model within which to construct the target list
5959
type(fpm_model_t), intent(inout), target :: model
6060

61-
!> The list of sources from which to construct the target list
62-
type(srcfile_t), intent(in) :: sources(:)
63-
64-
integer :: i
61+
integer :: i, j
6562
character(:), allocatable :: xsuffix, exe_dir
6663
type(build_target_t), pointer :: dep
6764
logical :: with_lib
@@ -72,61 +69,71 @@ subroutine targets_from_sources(model,sources)
7269
xsuffix = ''
7370
end if
7471

75-
with_lib = any([(sources(i)%unit_scope == FPM_SCOPE_LIB,i=1,size(sources))])
72+
with_lib = any([((model%packages(j)%sources(i)%unit_scope == FPM_SCOPE_LIB, &
73+
i=1,size(model%packages(j)%sources)) &
74+
,j=1,size(model%packages))])
7675

7776
if (with_lib) call add_target(model%targets,type = FPM_TARGET_ARCHIVE,&
7877
output_file = join_path(model%output_directory,&
7978
model%package_name,'lib'//model%package_name//'.a'))
8079

81-
do i=1,size(sources)
80+
do j=1,size(model%packages)
8281

83-
select case (sources(i)%unit_type)
84-
case (FPM_UNIT_MODULE,FPM_UNIT_SUBMODULE,FPM_UNIT_SUBPROGRAM,FPM_UNIT_CSOURCE)
82+
associate(sources=>model%packages(j)%sources)
8583

86-
call add_target(model%targets,source = sources(i), &
87-
type = FPM_TARGET_OBJECT,&
88-
output_file = get_object_name(sources(i)))
89-
90-
if (with_lib .and. sources(i)%unit_scope == FPM_SCOPE_LIB) then
91-
! Archive depends on object
92-
call add_dependency(model%targets(1)%ptr, model%targets(size(model%targets))%ptr)
93-
end if
84+
do i=1,size(sources)
85+
86+
select case (sources(i)%unit_type)
87+
case (FPM_UNIT_MODULE,FPM_UNIT_SUBMODULE,FPM_UNIT_SUBPROGRAM,FPM_UNIT_CSOURCE)
88+
89+
call add_target(model%targets,source = sources(i), &
90+
type = FPM_TARGET_OBJECT,&
91+
output_file = get_object_name(sources(i)))
92+
93+
if (with_lib .and. sources(i)%unit_scope == FPM_SCOPE_LIB) then
94+
! Archive depends on object
95+
call add_dependency(model%targets(1)%ptr, model%targets(size(model%targets))%ptr)
96+
end if
9497

95-
case (FPM_UNIT_PROGRAM)
98+
case (FPM_UNIT_PROGRAM)
9699

97-
call add_target(model%targets,type = FPM_TARGET_OBJECT,&
98-
output_file = get_object_name(sources(i)), &
99-
source = sources(i) &
100-
)
101-
102-
if (sources(i)%unit_scope == FPM_SCOPE_APP) then
100+
call add_target(model%targets,type = FPM_TARGET_OBJECT,&
101+
output_file = get_object_name(sources(i)), &
102+
source = sources(i) &
103+
)
104+
105+
if (sources(i)%unit_scope == FPM_SCOPE_APP) then
103106

104-
exe_dir = 'app'
107+
exe_dir = 'app'
105108

106-
else if (sources(i)%unit_scope == FPM_SCOPE_EXAMPLE) then
109+
else if (sources(i)%unit_scope == FPM_SCOPE_EXAMPLE) then
107110

108-
exe_dir = 'example'
111+
exe_dir = 'example'
109112

110-
else
113+
else
111114

112-
exe_dir = 'test'
115+
exe_dir = 'test'
113116

114-
end if
117+
end if
115118

116-
call add_target(model%targets,type = FPM_TARGET_EXECUTABLE,&
117-
link_libraries = sources(i)%link_libraries, &
118-
output_file = join_path(model%output_directory,exe_dir, &
119-
sources(i)%exe_name//xsuffix))
119+
call add_target(model%targets,type = FPM_TARGET_EXECUTABLE,&
120+
link_libraries = sources(i)%link_libraries, &
121+
output_file = join_path(model%output_directory,exe_dir, &
122+
sources(i)%exe_name//xsuffix))
120123

121-
! Executable depends on object
122-
call add_dependency(model%targets(size(model%targets))%ptr, model%targets(size(model%targets)-1)%ptr)
124+
! Executable depends on object
125+
call add_dependency(model%targets(size(model%targets))%ptr, model%targets(size(model%targets)-1)%ptr)
123126

124-
if (with_lib) then
125-
! Executable depends on library
126-
call add_dependency(model%targets(size(model%targets))%ptr, model%targets(1)%ptr)
127-
end if
128-
129-
end select
127+
if (with_lib) then
128+
! Executable depends on library
129+
call add_dependency(model%targets(size(model%targets))%ptr, model%targets(1)%ptr)
130+
end if
131+
132+
end select
133+
134+
end do
135+
136+
end associate
130137

131138
end do
132139

0 commit comments

Comments
 (0)