使用Stack构建时,如何包括从haskell源文件生成的'xxx_stub.h'文件

时间:2018-10-19 06:39:09

标签: c haskell build ffi haskell-stack

使用Stack构建,我在lib.hs中有一个src/,在main.c中有一个app/。构建时,lib_stub.h.stack-work/dist/x86_64-linux/Cabal-2.2.0.1/build下生成。

要将这个文件包含在main.c中,我要么在#include指令后面写一个完整的绝对路径,要么在手动第二遍之前,手动将lib_stub.h文件复制到{{1 }},这很愚蠢。

有更好的方法吗?

更多信息:

我的app/看起来像

package.yaml

我的路径结构看起来像

name:                mylib
version:             0.1.0.0
github:              "gituser/mylib"
license:             BSD3
author:              "Author name here"
maintainer:          "example@example.com"
copyright:           "2018 Author name here"

extra-source-files:
- README.md
- ChangeLog.md

# Metadata used when publishing your package
# synopsis:            Short description of your package
# category:            Web

# To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file.
description:         Please see the README on GitHub at <https://github.com/gituser/mylib#readme>

dependencies:
- base >= 4.7 && < 5

library:
  source-dirs: src
  dependencies:
  - free
  - mtl

executables:
  cont-demo:
    main:                main.c
    source-dirs:         app
    ghc-options:
    - -threaded
    # - -rtsopts
    # - -with-rtsopts=-N
    dependencies:
    - mylib

tests:
  mylib-test:
    main:                Spec.hs
    source-dirs:         test
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - mylib

手动复制. ├── app │   ├── MyLib_stub.h │   └── main.c ├── ChangeLog.md ├── mylib.cabal ├── LICENSE ├── package.yaml ├── README.md ├── Setup.hs ├── src │   └── MyLib.hs ├── stack.yaml └── test └── Spec.hs 的位置,而不是自动将其放置在那里。

1 个答案:

答案 0 :(得分:1)

如果Stack具有某种适当的方式来执行此操作,我真的很喜欢,但是AFAIK却没有。

我目前在具有类似要求的项目中所做的是,我符号链接,而不是将_stub.h文件复制到更方便的位置。只需执行一次,即可将符号链接置于版本控制下,然后对LONG_PATH/....h文件的更新将自动显示在方便的位置。

$ ln -s dist/build/bla/bla/long/path/MyLib_stub.h app/MyLib_stub.h
$ git add app/MyLib_stub.h

恐怕这在Windows上将不起作用,但是可能有类似的替代方法。