Skip to content

Commit

Permalink
Store version info at compile time (#115)
Browse files Browse the repository at this point in the history
* Store version info at compile time

* Fix code order

* Hopefully fix versioninfo in case LibTrixi is the active project
  • Loading branch information
sloede authored Sep 18, 2023
1 parent 974f990 commit cc1292c
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 30 deletions.
71 changes: 47 additions & 24 deletions LibTrixi.jl/src/LibTrixi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,53 @@ export SimulationState, store_simstate, load_simstate, delete_simstate!


# global storage of name and version information of loaded packages
const _version_info = Ref("")
const _version_info_extended = Ref("")
const _version_libtrixi = Ref("")
function assemble_version_info(; filter_expr = identity, include_julia = true)
packages = Pkg.dependencies() |> values |> collect |> filter_expr
versions = String[]
found_libtrixi = false
for p in packages
if isnothing(p.version)
push!(versions, p.name * " n/a")
else
push!(versions, p.name * " " * string(p.version))
end
if p.name == "LibTrixi"
found_libtrixi = true
end
end

# When running Julia with the LibTrixi package dir as the active project,
# Pkg.dependencies() will not return LibTrixi itself, which is remedied here
if !found_libtrixi && Pkg.project().name == "LibTrixi"
push!(versions, "LibTrixi " * string(Pkg.project().version))
end

sort!(versions)

# Add Julia version
if include_julia
push!(versions, "julia " * string(VERSION))
end

return join(versions, "\n")
end

const _version_info = assemble_version_info(filter_expr = filter(p -> p.is_direct_dep))
const _version_info_extended = assemble_version_info()
const _version_libtrixi = begin
libtrixi_string = assemble_version_info(filter_expr = filter(p -> p.name == "LibTrixi"),
include_julia = false)

# When running Julia with the LibTrixi package dir as the active project,
# Pkg.dependencies() will not return LibTrixi itself, which is remedied here
if isempty(libtrixi_string)
version_string = string(Pkg.project().version)
else
version_string = split(libtrixi_string, " ")[2]
end

version_string
end


include("simulationstate.jl")
Expand All @@ -87,21 +131,6 @@ function show_debug_output()
end


function assemble_version_info(; filter_expr = identity)
packages = Pkg.dependencies() |> values |> collect |> filter_expr
versions = String[]
for p in sort(packages, by=x->x.name)
if isnothing(p.version)
push!(versions, p.name * " n/a")
else
push!(versions, p.name * " " * string(p.version))
end
end
push!(versions, "julia " * string(VERSION))
join(versions, "\n")
end


function __init__()
# MPI could have been initialized by an external application.
# In this situation MPI.jl's MPI.Init is not called and leaves some package-internal
Expand All @@ -111,12 +140,6 @@ function __init__()
if show_debug_output()
MPI.set_default_error_handler_return()
end

# assemble packages information
_version_info[] = assemble_version_info(filter_expr = filter(p -> p.is_direct_dep))
_version_info_extended[] = assemble_version_info()
libtrixi_string = assemble_version_info(filter_expr = filter(p -> p.name == "LibTrixi"))
_version_libtrixi[] = split(split(libtrixi_string, "\n")[1], " ")[2]
end

end # module LibTrixi
12 changes: 6 additions & 6 deletions LibTrixi.jl/src/api_c.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_library_major end

Base.@ccallable function trixi_version_library_major()::Cint
return VersionNumber(_version_libtrixi[]).major
return VersionNumber(_version_libtrixi).major
end

trixi_version_library_major_cfptr() = @cfunction(trixi_version_library_major, Cint, ())
Expand All @@ -28,7 +28,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_library_minor end

Base.@ccallable function trixi_version_library_minor()::Cint
return VersionNumber(_version_libtrixi[]).minor
return VersionNumber(_version_libtrixi).minor
end

trixi_version_library_minor_cfptr() = @cfunction(trixi_version_library_minor, Cint, ())
Expand All @@ -44,7 +44,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_library_patch end

Base.@ccallable function trixi_version_library_patch()::Cint
return VersionNumber(_version_libtrixi[]).patch
return VersionNumber(_version_libtrixi).patch
end

trixi_version_library_patch_cfptr() = @cfunction(trixi_version_library_patch, Cint, ())
Expand All @@ -67,7 +67,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_library end

Base.@ccallable function trixi_version_library()::Cstring
return pointer(_version_libtrixi[])
return pointer(_version_libtrixi)
end

trixi_version_library_cfptr() = @cfunction(trixi_version_library, Cstring, ())
Expand All @@ -89,7 +89,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_julia end

Base.@ccallable function trixi_version_julia()::Cstring
return pointer(_version_info[])
return pointer(_version_info)
end

trixi_version_julia_cfptr() = @cfunction(trixi_version_julia, Cstring, ())
Expand All @@ -112,7 +112,7 @@ This function is thread-safe. It must be run after `trixi_initialize` has been c
function trixi_version_julia_extended end

Base.@ccallable function trixi_version_julia_extended()::Cstring
return pointer(_version_info_extended[])
return pointer(_version_info_extended)
end

trixi_version_julia_extended_cfptr() = @cfunction(trixi_version_julia_extended, Cstring, ())
Expand Down

0 comments on commit cc1292c

Please sign in to comment.