Skip to content

Commit 33da9ea

Browse files
committed
new test: package depends on empty library
1 parent 9ef7a9e commit 33da9ea

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name = "shared_lib_extra"
2+
library.type="shared"
3+
[dependencies]
4+
shared_lib = { path = "../shared_lib" }
5+
shared_app_only = { path = "../shared_app_only" }

src/fpm_model.f90

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ module fpm_model
174174

175175
contains
176176

177+
!> Check if a package will create a library
178+
procedure :: has_library => package_has_library
179+
177180
!> Serialization interface
178181
procedure :: serializable_is_same => package_is_same
179182
procedure :: dump_to_toml => package_dump_to_toml
@@ -1153,6 +1156,7 @@ function get_package_libraries_link(model, package_name, prefix, exclude_self, d
11531156
integer :: id,ndep,i
11541157
logical :: no_root
11551158
integer, allocatable :: sorted_package_IDs(:)
1159+
logical, allocatable :: empty_package(:)
11561160
type(string_t), allocatable :: package_deps(:)
11571161

11581162
! Get dependency ID of this target
@@ -1184,6 +1188,14 @@ function get_package_libraries_link(model, package_name, prefix, exclude_self, d
11841188
ndep = size(sorted_package_IDs)
11851189
endif
11861190

1191+
! Exclusion of package IDs marked "empty" (i.e. they contain no sources)
1192+
empty_package = .not.model%packages%has_library()
1193+
1194+
if (any(empty_package)) then
1195+
sorted_package_IDs = pack(sorted_package_IDs, .not.empty_package(sorted_package_IDs))
1196+
ndep = size(sorted_package_IDs)
1197+
end if
1198+
11871199
package_deps = [(string_t(model%deps%dep(sorted_package_IDs(i))%name),i=1,ndep)]
11881200

11891201
r = model%compiler%enumerate_libraries(prefix, package_deps)
@@ -1193,4 +1205,17 @@ function get_package_libraries_link(model, package_name, prefix, exclude_self, d
11931205

11941206
end function get_package_libraries_link
11951207

1208+
!> Check whether a package has an object library
1209+
elemental logical function package_has_library(self) result(has_library)
1210+
class(package_t), intent(in) :: self
1211+
1212+
if (allocated(self%sources)) then
1213+
has_library = any(self%sources%unit_scope==FPM_SCOPE_LIB)
1214+
else
1215+
has_library = .false.
1216+
end if
1217+
1218+
end function package_has_library
1219+
1220+
11961221
end module fpm_model

src/fpm_targets.f90

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,7 @@ subroutine build_target_list(targets,model,library)
321321

322322
if (n_source < 1) return
323323

324-
with_lib = any([((model%packages(j)%sources(i)%unit_scope == FPM_SCOPE_LIB, &
325-
i=1,size(model%packages(j)%sources)), &
326-
j=1,size(model%packages))])
324+
with_lib = any(model%packages%has_library())
327325

328326
if (with_lib .and. present(library)) then
329327
shared_lib = library%shared()
@@ -861,27 +859,32 @@ subroutine prune_build_targets(targets, root_package, prune_unused_objects)
861859

862860
targets = pack(targets,.not.exclude_target)
863861

864-
! Remove unused targets from archive dependency list
865-
if (targets(1)%ptr%target_type == FPM_TARGET_ARCHIVE) then
866-
associate(archive=>targets(1)%ptr)
862+
! Remove unused targets from library dependency list
863+
do j=1,size(targets)
864+
associate(archive=>targets(j)%ptr)
865+
866+
if (any(archive%target_type==[FPM_TARGET_ARCHIVE,FPM_TARGET_OBJECT])) then
867867

868-
allocate(exclude_from_archive(size(archive%dependencies)))
869-
exclude_from_archive(:) = .false.
868+
allocate(exclude_from_archive(size(archive%dependencies)),source=.false.)
870869

871-
do i=1,size(archive%dependencies)
870+
do i=1,size(archive%dependencies)
872871

873-
if (archive%dependencies(i)%ptr%skip) then
872+
if (archive%dependencies(i)%ptr%skip) then
874873

875-
exclude_from_archive(i) = .true.
874+
exclude_from_archive(i) = .true.
876875

877-
end if
876+
end if
878877

879-
end do
878+
end do
880879

881-
archive%dependencies = pack(archive%dependencies,.not.exclude_from_archive)
880+
archive%dependencies = pack(archive%dependencies,.not.exclude_from_archive)
881+
882+
deallocate(exclude_from_archive)
883+
884+
endif
882885

883886
end associate
884-
end if
887+
end do
885888

886889
contains
887890

0 commit comments

Comments
 (0)