11 Stimmen

Kontrolliere GHC-Bauoptionen aus Umgebungsvariablen mit Cabal (Haskell)

Ist es möglich, ein Haskell-Projekt mit Cabal zu erstellen und die GHC-Flags über Umgebungsvariablen zu steuern?

In meiner project.cabal-Datei gibt es einen Abschnitt 'GHC-Optionen', der die Flags steuert, aber ich würde sie gerne zusätzlich über die Befehlszeile setzen.

3voto

Joachim Breitner Punkte 24748

Wenn Sie nur an/aus-Flags haben, sollten Sie Cabal-Flags verwenden.

2voto

cassowary Punkte 21

Verwenden Sie build-type: Configure im obersten Level Ihrer Cabal-Datei.

Schreiben Sie ein configure-Skript (d. h. ein Shell-Skript im obersten Level Ihres Pakets mit dem Namen "configure" - es muss nicht im Autotools-Stil sein). Es sollte die Umgebungsvariable lesen und eine Datei namens package.buildinfo erstellen, wobei "package" entsprechend ersetzt wird.

Das Format dieser Datei wird theoretisch im Cabal-Benutzerhandbuch beschrieben. Die Datei sollte einfach die Build-Informationenfelder enthalten, wie sie in Abschnitt 3.3.2.9 des Cabal-Benutzerhandbuchs beschrieben sind. Nämlich die build-depends, other-modules, hs-source-dirs, default-extensions, other-extensions, extensions, build-tool-depends, build-tools, buildable, ghc-options, ghc-prof-options, ghc-shared-options, includes, install-includes, include-dirs, c-sources, cxx-sources, asm-sources, cmm-sources, js-sources, extra-libraries, extra-ghci-libraries, extra-bundled-libraries, extra-lib-dirs, cc-options, cpp-options, cxx-options, ld-options, pkgconfig-depends, frameworks, extra-frameworks-dirs und mixins Felder, die in einem Einrückungsbereich stehen. Sie müssen nicht eingerückt sein. Diese werden mit den entsprechenden Feldern im library Abschnitt Ihrer Cabal-Datei fusioniert. (Das Benutzerhandbuch beschreibt die Möglichkeit, executable Abschnitte einzuschließen, aber ich kann sie gerade nicht zum Laufen bringen.)

Wenn Sie also möchten, dass ein String in Ihrem Code den Inhalt von $PATH widerspiegelt, richten Sie Ihre Cabal-Datei ein und schreiben Sie ein Konfigurationsskript wie dieses:

#!/bin/bash
echo 'cpp-options: -DCOMPILE_TIME_PATH="'$PATH'"' > my-package.buildinfo

Dann können Sie eine .hs-Datei schreiben

{-# LANGUAGE CPP #-}
module WhyNot where

compileTimePath :: String
compileTimePath = COMPILE_TIME_PATH

Cabal Benutzerhandbuch: https://www.haskell.org/cabal/users-guide/developing-packages.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X