Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: using Shake to compile c++ (David McBride)
2. Re: using Shake to compile c++ (David McBride)
3. Re: using Shake to compile c++ (Roger Mason)
----------------------------------------------------------------------
Message: 1
Date: Sat, 8 Jul 2017 07:37:58 -0400
From: David McBride <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] using Shake to compile c++
Message-ID:
<can+tr40fvfseltfirg2wbkeffbcws9bc1ssqcu1_y33t_my...@mail.gmail.com>
Content-Type: text/plain; charset="UTF-8"
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 <[email protected]> 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
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
Message: 2
Date: Sat, 8 Jul 2017 07:38:24 -0400
From: David McBride <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] using Shake to compile c++
Message-ID:
<can+tr41mznhnom1ppbtm5l1sfuvmz7vbhpwh4zj2mzggeae...@mail.gmail.com>
Content-Type: text/plain; charset="UTF-8"
Sorry that should have been command, not command_ which is very different.
On Sat, Jul 8, 2017 at 7:37 AM, David McBride <[email protected]> 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 <[email protected]> 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
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
Message: 3
Date: Sat, 08 Jul 2017 09:27:01 -0230
From: Roger Mason <[email protected]>
To: David McBride <[email protected]>
Cc: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] using Shake to compile c++
Message-ID: <[email protected]>
Content-Type: text/plain
David McBride <[email protected]> writes:
> Sorry that should have been command, not command_ which is very different.
>
> On Sat, Jul 8, 2017 at 7:37 AM, David McBride <[email protected]> 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
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 109, Issue 11
******************************************