[Haskell-beginners] Fwd: using Shake to compile c++

David McBride toad3k at gmail.com
Sat Jul 8 12:51:09 UTC 2017


Sorry this should have been sent to the list.

---------- Forwarded message ----------
From: David McBride <toad3k at gmail.com>
Date: Sat, Jul 8, 2017 at 8:49 AM
Subject: Re: [Haskell-beginners] using Shake to compile c++
To: Roger Mason <rmason at mun.ca>


There's three errors here.  pkg-config is an IO action and thus in
order to use its output, you must use <- instead of a let binding.
Then you must choose what you want to save from that command.  You
could get the exit result, stderr or stdout or both stdout and stderr.
We want stdout.  And lastly, Stdout is parameterized over a type a,
and you have to decide which.

You can either do the following

Stdout i <- cmd "pkg-config glib-2.0 --cflags"
() <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i :: String]

Or you can enable ScopedTypeVariables and go
Stdout (i :: String) <- cmd "pkg-config glib-2.0 --cflags"

I don't really understand why Stdout is parameterized, rather than
just being forced to be a string like Stdin, that's a question for the
shake authors.

On Sat, Jul 8, 2017 at 7:57 AM, Roger Mason <rmason at mun.ca> wrote:
> David McBride <toad3k at gmail.com> writes:
>
>> 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.
>
> Thank you for your replies.
>
> This is what I have now:
>
>  "objects//*.o" %> \out -> do
>         let c = dropDirectory1 $ out -<.> "cxx"
>         let m = out -<.> "m"
>         let i = command [] "pkg-config" ["glib-2.0","--cflags"]
>         () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i]
>         needMakefileDependencies m
>
> That produces:
>
> Build.hs:29:17: error:
>     * Ambiguous type variable `r0' arising from a use of `command'
>       prevents the constraint `(CmdResult r0)' from being solved.
>       Relevant bindings include i :: Action r0 (bound at Build.hs:29:13)
>       Probable fix: use a type annotation to specify what `r0' should be.
>       These potential instances exist:
>         instance CmdResult CmdLine
>           -- Defined in `Development.Shake.Command'
>         instance CmdResult CmdTime
>           -- Defined in `Development.Shake.Command'
>         instance CmdResult Exit -- Defined in `Development.Shake.Command'
>         ...plus 9 others
>         ...plus two instances involving out-of-scope types
>         (use -fprint-potential-instances to see them all)
>     * In the expression:
>         command [] "pkg-config" ["glib-2.0", "--cflags"]
>       In an equation for `i':
>           i = command [] "pkg-config" ["glib-2.0", "--cflags"]
>       In the expression:
>         do { let c = dropDirectory1 $ out -<.> "cxx";
>              let m = out -<.> "m";
>              let i = command ... "pkg-config" ...;
>              () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i];
>              .... }
>
> Build.hs:30:15: error:
>     * No instance for (Development.Shake.Command.Arg [Action r0])
>         arising from a use of `cmd'
>     * 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 = command ... "pkg-config" ...;
>              () <- cmd "c++ -c" [c] "-o" [out] "-MMD -MF" [m] [i];
>              .... }
>       In the second argument of `(%>)', namely
>         `\ out
>            -> do { let ...;
>                    let ...;
>                    .... }'
>
> Thanks again,
> Roger


More information about the Beginners mailing list