-
Notifications
You must be signed in to change notification settings - Fork 185
Add module for handling version information of stdlib #579
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
Changes from all commits
2ede92c
b29a056
89130a5
62588bf
350ebf6
e51dbc2
662ff65
52de385
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
0.1.0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
--- | ||
title: Version information | ||
--- | ||
|
||
# The `stdlib_version` module | ||
|
||
[TOC] | ||
|
||
## Introduction | ||
|
||
The `stdlib_version` module contains the version of the standard library. | ||
The version information can be used as a compile time constant or retrieved from a getter function at runtime. | ||
In case the standard library is dynamically linked, the version number retrieved from the getter might mismatch the compile time constants provided from the version built against. | ||
Therefore, it is recommended to retrieve the version information always at runtime. | ||
Comment on lines
+13
to
+14
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not only allow the correct approach to do it? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For the compact version I can see an application to verify the compatibility of API and/or ABI at runtime by a construct like: use stdlib_version, only : stdlib_version_compact, get_stdlib_version
implicit none
integer :: major
call get_stdlib_version(major=major)
if (major > stdlib_version_compact / 10000) then
error stop "Incompatible version of stdlib used"
end if
end Similarly, Not sure whether this is a realistic application of this information, usually this kind of verification happens at build time and constraints in package managers can ensure compatible version, but not everybody is using those. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok. Thank you for the explanation. You can merge this PR from my point-of-view. |
||
|
||
|
||
## Constants provided by `stdlib_version` | ||
|
||
### `stdlib_version_string` | ||
|
||
String constant representing the version number. | ||
|
||
### `stdlib_version_compact` | ||
|
||
Compact representation of the version string following the scheme: | ||
major * 10000 + minor * 100 + patch. | ||
|
||
|
||
### `get_stdlib_version` | ||
|
||
#### Status | ||
|
||
Experimental | ||
|
||
#### Description | ||
|
||
Getter function to retrieve version information | ||
|
||
#### Syntax | ||
|
||
`res = [[stdlib_version(module):get_stdlib_version(function)]] ([major], [minor], [patch], [string])` | ||
|
||
#### Class | ||
|
||
Pure subroutine. | ||
|
||
#### Argument | ||
|
||
`major`: shall be an intrinsic integer type. It is an optional, `intent(out)` argument. | ||
`minor`: shall be an intrinsic integer type. It is an optional, `intent(out)` argument. | ||
`patch`: shall be an intrinsic integer type. It is an optional, `intent(out)` argument. | ||
`string`: shall be a deferred length character type. It is an optional, `intent(out)` argument. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just wondering if a fixed-length string can also be used to collect the output? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The dummy argument is currently |
||
|
||
#### Example | ||
|
||
```fortran | ||
program demo_version | ||
use stdlib_version, only : get_stdlib_version | ||
implicit none | ||
character(len=:), allocatable :: version | ||
call get_stdlib_version(string=version) | ||
print '(a)', version | ||
end program demo_version | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
! SPDX-Identifier: MIT | ||
|
||
#:include "common.fypp" | ||
|
||
!> Version information on stdlib | ||
module stdlib_version | ||
implicit none | ||
private | ||
|
||
public :: get_stdlib_version | ||
public :: stdlib_version_string, stdlib_version_compact | ||
|
||
|
||
!> String representation of the standard library version | ||
character(len=*), parameter :: stdlib_version_string = "${PROJECT_VERSION}$" | ||
|
||
!> Major version number of the above standard library version | ||
integer, parameter :: stdlib_major = ${PROJECT_VERSION_MAJOR}$ | ||
|
||
!> Minor version number of the above standard library version | ||
integer, parameter :: stdlib_minor = ${PROJECT_VERSION_MINOR}$ | ||
|
||
!> Patch version number of the above standard library version | ||
integer, parameter :: stdlib_patch = ${PROJECT_VERSION_PATCH}$ | ||
|
||
!> Compact numeric representation of the standard library version | ||
integer, parameter :: stdlib_version_compact = & | ||
& stdlib_major*10000 + stdlib_minor*100 + stdlib_patch | ||
|
||
|
||
contains | ||
|
||
|
||
!> Getter function to retrieve standard library version | ||
pure subroutine get_stdlib_version(major, minor, patch, string) | ||
|
||
!> Major version number of the standard library version | ||
integer, intent(out), optional :: major | ||
|
||
!> Minor version number of the standard library version | ||
integer, intent(out), optional :: minor | ||
|
||
!> Patch version number of the standard library version | ||
integer, intent(out), optional :: patch | ||
|
||
!> String representation of the standard library version | ||
character(len=:), allocatable, intent(out), optional :: string | ||
|
||
if (present(major)) then | ||
major = stdlib_major | ||
end if | ||
if (present(minor)) then | ||
minor = stdlib_minor | ||
end if | ||
if (present(patch)) then | ||
patch = stdlib_patch | ||
end if | ||
if (present(string)) then | ||
string = stdlib_version_string | ||
end if | ||
|
||
end subroutine get_stdlib_version | ||
|
||
|
||
end module stdlib_version |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Or is this overridden during the fypp processing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is supposed to be a stub, similar like the
MAXRANK=3
argument above, which would would not allow to actually compile stdlib.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't these macros get applied when FORD runs fypp to preprocess the sources for the documentation? At least that's what I understand from here: https://github.com/Fortran-FOSS-Programmers/ford/wiki/Project-File-Options
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It does show up in the final docs for the compile time constant:
Otherwise the value set won't affect the output of the documentation. I would prefer to leave this as a stub, so we don't have to worry about it becoming outdated when we release a new version.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Comments are not allowed in the FORD meta-data section. Is there somewhere we could document these values are stubs, and don't reflect the actual library?