Re: [Godi-list] How-to make packages for 2.16

William <[email protected]> Wed, 12 Sep 2012 21:45:26 +0200
Newsgroups gmane.comp.lang.ocaml.lib.gtk
Message-ID <[email protected]>
ok, thanks for your answers.
Regards,
William

On 09/12/2012 07:17 AM, Jacques Garrigue wrote:
>
> Unfortunately, this approach does not support the case where only some 
> libraries are built and installed.
> Generally, I don't think it's a good idea to depend only on lablgtk if 
> you are also using some extension libraries.
> The lablgtk2 script loads all available libraries, but I see this as a 
> special case.
>
> Jacques
>
> 2012/09/11 23:04 "William" <[email protected] 
> <mailto:[email protected]>>:
>
>     Hello,
>
>     To conclude on this, would it be possible to make this META file
>     instead of the one proposed in 2.16.0 :
>
>
>
>     ** META file **
>
>     description = "Bindings for gtk2"
>     requires = ""
>     version = "2.16.0"
>     *
>     requires = "lablgtk2.base lablgtk2.gl <http://lablgtk2.gl>
>     lablgtk2.glade lablgtk2.gnomecanvas lablgtk2.gnomehtml
>     lablgtk2.gnomeui lablgtk2.gtkspell lablgtk2.panel lablgtk2.rsvg
>     lablgtk2.sourceview lablgtk2.sourceview2"*
>     *
>     package "base" (*
>       archive(byte) = "lablgtk.cma"
>       archive(native) = "lablgtk.cmxa"
>       archive(byte,mt) += "gtkThread.cmo"
>       archive(native,mt) += "gtkThread.cmx"
>     *)*
>     package "auto-init" (
>       exists_if = "gtkInit.cmo,gtkInit.cmx"
>       description = "Auto-initialization of GTK"
>       requires = "lablgtk2.base"
>       archive(byte) = "gtkInit.cmo"
>       archive(native) = "gtkInit.cmx"
>     )
>     package "gl" (
>       exists_if = "lablgtkgl.cma,lablgtkgl.cmxa,lablgtkgl.cmxs"
>       description = "Bindings for gtkGL"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgtkgl.cma"
>       archive(native) = "lablgtkgl.cmxa"
>     )
>     package "glade" (
>       exists_if = "lablglade.cma,lablglade.cmxa,lablglade.cmxs"
>       description = "Bindings for glade"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablglade.cma"
>       archive(native) = "lablglade.cmxa"
>     )
>     package "gnomecanvas" (
>       exists_if =
>     "lablgnomecanvas.cma,lablgnomecanvas.cmxa,lablgnomecanvas.cmxs"
>       description = "Bindings for gnomecanvas"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgnomecanvas.cma"
>       archive(native) = "lablgnomecanvas.cmxa"
>     )
>     package "gnomehtml" (
>       exists_if = "lablgnome.cma,lablgnome.cmxa,lablgnome.cmxs"
>       description = "Bindings for gnome html"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgnome.cma"
>       archive(native) = "lablgnome.cmxa"
>     )
>     package "gnomeui" (
>       exists_if = "lablgnomeui.cma,lablgnomeui.cmxa,lablgnomeui.cmxs"
>       description = "Bindings for gnomeui"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgnomeui.cma"
>       archive(native) = "lablgnomeui.cmxa"
>     )
>     package "gtkspell" (
>       exists_if = "lablgtkspell.cma,lablgtkspell.cmxa,lablgtkspell.cmxs"
>       description = "Bindings for gtkspell"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgtkspell.cma"
>       archive(native) = "lablgtkspell.cmxa"
>     )
>     package "panel" (
>       exists_if = "lablpanel.cma,lablpanel.cmxa,lablpanel.cmxs"
>       description = "Bindings for panelapplet"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablpanel.cma"
>       archive(native) = "lablpanel.cmxa"
>     )
>     package "rsvg" (
>       exists_if = "lablrsvg.cma,lablrsvg.cmxa,lablrsvg.cmxs"
>       description = "Bindings for rsvg"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablrsvg.cma"
>       archive(native) = "lablrsvg.cmxa"
>     )
>     package "sourceview" (
>       exists_if =
>     "lablgtksourceview.cma,lablgtksourceview.cmxa,lablgtksourceview.cmxs"
>       description = "Bindings for gtksourceview"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgtksourceview.cma"
>       archive(native) = "lablgtksourceview.cmxa"
>     )
>     package "sourceview2" (
>       exists_if =
>     "lablgtksourceview2.cma,lablgtksourceview2.cmxa,lablgtksourceview2.cmxs"
>       description = "Bindings for gtksourceview2"
>       requires = "lablgtk2.base"
>       archive(byte) = "lablgtksourceview2.cma"
>       archive(native) = "lablgtksourceview2.cmxa"
>     )
>
>     ** end of META file **
>
>
>     with those modifications :
>
>     - it is possible to compile "easily" any software that uses
>     lablgtk2 code:
>     ocamlfind opt -package lablgtk2 -linkpkg test.ml <http://test.ml>
>
>     - it is possible to optimise the build process, by choosing
>     exactly what we need (with a little more knowledge of lablgtk2) :
>     ocamlfind opt -package lablgtk2.gtkgl lablgtk2.gnomeui -linkpkg
>     test.ml <http://test.ml>
>
>
>     This method is usable both for the novice and for the expert. It
>     is similar to the one used by camlimages, but here the "default"
>     is to include as much as possible.
>
>
>     Best regards,
>     William
>
>     On 08/28/2012 08:39 AM, Adrien wrote:
>>     Hi,
>>
>>     I don't have much time to answer so I'll make my best and not forget anything.
>>
>>     On 28/08/2012, Syndic Copropriété 4 rue Pasteur<[email protected]>  <mailto:[email protected]>  wrote:
>>>     Hello,
>>>
>>>     As I saw the new META file for lablgtk2, many questions and issues rose.
>>>     It concerns both lablgtk2 and the way ocamlfind is implemented. It may
>>>     be also interesting for packagers (in godi for example) who design META
>>>     files.
>>>
>>>     - lablgtk2 defines 10 sub packages plus package "auto-init" (for which
>>>     one must be able to chose to include it or not). When users add a
>>>     dependency to a project, it is far easier at first to only add the name
>>>     of the package (here "lablgtk2") without trying to understand what is
>>>     exactly behing. It would be easier for users to have :
>>>              * package "lablgtk2" that includes everything but gtkInit.cmo
>>>     and gtkInit.cmx,
>>>              * package "lablgtk2.auto-init" that includes "gtkInit.cmo and
>>>     gtkInit.cmx" and package "lablgtk2" (gtkInit is special because it
>>>     includes code that sometime you want to use, and sometime not).
>>     First, a small note about the "auto-init" subpackage: the
>>     functionality was first made for the toplevel, and it can be nice and
>>     handy for compiled programs too (which is why it is exposed in this
>>     META) but don't abuse it.
>>     For instance, the META in godi used to always pull GtkInit. In turn,
>>     that tried to init, well, GTK+. That required running under X. Having
>>     to start an X server simply to build lablgtk2 was a bit annoying.
>>
>>     Also, this META file was made for another reason: avoiding that
>>     everything always gets linked in. The issue is not that it pulls more
>>     OCaml modules: the _big_ issue is that it pulls C libraries too. For
>>     the packages I have on this machine, that would mean you'd need gl,
>>     glade, gnomecanvas, gnomeui (so many more gnome components most of the
>>     time), gtkspell, rsvg, sourceview2. That also makes binary
>>     distribution harder.
>>
>>     There has also been issues with GL support (not because of lablgtk2,
>>     but because of the underlying C libs which aren't always available) so
>>     it's better to make it possible to chose.
>>
>>     I considered also making a big meta-package with all the subpackages
>>     but then, people would have been unhappy because it would have had one
>>     more dep than they wanted and I would have had to make meta-packages
>>     with n-1 subpackages. And so on. :-)  I thought there would be no
>>     solution that pleased everyone.
>>
>>>     - Is that a problem to include in an ocamlfind package (through variable
>>>     "require") an archive (cma, cmx, cmxs) that is not used after ?
>>     It's not an issue. Most of the time, the module should even be
>>     unlinked in the final executable (watch out if you're using dynlink).
>>
>>>     - does including all available packages through variable "require" make
>>>     an executable that takes more space ? If yes, could ocamlfind handle
>>>     this so that it does not include unused packages?
>>     Yes and no. And it's ocaml which already handles that. It also depends
>>     on how things are done in the library and its META file. I haven't
>>     checked how it behaved in lablgtk2 but if there are reports, I'd be
>>     interested in them.
>>
>>>     - if the purpose of making many packages is only to see what is
>>>     available through ocamlfind query, maybe it would be interesting that
>>>     ocamlfind query lists all available files associated to a package?
>>     Which files do you mean? .cmxa files for instance? If so, ocamlfind
>>     query can already do that; the syntax is a bit hard to get right
>>     however (proof: I'm not even going to try to give it right now).
>>
>>>     - If find this line rather strange : exists_if =
>>>     "lablgtkgl.cma,lablgtkgl.cmxa,lablgtkgl.cmxs"
>>>            * lablgtkgl.cma and lablgtkgl.cmxa are part of the variable
>>>     "archive", so what is the point in having it there too ?
>>>            * lablgtkgl.cmxs enables package "gl", but is not used in any
>>>     variable "require"
>>     The documentation for exists_if states that the subpackage will exist
>>     if any of the files given exists so the goal look correct to me.
>>     However, I don't know if "exists_if" implicitely includes "archive" (I
>>     don't think so).
>>
>>>     - It seems ocamlfind lacks two clear variables that are actually
>>>     undertaken by exists_if and requires :
>>>            * variable "depends" (actually, "exists_if" and "requires") that
>>>     tells that this package can only work if the specified sub packages are
>>>     here. If not, package would be disabled. (e.g "lablgtk2.auto-init" that
>>>     depends on "lablgtk2").
>>     With "lablgtk2" being the main-package, "lablgtk2.auto-init" already
>>     requires "lablgtk2". You can try using "ocamlfind ocamlopt -package
>>     lablgtk2.auto-init ...", it should just work(tm).
>>
>>>            * variable "includes" (actually "requires", roughly) that includes
>>>     other packages, if available, so that the user do not need to also
>>>     specify them (e.g : "lablgtk2" would include "lablgtk2.glade",
>>>     "lablgtk2.gl  <http://lablgtk2.gl>" if they are here)
>>     As I've stated earlier, that's something I quite opposed to because it
>>     would require far too many things or it would change from one
>>     configuration to another (through the exists_if mechanism).
>>
>>>     - it would be nice that ocamlfind gives examples such as the lablgtk2
>>>     one, to show how to design a good META file.
>>     The META(5) documentation is pretty good but I have to agreee that it
>>     lacks an example. This lablgtk2 META file has been made after reading
>>     several other META files, most notably Debian's for lablgtk2, and
>>     lwt's. Having pointers to existing good files in the documentation
>>     would be nice.
>>
>>     Btw, this META file tries to provide a pretty good compatibility with
>>     the one in Debian, the on in godi and the old upstream one (which
>>     includes Fedora). It is going to require some updating but it should
>>     be trivial and there shouldn't be anything to fear in migrating. :-)
>>
>>     Regards,
>>     Adrien Nader
>>
>
>
>
>     _______________________________________________
>     Godi-list mailing list
>     [email protected] <mailto:[email protected]>
>     https://godirepo.camlcity.org/mailman/listinfo/godi-list
>

_______________________________________________
Lablgtk-list mailing list
[email protected]
https://lists.ocamlcore.org/cgi-bin/listinfo/lablgtk-list