Synchronising cabal package version with self-reported version

Hi all, In a command-line app of mine I want to have a --version flag, like many GNU apps do to report their version. The only way I know to provide the version number is to hardcode it in the source code somewhere. That means I have the version number in two places: the .cabal file and the source code. I just know that one day they'll get unsynchronised, and --version will be wrong. Is there any way to put the version number in _one_ place, and have both the .cabal and source refer to it? Or even any easier way to synchronise both version numbers? Thanks, Denis

dbueno:
Hi all,
In a command-line app of mine I want to have a --version flag, like many GNU apps do to report their version. The only way I know to provide the version number is to hardcode it in the source code somewhere. That means I have the version number in two places: the .cabal file and the source code. I just know that one day they'll get unsynchronised, and --version will be wrong.
Is there any way to put the version number in _one_ place, and have both the .cabal and source refer to it? Or even any easier way to synchronise both version numbers?
Yes, cabal provides support for this. Here's how we do that in xmonad. In your program, import the magic module Paths_$progname: import Paths_xmonad (version) ["--version"] -> putStrLn ("xmonad " ++ showVersion version) which provides many fields from the .cabal file used to compile the program. In your .cabal file , have something like: name: xmonad version: 0.8.1 Problem solved :) Look in $ vim dist/build/autogen/Paths_xmonad.hs to see what you get to play with: module Paths_xmonad ( version, getBinDir, getLibDir, getDataDir, getLibexecDir, getDataFileName ) where import Data.Version (Version(..)) import System.Environment (getEnv) version :: Version version = Version {versionBranch = [0,8,1], versionTags = []} bindir, libdir, datadir, libexecdir :: FilePath bindir = "/home/dons/.cabal/bin" libdir = "/home/dons/.cabal/lib/xmonad-0.8.1/ghc-6.10.1" datadir = "/home/dons/.cabal/share/xmonad-0.8.1" libexecdir = "/home/dons/.cabal/libexec" getBinDir, getLibDir, getDataDir, getLibexecDir :: IO FilePath getBinDir = catch (getEnv "xmonad_bindir") (\_ -> return bindir) getLibDir = catch (getEnv "xmonad_libdir") (\_ -> return libdir) getDataDir = catch (getEnv "xmonad_datadir") (\_ -> return datadir) getLibexecDir = catch (getEnv "xmonad_libexecdir") (\_ -> return libexecdir) getDataFileName :: FilePath -> IO FilePath getDataFileName name = do dir <- getDataDir return (dir ++ "/" ++ name) -- Don

On Fri, Apr 17, 2009 at 20:41, Don Stewart
dbueno:
Hi all,
In a command-line app of mine I want to have a --version flag, like many GNU apps do to report their version. The only way I know to provide the version number is to hardcode it in the source code somewhere. That means I have the version number in two places: the .cabal file and the source code. I just know that one day they'll get unsynchronised, and --version will be wrong.
Is there any way to put the version number in _one_ place, and have both the .cabal and source refer to it? Or even any easier way to synchronise both version numbers?
Yes, cabal provides support for this. Here's how we do that in xmonad.
In your program, import the magic module Paths_$progname:
import Paths_xmonad (version)
["--version"] -> putStrLn ("xmonad " ++ showVersion version)
which provides many fields from the .cabal file used to compile the program.
Awesome! Thanks. This is exactly what I was hoping for. Denis
participants (2)
-
Denis Bueno
-
Don Stewart