haskell - Shake: how do I depend on dynamically generated source files? -
given directory structure this:
. ├── frontend │ ├── _build/ -- build dir, files produced shake, except frontend.elm, go here │ ├── build.hs -- build script │ ├── build.sh -- wrap build.hs `stack exec build -- $@` │ ├── other files ... │ ├── frontend.elm -- generated rule in build.hs, `protoc -i../proto --elm_out=. ../proto/frontend.proto` │ ├── index.elm -- hand written source file │ └── other elms ... -- hand written source files └── proto └── frontend.proto -- protocol buffer message defination, hand written
target _build/index.js
depends on .elm
files, including frontend.elm
, frontend.elm
generated rule in build.hs
, if blindly do:
want ["_build/index.js"] "_build/index.js" %> \out -> elms <- filter (not . elmstuff) <$> (liftio $ getdirectoryfilesio "" ["//*.elm"]) need elms blah blah want ["frontend.elm"] "frontend.elm" %> \_out -> cmd ["protoc", "blah", "blah"]
build.sh clean
give me:
lint checking error - value has changed since being depended upon: key: frontend.elm old: file {mod=0x608caaf7,size=0x53d,digest=neq} new: file {mod=0x608cab5b,size=0x53d,digest=neq}
is there way tell shake watch out dynamically generated frontend.elm
, maybe build first doesn't change during rest of build, tried priority 100 ("frontend.elm" %> ...)
, doesn't work.
you should probably:
- switch
getdirectoryfilesio
, not track changes file system,getdirectoryfiles
, does. - declare dependence on
frontend.elm
, know need if not exist in filesystem yet (hence might not visiblegetdirectoryfiles
). - (optional) don't bother
want
ingfrontend.elm
, since wanted hack enable_build/index.js
.
with these changes, this:
want ["_build/index.js"] "_build/index.js" %> \out -> need ["frontend.elm"] elms <- filter (not . elmstuff) <$> getdirectoryfiles "" ["//*.elm"] need elms blah blah "frontend.elm" %> \_out -> cmd ["protoc", "blah", "blah"]
caveat lector: have not tested solution.
Comments
Post a Comment