Как сгенерировать зависимости FFI перед сборкой стека моего проекта (с помощью nix)? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть проект на Haskell + stack + nix, в котором интенсивно используется код FFI.Проблема в том, что два файла C, от которых я зависел, должны быть сгенерированы , прежде чем я смогу скомпилировать свой проект на Haskell в целом.Этими двумя файлами являются (i) ./cbits/xdg-shell-protocol.c и (ii) ./include/xdg-shell-protocol.h.

Во-первых, вот Makefile, который может генерировать эти файлы:

WAYLAND_PROTOCOLS=$(shell pkg-config --variable=pkgdatadir wayland-protocols)
WAYLAND_SCANNER=$(shell pkg-config --variable=wayland_scanner wayland-scanner)

# wayland-scanner is a tool which generates C headers and rigging for Wayland
# protocols, which are specified in XML. wlroots requires you to rig these up
# to your build system yourself and provide them in the include path.
xdg-shell-protocol.h:
 $(WAYLAND_SCANNER) server-header \
   $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@

xdg-shell-protocol.c: xdg-shell-protocol.h
 $(WAYLAND_SCANNER) private-code \
   $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@

Обратите внимание, что я зависим отсистемные программы wayland-protocols и wayland-scanner, обе из которых указаны в моем проекте shell.nix:

buildInputs = with pkgs; [ 
                           # ...
                           # These are bleeding edge so I crafted my own nix expressions:
                           (callPackage ./nix/wayland.nix { } )
                           (callPackage ./nix/wayland-protocols.nix { } )
                           # ...
                        ];

И, наконец, обратите внимание, что я говорю Haskell об этих файлах в моем package.yaml:

c-sources:
   - cbits/xdg-shell-protocol.c
include-dirs:
  - include

Вопрос: Как мне сделать так, чтобы каждый раз, когда кто-то запускает stack [--nix] build (с или без nix), два файла (i) ./cbits/xdg-shell-protocol.c и (ii) ./include/xdg-shell-protocol.h должны быть в курсе?

...