1
1
module fpm
2
- use fpm_strings, only: string_t, operator (.in .), glob, join, string_cat
2
+ use fpm_strings, only: string_t, operator (.in .), glob, join, string_cat, fnv_1a
3
3
use fpm_backend, only: build_package
4
4
use fpm_command_line, only: fpm_build_settings, fpm_new_settings, &
5
5
fpm_run_settings, fpm_install_settings, fpm_test_settings
@@ -9,8 +9,7 @@ module fpm
9
9
use fpm_model, only: fpm_model_t, srcfile_t, show_model, &
10
10
FPM_SCOPE_UNKNOWN, FPM_SCOPE_LIB, FPM_SCOPE_DEP, &
11
11
FPM_SCOPE_APP, FPM_SCOPE_EXAMPLE, FPM_SCOPE_TEST
12
- use fpm_compiler, only: get_module_flags, is_unknown_compiler, get_default_c_compiler, &
13
- get_archiver
12
+ use fpm_compiler, only: new_compiler, new_archiver
14
13
15
14
16
15
use fpm_sources, only: add_executable_sources, add_sources_from_dir
@@ -19,12 +18,9 @@ module fpm
19
18
FPM_TARGET_EXECUTABLE, FPM_TARGET_ARCHIVE
20
19
use fpm_manifest, only : get_package_data, package_config_t
21
20
use fpm_error, only : error_t, fatal_error, fpm_stop
22
- use fpm_manifest_test, only : test_config_t
23
21
use ,intrinsic :: iso_fortran_env, only : stdin= >input_unit, &
24
22
& stdout= >output_unit, &
25
23
& stderr= >error_unit
26
- use fpm_manifest_dependency, only: dependency_config_t
27
- use , intrinsic :: iso_fortran_env, only: error_unit
28
24
implicit none
29
25
private
30
26
public :: cmd_build, cmd_run
@@ -43,10 +39,11 @@ subroutine build_model(model, settings, package, error)
43
39
44
40
integer :: i, j
45
41
type (package_config_t) :: dependency
46
- character (len= :), allocatable :: manifest, lib_dir
42
+ character (len= :), allocatable :: manifest, lib_dir, flags
47
43
48
44
logical :: duplicates_found = .false.
49
45
type (string_t) :: include_dir
46
+ character (len= 16 ) :: build_name
50
47
51
48
model% package_name = package% name
52
49
@@ -63,27 +60,30 @@ subroutine build_model(model, settings, package, error)
63
60
call filewrite(join_path(" build" , " .gitignore" ),[" *" ])
64
61
end if
65
62
66
- if (settings% compiler.eq. ' ' )then
67
- model% fortran_compiler = ' gfortran'
63
+ call new_compiler(model% compiler, settings% compiler)
64
+ call new_archiver(model% archiver)
65
+
66
+ if (settings% flag == ' ' ) then
67
+ flags = model% compiler% get_default_flags(settings% profile == " release" )
68
68
else
69
- model% fortran_compiler = settings% compiler
70
- endif
69
+ flags = settings% flag
70
+ select case (settings% profile)
71
+ case (" release" , " debug" )
72
+ flags = flags // model% compiler% get_default_flags(settings% profile == " release" )
73
+ end select
74
+ end if
71
75
72
- model% archiver = get_archiver()
73
- call get_default_c_compiler(model% fortran_compiler, model% c_compiler)
74
- model% c_compiler = get_env(' FPM_C_COMPILER' ,model% c_compiler)
76
+ write (build_name, ' (z16.16)' ) fnv_1a(flags)
75
77
76
- if (is_unknown_compiler( model% fortran_compiler )) then
78
+ if (model% compiler % is_unknown( )) then
77
79
write (* , ' (*(a:,1x))' ) &
78
- " <WARN>" , " Unknown compiler" , model% fortran_compiler , " requested!" , &
80
+ " <WARN>" , " Unknown compiler" , model% compiler % fc , " requested!" , &
79
81
" Defaults for this compiler might be incorrect"
80
82
end if
81
- model% output_directory = join_path(' build' ,basename(model% fortran_compiler )// ' _' // settings % build_name)
83
+ model% output_directory = join_path(' build' ,basename(model% compiler % fc )// ' _' // build_name)
82
84
83
- call get_module_flags(model% fortran_compiler, &
84
- & join_path(model% output_directory,model% package_name), &
85
- & model% fortran_compile_flags)
86
- model% fortran_compile_flags = settings% flag // model% fortran_compile_flags
85
+ model% fortran_compile_flags = flags // " " // &
86
+ & model% compiler% get_module_flag(join_path(model% output_directory, model% package_name))
87
87
88
88
allocate (model% packages(model% deps% ndep))
89
89
@@ -191,9 +191,9 @@ subroutine build_model(model, settings, package, error)
191
191
if (allocated (error)) return
192
192
193
193
if (settings% verbose) then
194
- write (* ,* )' <INFO> BUILD_NAME: ' ,settings % build_name
195
- write (* ,* )' <INFO> COMPILER: ' ,settings % compiler
196
- write (* ,* )' <INFO> C COMPILER: ' ,model% c_compiler
194
+ write (* ,* )' <INFO> BUILD_NAME: ' ,build_name
195
+ write (* ,* )' <INFO> COMPILER: ' ,model % compiler% fc
196
+ write (* ,* )' <INFO> C COMPILER: ' ,model% compiler % cc
197
197
write (* ,* )' <INFO> COMPILER OPTIONS: ' , model% fortran_compile_flags
198
198
write (* ,* )' <INFO> INCLUDE DIRECTORIES: [' , string_cat(model% include_dirs,' ,' ),' ]'
199
199
end if
@@ -236,7 +236,7 @@ subroutine check_modules_for_duplicates(model, duplicates_found)
236
236
if (allocated (model% packages(k)% sources(l)% modules_provided)) then
237
237
do m= 1 ,size (model% packages(k)% sources(l)% modules_provided)
238
238
if (model% packages(k)% sources(l)% modules_provided(m)% s.in .modules(:modi-1 )) then
239
- write (error_unit , * ) " Warning: Module " ,model% packages(k)% sources(l)% modules_provided(m)% s, &
239
+ write (stderr , * ) " Warning: Module " ,model% packages(k)% sources(l)% modules_provided(m)% s, &
240
240
" in " ,model% packages(k)% sources(l)% file_name," is a duplicate"
241
241
duplicates_found = .true.
242
242
else
0 commit comments