Skip to content

Commit b71cb19

Browse files
committed
do not reload package manifest on model build
1 parent a9eab5a commit b71cb19

File tree

2 files changed

+52
-34
lines changed

2 files changed

+52
-34
lines changed

src/fpm.f90

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ module fpm
4040
subroutine build_model(model, settings, package, error)
4141
type(fpm_model_t), intent(out) :: model
4242
class(fpm_build_settings), intent(inout) :: settings
43-
type(package_config_t), intent(inout) :: package
43+
type(package_config_t), intent(inout), target :: package
4444
type(error_t), allocatable, intent(out) :: error
4545

4646
integer :: i, j
47-
type(package_config_t) :: dependency
48-
character(len=:), allocatable :: manifest, lib_dir
47+
type(package_config_t), target :: dependency
48+
type(package_config_t), pointer :: manifest
49+
character(len=:), allocatable :: file_name, lib_dir
4950
logical :: has_cpp
5051
logical :: duplicates_found
5152
type(string_t) :: include_dir
@@ -76,6 +77,8 @@ subroutine build_model(model, settings, package, error)
7677
! Resolve meta-dependencies into the package and the model
7778
call resolve_metapackages(model,package,settings,error)
7879
if (allocated(error)) return
80+
81+
if (allocated(package%preprocess)) call package%preprocess(1)%info(6,3)
7982

8083
! Create dependencies
8184
call new_dependency_tree(model%deps, cache=join_path("build", "cache.toml"), &
@@ -99,25 +102,32 @@ subroutine build_model(model, settings, package, error)
99102
has_cpp = .false.
100103
do i = 1, model%deps%ndep
101104
associate(dep => model%deps%dep(i))
102-
manifest = join_path(dep%proj_dir, "fpm.toml")
103-
104-
call get_package_data(dependency, manifest, error, apply_defaults=.true.)
105-
if (allocated(error)) exit
105+
file_name = join_path(dep%proj_dir, "fpm.toml")
106106

107-
model%packages(i)%name = dependency%name
107+
! The main package manifest should not be reloaded, because it may have been
108+
! affected by model dependencies and metapackages
109+
if (i==1) then
110+
manifest => package
111+
else
112+
113+
call get_package_data(dependency, file_name, error, apply_defaults=.true.)
114+
if (allocated(error)) exit
115+
116+
manifest => dependency
117+
end if
118+
119+
model%packages(i)%name = manifest%name
108120
associate(features => model%packages(i)%features)
109-
features%implicit_typing = dependency%fortran%implicit_typing
110-
features%implicit_external = dependency%fortran%implicit_external
111-
features%source_form = dependency%fortran%source_form
121+
features%implicit_typing = manifest%fortran%implicit_typing
122+
features%implicit_external = manifest%fortran%implicit_external
123+
features%source_form = manifest%fortran%source_form
112124
end associate
113125
model%packages(i)%version = package%version%s()
114126

115127
!> Add this dependency's manifest macros
116-
call model%packages(i)%preprocess%destroy()
117-
118-
if (allocated(dependency%preprocess)) then
119-
do j = 1, size(dependency%preprocess)
120-
call model%packages(i)%preprocess%add_config(dependency%preprocess(j))
128+
if (allocated(manifest%preprocess)) then
129+
do j = 1, size(manifest%preprocess)
130+
call model%packages(i)%preprocess%add_config(manifest%preprocess(j))
121131
end do
122132
end if
123133

@@ -132,20 +142,20 @@ subroutine build_model(model, settings, package, error)
132142

133143
if (.not.allocated(model%packages(i)%sources)) allocate(model%packages(i)%sources(0))
134144

135-
if (allocated(dependency%library)) then
145+
if (allocated(manifest%library)) then
136146

137-
if (allocated(dependency%library%source_dir)) then
138-
lib_dir = join_path(dep%proj_dir, dependency%library%source_dir)
147+
if (allocated(manifest%library%source_dir)) then
148+
lib_dir = join_path(dep%proj_dir, manifest%library%source_dir)
139149
if (is_dir(lib_dir)) then
140150
call add_sources_from_dir(model%packages(i)%sources, lib_dir, FPM_SCOPE_LIB, &
141151
with_f_ext=model%packages(i)%preprocess%suffixes, error=error)
142152
if (allocated(error)) exit
143153
end if
144154
end if
145155

146-
if (allocated(dependency%library%include_dir)) then
147-
do j=1,size(dependency%library%include_dir)
148-
include_dir%s = join_path(dep%proj_dir, dependency%library%include_dir(j)%s)
156+
if (allocated(manifest%library%include_dir)) then
157+
do j=1,size(manifest%library%include_dir)
158+
include_dir%s = join_path(dep%proj_dir, manifest%library%include_dir(j)%s)
149159
if (is_dir(include_dir%s)) then
150160
model%include_dirs = [model%include_dirs, include_dir]
151161
end if
@@ -154,17 +164,17 @@ subroutine build_model(model, settings, package, error)
154164

155165
end if
156166

157-
if (allocated(dependency%build%link)) then
158-
model%link_libraries = [model%link_libraries, dependency%build%link]
167+
if (allocated(manifest%build%link)) then
168+
model%link_libraries = [model%link_libraries, manifest%build%link]
159169
end if
160170

161-
if (allocated(dependency%build%external_modules)) then
162-
model%external_modules = [model%external_modules, dependency%build%external_modules]
171+
if (allocated(manifest%build%external_modules)) then
172+
model%external_modules = [model%external_modules, manifest%build%external_modules]
163173
end if
164174

165175
! Copy naming conventions from this dependency's manifest
166-
model%packages(i)%enforce_module_names = dependency%build%module_naming
167-
model%packages(i)%module_prefix = dependency%build%module_prefix
176+
model%packages(i)%enforce_module_names = manifest%build%module_naming
177+
model%packages(i)%module_prefix = manifest%build%module_prefix
168178

169179
end associate
170180
end do

src/metapackage/fpm_meta_base.f90

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,23 @@ subroutine resolve_package_config(self,package,error)
192192
if (self%preprocess%is_cpp()) then
193193

194194
if (allocated(package%preprocess)) then
195-
do i=1,size(package%preprocess)
196-
if (package%preprocess(i)%is_cpp()) then
197-
call package%preprocess(i)%add_config(self%preprocess)
198-
exit
199-
end if
200-
end do
195+
196+
if (size(package%preprocess)<1) then
197+
deallocate(package%preprocess)
198+
allocate(package%preprocess(1),source=self%preprocess)
199+
else
200+
do i=1,size(package%preprocess)
201+
if (package%preprocess(i)%is_cpp()) then
202+
call package%preprocess(i)%add_config(self%preprocess)
203+
exit
204+
end if
205+
end do
206+
end if
201207
else
202208
! Copy configuration
209+
call self%preprocess%info(6,2)
203210
allocate(package%preprocess(1),source=self%preprocess)
211+
204212
end if
205213

206214
else

0 commit comments

Comments
 (0)