From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail From: Simon Wright Newsgroups: comp.lang.ada Subject: Re: Building an encapsulated library that uses GNAT sockets under Windows Date: Tue, 26 Apr 2016 22:23:50 +0100 Organization: A noiseless patient Spider Message-ID: References: <58a4942a-452a-4f32-b39b-f8f1fdbfe9fb@googlegroups.com> <68353b5d-94dc-4604-bdb1-00b48396ec1b@googlegroups.com> <33e880a1-df5f-450c-89e0-9b1d1a95e12f@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: mx02.eternal-september.org; posting-host="6e1b8fc3eb07ad055fcf36cde3a9ae8e"; logging-data="16742"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18StFoe66/mkljoYGGG3iDExCIH+BCv3rA=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (darwin) Cancel-Lock: sha1:IF1gNJmE8tKP0Jsk/ryz9D/0Zqo= sha1:cF7BXKWAtDIKHjIBGo32NniT180= Xref: news.eternal-september.org comp.lang.ada:30295 Date: 2016-04-26T22:23:50+01:00 List-Id: "Dmitry A. Kazakov" writes: > On 2016-04-23 23:16, Simon Wright wrote: >> "Dmitry A. Kazakov" writes: >> >>> Can [gprlib] build a static equivalent too? I.e. a static library >>> containing a closure of all referenced objects plus initialization >>> code. >> >> I'm not sure it's relevant, but I posted a bug[1] on gnatmake & >> static standalone libraries; I sent AdaCore a similar report on >> gprbuild, no reply. >> >> The problem was, for a static SAL, the using Ada main program needs >> to see all the ALIs for it to be sure to call in all the dylibs >> required by the library; so if e.g. libgnarl was only called by >> non-interface units it would get linked but not elaborated. >> >> I wanted to use SALs because they automatically populate the include >> directory with relevant source. > > How do you build a static stand-alone library? In my case gprbuild > wants it dynamic. I see what you mean, I've been calling it the wrong thing all these years. If you provide a Library_Interface and you're building a dynamic library, gprbuild populates the include Library_Src_Dir directory with the library interface units and builds a dynamic library with auto-initialization. If you provide a Library_Interface and you're building a static library, gprbuild uses the same rule to populate the include directory; but this mey be wrong if the non-visible units require elaboration (e.g. they call in the tasking runtime). The patch I provided meant that if you provided a Library_Interface for a static library, the include directory would be populated with all the units regardless of whether they were actually listed; I now see that using Interfaces and naming all the source files achieves the same effect! so no need for a patch (but maybe a blog posting?) For the BCs this would mean case Library_Type is when "relocatable" => for Library_Src_Dir use "./include"; for Library_Interface use Source_Units; when "static" => for Library_Src_Dir use "./include"; for Interfaces use Sources; end case; where I already have Source_Units := ( "BC.Containers.Bags.Bounded", "BC.Containers.Bags.Dynamic", ... and Sources := ( "bc-containers-bags-bounded.adb", "bc-containers-bags-bounded.ads", "bc-containers-bags-dynamic.adb", "bc-containers-bags-dynamic.ads", ... I don't really like the idea of using Library_Interface (what units should be visible) to indicate that auto-initialization is required; especially because there are already Library_Standalone and Library_Auto_Init. Perhaps they weren't available at the time. > Another question is regarding the library interface. gprbuild rejects > interface units from other projects. But usually the library is just a > combination of many projects some of which providing interface units. You would only need to know about the interface units of other libraries if you were going to call them yourself directly.