У меня есть проект на 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
должны быть в курсе?