@@ -9,7 +9,8 @@ module fpm_cmd_install
9
9
use fpm_manifest, only : package_config_t, get_package_data
10
10
use fpm_model, only : fpm_model_t, FPM_SCOPE_APP
11
11
use fpm_targets, only: targets_from_sources, build_target_t, &
12
- build_target_ptr, FPM_TARGET_EXECUTABLE
12
+ build_target_ptr, FPM_TARGET_EXECUTABLE, &
13
+ filter_library_targets, filter_executable_targets, filter_modules
13
14
use fpm_strings, only : string_t, resize
14
15
implicit none
15
16
private
@@ -28,6 +29,7 @@ subroutine cmd_install(settings)
28
29
type (build_target_ptr), allocatable :: targets(:)
29
30
type (installer_t) :: installer
30
31
character (len= :), allocatable :: lib, dir
32
+ type (string_t), allocatable :: list(:)
31
33
logical :: installable
32
34
33
35
call get_package_data(package, " fpm.toml" , error, apply_defaults= .true. )
@@ -61,13 +63,15 @@ subroutine cmd_install(settings)
61
63
verbosity= merge (2 , 1 , settings% verbose))
62
64
63
65
if (allocated (package% library) .and. package% install% library) then
64
- dir = join_path(model% output_directory, model% package_name)
65
- lib = " lib" // model% package_name// " .a"
66
- call installer% install_library(join_path(dir, lib), error)
67
- call handle_error(error)
66
+ call filter_library_targets(targets, list)
68
67
69
- call install_module_files(installer, dir, error)
70
- call handle_error(error)
68
+ if (size (list) > 0 ) then
69
+ call installer% install_library(list(1 )% s, error)
70
+ call handle_error(error)
71
+
72
+ call install_module_files(installer, targets, error)
73
+ call handle_error(error)
74
+ end if
71
75
end if
72
76
73
77
if (allocated (package% executable)) then
@@ -85,24 +89,17 @@ subroutine install_info(unit, package, model, targets)
85
89
86
90
integer :: ii, ntargets
87
91
character (len= :), allocatable :: lib
88
- type (string_t), allocatable :: install_target(:)
92
+ type (string_t), allocatable :: install_target(:), temp(:)
89
93
90
- call resize (install_target)
94
+ allocate (install_target( 0 ) )
91
95
92
- ntargets = 0
93
- if (allocated (package% library) .and. package% install% library) then
94
- ntargets = ntargets + 1
95
- lib = join_path(model% output_directory, model% package_name, &
96
- " lib" // model% package_name// " .a" )
97
- install_target(ntargets)% s = lib
98
- end if
99
- do ii = 1 , size (targets)
100
- if (is_executable_target(targets(ii)% ptr)) then
101
- if (ntargets >= size (install_target)) call resize(install_target)
102
- ntargets = ntargets + 1
103
- install_target(ntargets)% s = targets(ii)% ptr% output_file
104
- end if
105
- end do
96
+ call filter_library_targets(targets, temp)
97
+ install_target = [install_target, temp]
98
+
99
+ call filter_executable_targets(targets, FPM_SCOPE_APP, temp)
100
+ install_target = [install_target, temp]
101
+
102
+ ntargets = size (install_target)
106
103
107
104
write (unit, ' ("#", *(1x, g0))' ) &
108
105
" total number of installable targets:" , ntargets
@@ -112,20 +109,18 @@ subroutine install_info(unit, package, model, targets)
112
109
113
110
end subroutine install_info
114
111
115
- subroutine install_module_files (installer , dir , error )
112
+ subroutine install_module_files (installer , targets , error )
116
113
type (installer_t), intent (inout ) :: installer
117
- character (len =* ), intent (in ) :: dir
114
+ type (build_target_ptr ), intent (in ) :: targets(:)
118
115
type (error_t), allocatable , intent (out ) :: error
119
116
type (string_t), allocatable :: modules(:)
120
117
integer :: ii
121
118
122
- call list_files(dir , modules, recurse = .false. )
119
+ call filter_modules(targets , modules)
123
120
124
121
do ii = 1 , size (modules)
125
- if (is_module_file(modules(ii)% s)) then
126
- call installer% install_header(modules(ii)% s, error)
127
- if (allocated (error)) exit
128
- end if
122
+ call installer% install_header(modules(ii)% s// " .mod" , error)
123
+ if (allocated (error)) exit
129
124
end do
130
125
if (allocated (error)) return
131
126
@@ -157,14 +152,6 @@ elemental function is_executable_target(target_ptr) result(is_exe)
157
152
end if
158
153
end function is_executable_target
159
154
160
- elemental function is_module_file (name ) result(is_mod)
161
- character (len=* ), intent (in ) :: name
162
- logical :: is_mod
163
- integer :: ll
164
- ll = len (name)
165
- is_mod = name (max (1 , ll-3 ):ll) == " .mod"
166
- end function is_module_file
167
-
168
155
subroutine handle_error (error )
169
156
type (error_t), intent (in ), optional :: error
170
157
if (present (error)) then
0 commit comments