Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ability to read project major, minor & patch macros #766

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions example_packages/version_test/fpm.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name = "version_test"
version = "0.1.2"

[preprocess]
[preprocess.cpp]
22 changes: 22 additions & 0 deletions example_packages/version_test/src/version_test.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module version_test
implicit none
private

public :: say_hello
contains
subroutine say_hello
print *, "Hello, version_test!"
#if PROJECT_VERSION_MAJOR != 0
This breaks the build.
#endif

#if PROJECT_VERSION_MINOR != 1
This breaks the build.
#endif

#if PROJECT_VERSION_PATCH != 2
This breaks the build.
#endif

end subroutine say_hello
end module version_test
67 changes: 65 additions & 2 deletions src/fpm_compiler.f90
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@ module fpm_compiler
use fpm_strings, only: split, string_cat, string_t, str_ends_with, str_begins_with_str
use fpm_manifest, only : package_config_t
use fpm_error, only: error_t
use fpm_versioning, only: version_t, new_version

implicit none
public :: compiler_t, new_compiler, archiver_t, new_archiver, get_macros
public :: compiler_t, new_compiler, archiver_t, new_archiver, get_macros, get_version_macros
public :: debug

enum, bind(C)
Expand Down Expand Up @@ -432,6 +434,34 @@ subroutine set_preprocessor_flags (id, flags, package)

end subroutine set_preprocessor_flags

!> Extracts the PROJECT_VERSION_MAJOR, PROJECT_VERSION_MINOR & PROJECT_VERSION_PATCH macros.
function get_version_macros(id, version) result(version_macros)
!> Compiler id.
integer(compiler_enum), intent(in) :: id

!> Version number of the target.
character(len=:), allocatable, intent(in) :: version
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is version allocatable in the same time as intent(in)?

Suggested change
character(len=:), allocatable, intent(in) :: version
character(*), intent(in) :: version


character(len=:), allocatable :: version_macros
character(len=:), allocatable :: macro_definition_symbol
character(:), allocatable :: version_parts(:)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
character(:), allocatable :: version_parts(:)
character(len=:), allocatable :: version_parts(:)

integer :: i

!> Set macro defintion symbol on the basis of compiler used
select case(id)
case default
macro_definition_symbol = "-D"
case (id_intel_classic_windows, id_intel_llvm_windows)
macro_definition_symbol = "/D"
end select

!> Check if version macros are not allocated.
if (.not.allocated(version_macros)) then
version_macros = " "
end if

end function get_version_macros

!> This function will parse and read the macros list and
!> return them as defined flags.
function get_macros(id, macros_list, version) result(macros)
Expand All @@ -442,7 +472,10 @@ function get_macros(id, macros_list, version) result(macros)
character(len=:), allocatable :: macros
character(len=:), allocatable :: macro_definition_symbol
character(:), allocatable :: valued_macros(:)


type(version_t) :: version_object

call new_version(version_object, version)

integer :: i

Expand Down Expand Up @@ -476,6 +509,36 @@ function get_macros(id, macros_list, version) result(macros)
!> Check if the value of macro ends with '}' character.
if (str_ends_with(trim(valued_macros(size(valued_macros))), "}")) then

!> Check if the string contains "version%major as substring.
if (index(valued_macros(size(valued_macros)), "version%major") /= 0) then
if (len(macros) == 0) then
macros = macros//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(1)
else
macros = macros//' '//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(1)
end if
cycle
end if

!> Check if the string contains "version%minor" as substring.
if (index(valued_macros(size(valued_macros)), "version%minor") /= 0) then
if (len(macros) == 0) then
macros = macros//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(2)
else
macros = macros//' '//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(2)
end if
cycle
end if

!> Check if the string contains "version%patch" as substring.
if (index(valued_macros(size(valued_macros)), "version%patch") /= 0) then
if (len(macros) == 0) then
macros = macros//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(3)
else
macros = macros//' '//macro_definition_symbol//trim(valued_macros(1))//'='//version_object%num(3)
end if
cycle
end if

!> Check if the string contains "version" as substring.
if (index(valued_macros(size(valued_macros)), "version") /= 0) then

Expand Down
5 changes: 4 additions & 1 deletion src/fpm_targets.f90
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module fpm_targets
use fpm_environment, only: get_os_type, OS_WINDOWS, OS_MACOS
use fpm_filesystem, only: dirname, join_path, canon_path
use fpm_strings, only: string_t, operator(.in.), string_cat, fnv_1a, resize
use fpm_compiler, only: get_macros
use fpm_compiler, only: get_macros, get_version_macros
implicit none

private
Expand Down Expand Up @@ -803,6 +803,9 @@ subroutine resolve_target_linking(targets, model)
target%compile_flags = target%compile_flags // get_macros(model%compiler%id, &
target%macros, &
target%version)

!> Get Version Macro flags.
target%compile_flags = target%compile_flags // get_version_macros(model%compiler%id, target%version)

if (len(global_include_flags) > 0) then
target%compile_flags = target%compile_flags//global_include_flags
Expand Down