2011-10-04 34 views

回答

5

使用cabalvchk:http://hackage.haskell.org/package/cabalvchk-0.2

例如,驗證秒差距的版本爲> = 0.4,你可以發出:

$ cabalvchk parsec '>= 0.4' 

返回代碼將是零,如果版本滿足約束條件否則不爲零。版本約束可以是cabal理解的任何東西。可選的第三個參數可以是非空白的以請求詳細輸出。

+0

這確實很酷,即使它意味着我必須引入新的依賴關係。 –

+0

謝謝!從長遠來看,我可以請求cabal工具人員直接將此功能添加到cabal中,這樣可以減少依賴性,但是這種額外的依賴性對於您的直接需求是必需的。 –

3

我不知道很多關於configure;你能讓它運行一個特定的命令嗎?如果是這樣,那麼ghc-pkg latest應該幫助你。例如,下面是爲zlib包在我的機器上運行:

% ghc-pkg latest zlib 
zlib-0.5.3.1 
% ghc-pkg latest --global zlib 
zlib-0.5.3.1 
% ghc-pkg latest --user zlib 
ghc-pkg: cannot find package zlib 
zsh: exit 1  ghc-pkg latest --user zlib 

--global應該用於整個系統的安裝,並沒有任何標誌在所有的用戶特定的設備。 --user標誌只應在您想檢查用戶是否具有本地安裝包(可能會覆蓋全局包)時使用。

除非您有理由不這樣做,否則我建議開溝configure以支持cabal。對於cabal,該解決方案在這裏是先cabal init在項目的目錄,然後檢查是否有在.cabal文件這樣一行時創建的:

build-depends: zlib >= 0.5 

cabal工具鏈是Haskell的項目標準(因爲它自動化和簡化許多事情,包括依賴追逐)。如果還有其他依賴關係,您還可以請求cabal調用configure。如果您想了解更多關於此的信息,請另外打個問題。

+0

感謝您的回答。我已經使用ghc-pkg,但我不知道說'我需要版本> = x.y'。使用'configure'的原因是haskell腳本是主要用python編寫的更大程序的一部分,所有的依賴關係已經通過configure進行管理。 –

0

使用ghc-pkg list,您可以按照升序獲取軟件包的已安裝版本列表。您應該希望能夠通過此列表篩選尋找匹配項。 (我不知道怎麼做,configure,對不起)。

$ ghc-pkg list yesod 
/home/ahammar/.haskell/lib/ghc-7.0.2/package.conf.d 
/home/ahammar/.ghc/x86_64-linux-7.0.2/package.conf.d 
    yesod-0.8.2.1 
    yesod-0.9.1 
    yesod-0.9.2.2 
0

嘗試這樣:

# Find ghc-pkg, so we can do version checks 
AC_ARG_VAR([GHC_PKG], [Path to ghc-pkg]) 
AC_PATH_PROG([GHC_PKG], [ghc-pkg]) 
AS_IF([test -z "$GHC_PKG"], [AC_MSG_ERROR([Cannot find ghc-pkg.])]) 

# Check that the package actually exists 
AC_MSG_CHECKING([for Haskell package foo]) 
AS_IF([$GHC_PKG latest foo > /dev/null 2>&1], 
    [AC_MSG_RESULT([yes])], 
    [AC_MSG_RESULT([no]) 
AC_MSG_ERROR([Cannot find foo])]) 

# Check its version 
AC_MSG_CHECKING([if foo is new enough]) 
foo_ver=`$GHC_PKG latest foo | sed 's/^foo-//'` 
# At this point you have the version of foo and the minimum version you want. 
# The rest of the test is pretty easy to write, use cut and test to compare the 
# version numbers. If it's new enough, AC_MSG_RESULT([yes]). 
# If not, AC_MSG_RESULT([no]) and AC_MSG_ERROR([foo is not new enough.]) 
1

也許更好的問題是:你應該?檢查特定的版本號是autoconf世界的重要參數之一,辯論的總冠軍是說你永遠不應該這樣做的一面。你需要什麼Haskell特性?測試一下。作爲一個簡單的例子(與haskell無關),假設你的程序使用inotify,所以你想讓configury測試它是否可用。你可以測試內核版本是否大於2.6.13,但是當Joe試圖在他的2.4.xx版本上構建你的程序時,他已經修復了inotify的能力,他會非常煩惱你的程序不會工作。

你不關心Haskell> x.y是否可用。相反,Haskell的某些特定功能需要在x.y中引入;測試該功能。

相關問題