[Haskell-beginners] using Shake to compile c++
David McBride
toad3k at gmail.com
Sat Jul 8 11:38:24 UTC 2017
Sorry that should have been command, not command_ which is very different.
On Sat, Jul 8, 2017 at 7:37 AM, David McBride <toad3k at gmail.com> wrote:
> The easy option is to just use command instead of cmd. Variadic
> functions are always a little weird to type check.
>
> command_ [] "pkg-config" ["glib-2.0","--cflags"]
>
> That will *probably* solve the ambiguity in both lines, but I haven't tested.
>
> On Sat, Jul 8, 2017 at 7:19 AM, Roger Mason <rmason at mun.ca> wrote:
>> Hello,
>>
>> I am trying the Shake build system to compile some c++. I would
>> appreciate some advice on how to use the result of a call to pkg-config
>> in constructing a compiler command. This is what I have currently in Build.hs:
>>
>> import Development.Shake
>> import Development.Shake.Command
>> import Development.Shake.FilePath
>> import Development.Shake.Util
>>
>> main :: IO ()
>> main = shakeArgs shakeOptions{shakeFiles="bin"} $ do
>> want ["bin/makelist", "bin/makejpeg" <.> exe]
>>
>> phony "clean" $ do
>> putNormal "Cleaning files in _build"
>> removeFilesAfter "bin" ["//*"]
>>
>> "bin/makelist" <.> exe %> \out -> do
>> cs <- getDirectoryFiles "" ["src/MakeList.cxx"]
>> let os = ["objects" </> c -<.> "o" | c <- cs]
>> need os
>> cmd "c++ -o" [out] os
>>
>> "bin/makejpeg" <.> exe %> \out -> do
>> cs <- getDirectoryFiles "" ["src/MakeJpeg.cxx"]
>> let os = ["objects" </> c -<.> "o" | c <- cs]
>> need os
>> cmd "c++ -o" [out] os
>>
>> "objects//*.o" %> \out -> do
>> let c = dropDirectory1 $ out -<.> "cxx"
>> let m = out -<.> "m"
>> let i = cmd "pkg-config glib-2.0 --cflags"
>> () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i]
>> needMakefileDependencies m
>>
>> This is the output from 'stack runhaskell Build.sh':
>>
>> Build.hs:29:17: error:
>> * Ambiguous type variable `t0' arising from a use of `cmd'
>> prevents the constraint `(CmdArguments t0)' from being solved.
>> Relevant bindings include i :: t0 (bound at Build.hs:29:13)
>> Probable fix: use a type annotation to specify what `t0' should be.
>> These potential instances exist:
>> instance CmdResult r => CmdArguments (IO r)
>> -- Defined in `Development.Shake.Command'
>> instance CmdResult r => CmdArguments (Action r)
>> -- Defined in `Development.Shake.Command'
>> instance (Development.Shake.Command.Arg a, CmdArguments r) =>
>> CmdArguments (a -> r)
>> -- Defined in `Development.Shake.Command'
>> ...plus one other
>> (use -fprint-potential-instances to see them all)
>> * In the expression: cmd "pkg-config glib-2.0 --cflags"
>> In an equation for `i': i = cmd "pkg-config glib-2.0 --cflags"
>> In the expression:
>> do { let c = dropDirectory1 $ out -<.> "cxx";
>> let m = out -<.> "m";
>> let i = cmd "pkg-config glib-2.0 --cflags";
>> () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i];
>> .... }
>>
>> Build.hs:30:15: error:
>> * Ambiguous type variable `t0' arising from a use of `cmd'
>> prevents the constraint `(Development.Shake.Command.Arg
>> [t0])' from being solved.
>> Relevant bindings include i :: t0 (bound at Build.hs:29:13)
>> Probable fix: use a type annotation to specify what `t0' should be.
>> These potential instances exist:
>> instance Development.Shake.Command.Arg [CmdOption]
>> -- Defined in `Development.Shake.Command'
>> instance Development.Shake.Command.Arg [String]
>> -- Defined in `Development.Shake.Command'
>> instance Development.Shake.Command.Arg String
>> -- Defined in `Development.Shake.Command'
>> * In a stmt of a 'do' block:
>> () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i]
>> In the expression:
>> do { let c = dropDirectory1 $ out -<.> "cxx";
>> let m = out -<.> "m";
>> let i = cmd "pkg-config glib-2.0 --cflags";
>> () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i];
>> .... }
>> In the second argument of `(%>)', namely
>> `\ out
>> -> do { let ...;
>> let ...;
>> .... }'
>>
>> I would appreciate any help in getting the output of the call to
>> pkg-config into the compiler invocation.
>>
>> Thanks,
>> Roger
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
More information about the Beginners
mailing list