
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