How can my Haskell program or library find its version number?
Asked Answered
C

1

70

I would like my cabalised program to have a --version switch.

I would like it to report the same version as is present in the .cabal file.

If I have to update the version number separately in my Haskell source code as well as in the .cabal file, I will eventually get them out of sync.

So, how can my program, while being compiled under cabal, get its version number from the .cabal file?

Conjunctivitis answered 23/5, 2010 at 16:47 Comment(0)
I
97

This is well supported with Cabal. As follows (from xmonad):

Import Paths_$myprogram - a file Cabal creates with lots of metadata from the .cabal file, along with a the module for handling version numbers:

import Paths_xmonad (version)
import Data.Version (showVersion)

Add a print statement to print the 'version' field provided by Paths_$myprogram:

case args of
     ["--version"] -> putStrLn ("xmonad " ++ showVersion version)

In general, Cabal's generated Paths file contains the following values, in dist/build/autogen/

version,
getBinDir, getLibDir, getDataDir, getLibexecDir,
getDataFileName
Indefinite answered 23/5, 2010 at 17:1 Comment(4)
5 years after this answer, it's worth mentioning that this works just as well under the new Stack build tool. The only difference is that the Paths file is in a location like .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/autogen/ (the x86_64-osx part changes according to your architecture).Briggs
Remember to put Paths_$myprogram into the "other-modules" in your .cabal to avoid "ld returned 1 exit status"Blamable
Reading @LuisCasillas's comment above, it seems like to make this work, one needs to have a statically linked module available in the import paths. But that means that this path needs to change based on where the program is being built, right? If so, this is barely feasible in cases where your program is built across several architectures, or built remotely.Transcendentalism
Note that any -s in your package name must be replaced with _ in Paths_$myprogram.Armanda

© 2022 - 2024 — McMap. All rights reserved.