Skip to content

Commit 57712f3

Browse files
committed
Update: allow list of include directories
1 parent 2346f71 commit 57712f3

File tree

6 files changed

+53
-17
lines changed

6 files changed

+53
-17
lines changed

fpm/src/fpm.f90

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ subroutine build_model(model, settings, package, error)
3939
type(package_config_t), intent(in) :: package
4040
type(error_t), allocatable, intent(out) :: error
4141

42-
integer :: i
42+
integer :: i, j
4343
type(package_config_t) :: dependency
4444
character(len=:), allocatable :: manifest, lib_dir
4545
type(string_t) :: include_dir
@@ -155,10 +155,12 @@ subroutine build_model(model, settings, package, error)
155155
end if
156156

157157
if (allocated(dependency%library%include_dir)) then
158-
include_dir%s = join_path(dep%proj_dir, dependency%library%include_dir)
159-
if (is_dir(include_dir%s)) then
160-
model%include_dirs = [model%include_dirs, include_dir]
161-
end if
158+
do j=1,size(dependency%library%include_dir)
159+
include_dir%s = join_path(dep%proj_dir, dependency%library%include_dir(j)%s)
160+
if (is_dir(include_dir%s)) then
161+
model%include_dirs = [model%include_dirs, include_dir]
162+
end if
163+
end do
162164
end if
163165

164166
end if

fpm/src/fpm/manifest.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ module fpm_manifest
1717
use fpm_toml, only : toml_table, read_package_file
1818
use fpm_manifest_test, only : test_config_t
1919
use fpm_filesystem, only: join_path, exists, dirname, is_dir
20+
use fpm_strings, only: string_t
2021
implicit none
2122
private
2223

@@ -35,7 +36,7 @@ subroutine default_library(self)
3536
type(library_config_t), intent(out) :: self
3637

3738
self%source_dir = "src"
38-
self%include_dir = "include"
39+
self%include_dir = [string_t("include")]
3940

4041
end subroutine default_library
4142

fpm/src/fpm/manifest/library.f90

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
!>```toml
66
!>[library]
77
!>source-dir = "path"
8-
!>include-dir = "path"
8+
!>include-dir = ["path1","path2"]
99
!>build-script = "file"
1010
!>```
1111
module fpm_manifest_library
1212
use fpm_error, only : error_t, syntax_error
13+
use fpm_strings, only: string_t, string_cat
1314
use fpm_toml, only : toml_table, toml_key, toml_stat, get_value
1415
implicit none
1516
private
@@ -24,7 +25,7 @@ module fpm_manifest_library
2425
character(len=:), allocatable :: source_dir
2526

2627
!> Include path prefix
27-
character(len=:), allocatable :: include_dir
28+
type(string_t), allocatable :: include_dir(:)
2829

2930
!> Alternative build script to be invoked
3031
character(len=:), allocatable :: build_script
@@ -56,9 +57,16 @@ subroutine new_library(self, table, error)
5657
if (allocated(error)) return
5758

5859
call get_value(table, "source-dir", self%source_dir, "src")
59-
call get_value(table, "include-dir", self%include_dir, "include")
6060
call get_value(table, "build-script", self%build_script)
6161

62+
call get_value(table, "include-dir", self%include_dir, error)
63+
if (allocated(error)) return
64+
65+
! Set default value of include-dir if not found in manifest
66+
if (.not.allocated(self%include_dir)) then
67+
self%include_dir = [string_t("include")]
68+
end if
69+
6270
end subroutine new_library
6371

6472

@@ -122,7 +130,7 @@ subroutine info(self, unit, verbosity)
122130
write(unit, fmt) "- source directory", self%source_dir
123131
end if
124132
if (allocated(self%include_dir)) then
125-
write(unit, fmt) "- include directory", self%include_dir
133+
write(unit, fmt) "- include directory", string_cat(self%include_dir,",")
126134
end if
127135
if (allocated(self%build_script)) then
128136
write(unit, fmt) "- custom build", self%build_script

fpm/src/fpm_strings.f90

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module fpm_strings
33
implicit none
44

55
private
6-
public :: f_string, lower, split, str_ends_with, new_string_t, string_t
6+
public :: f_string, lower, split, str_ends_with, string_t
77
public :: string_array_contains, string_cat, len_trim, operator(.in.), fnv_1a
88
public :: replace, resize, str, join, glob
99

@@ -37,6 +37,10 @@ module fpm_strings
3737
module procedure str_int, str_int64, str_logical
3838
end interface
3939

40+
interface string_t
41+
module procedure new_string_t
42+
end interface string_t
43+
4044
contains
4145

4246
pure logical function str_ends_with_str(s, e) result(r)

fpm/test/fpm_test/test_manifest.f90

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module test_manifest
44
use testsuite, only : new_unittest, unittest_t, error_t, test_failed, &
55
& check_string
66
use fpm_manifest
7+
use fpm_strings, only: operator(.in.)
78
implicit none
89
private
910

@@ -183,9 +184,15 @@ subroutine test_default_library(error)
183184
& "Default library source-dir")
184185
if (allocated(error)) return
185186

186-
call check_string(error, package%library%include_dir, "include", &
187-
& "Default library include-dir")
188-
if (allocated(error)) return
187+
if (.not.allocated(package%library%include_dir)) then
188+
call test_failed(error,"Default include-dir list not allocated")
189+
return
190+
end if
191+
192+
if (.not.("include".in.package%library%include_dir)) then
193+
call test_failed(error,"'include' not in default include-dir list")
194+
return
195+
end if
189196

190197
end subroutine test_default_library
191198

@@ -583,9 +590,15 @@ subroutine test_library_empty(error)
583590
& "Default library source-dir")
584591
if (allocated(error)) return
585592

586-
call check_string(error, library%include_dir, "include", &
587-
& "Default library include-dir")
588-
if (allocated(error)) return
593+
if (.not.allocated(library%include_dir)) then
594+
call test_failed(error,"Default include-dir list not allocated")
595+
return
596+
end if
597+
598+
if (.not.("include".in.library%include_dir)) then
599+
call test_failed(error,"'include' not in default include-dir list")
600+
return
601+
end if
589602

590603
end subroutine test_library_empty
591604

manifest-reference.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ Paths for the source and include directories are given relative to the project r
199199
source-dir = "lib"
200200
include-dir = "inc"
201201
```
202+
*include-dir* can contain one or more directories, where multiple directories are specified using a list of strings.
203+
204+
*Example:*
205+
206+
```toml
207+
[library]
208+
include-dir = ["include","third_party/include"]
209+
```
202210

203211
#### Custom build script
204212

0 commit comments

Comments
 (0)