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 1 commit
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
44 changes: 43 additions & 1 deletion src/fpm_compiler.f90
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ module fpm_compiler
use fpm_manifest, only : package_config_t
use fpm_error, only: error_t
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 +432,48 @@ 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


!> Extract the Major, Minor & Patch number from Version Number.
call split(version, version_parts, delimiters='.')
Copy link
Member

Choose a reason for hiding this comment

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

There is a version_t which does the parsing of a version number and guarantees that all three components (major, minor, patch) are initialized correctly.

Copy link
Member Author

Choose a reason for hiding this comment

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

Hi @awvwgk , Sorry for getting late on this one.

I used version_t for version numbers but to actually get hold of major, minor and patch numbers. I did this in the commit
arteevraina@8186856#diff-3c32b450ab98df7cbf05abbaf7c96e19c556d9de123bb1f576cafe7f7ffb667bR515 but fortran throws error that num list is private. Should I make this variable public or is there a way I can get access of minor, major and patch versions from version_t


do i = 1, size(version_parts)
if (i == 1) then
version_macros = version_macros//macro_definition_symbol//'PROJECT_VERSION_MAJOR'//'='//version_parts(i)
else if (i == 2) then
version_macros = version_macros//' '//macro_definition_symbol//'PROJECT_VERSION_MINOR'//'='//version_parts(i)
else if (i == 3) then
version_macros = version_macros//' '//macro_definition_symbol//'PROJECT_VERSION_PATCH'//'='//version_parts(i)
end if
end do
Copy link
Member

Choose a reason for hiding this comment

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

Should those be set automatically or in a similar way as the "VERSION={version}" syntax for macros? Maybe something like "PROJECT_MAJOR_VERSION={version%major}" and so on should work.


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 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