* Build order with gprbuild @ 2023-02-28 21:10 Gautier write-only address 2023-02-28 22:07 ` Dmitry A. Kazakov 2023-03-02 22:29 ` Simon Wright 0 siblings, 2 replies; 8+ messages in thread From: Gautier write-only address @ 2023-02-28 21:10 UTC (permalink / raw) When a GNAT project A depends on project B, is there a simple (*) way to make gprbuild build project B before starting the build of A? It would be useful when project B generates Ada sources… Example: with "code_generation.gpr"; project Main is for Source_Dirs use (".", "gen"); for Object_Dir use "obj"; for Create_Missing_Dirs use "True"; -- Flips by default the "-p" switch for Main use ("main.adb"); end Main; (*) By “simple” I mean simpler than the way described here: https://www.adacore.com/gems/gem-157-gprbuild-and-code-generation ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-02-28 21:10 Build order with gprbuild Gautier write-only address @ 2023-02-28 22:07 ` Dmitry A. Kazakov 2023-03-01 20:08 ` Gautier write-only address 2023-03-02 22:29 ` Simon Wright 1 sibling, 1 reply; 8+ messages in thread From: Dmitry A. Kazakov @ 2023-02-28 22:07 UTC (permalink / raw) On 2023-02-28 22:10, Gautier write-only address wrote: > When a GNAT project A depends on project B, is there a simple (*) way to make gprbuild build project B before starting the build of A? But this is exactly how it works unless B builds a library. I have a large number of interdependent projects and everything is built automatically as necessary. When it comes to a release, I generate the corresponding library building projects from a script. Another reason not to use libraries during the development phase is that addr2line does not work with dynamic libraries. You must catch exception in the program and find where addresses belong to. This cannot be done when the program is no more running. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-02-28 22:07 ` Dmitry A. Kazakov @ 2023-03-01 20:08 ` Gautier write-only address 2023-03-02 14:11 ` AdaMagica 0 siblings, 1 reply; 8+ messages in thread From: Gautier write-only address @ 2023-03-01 20:08 UTC (permalink / raw) Between normal Ada projects, everything works as you describe (and as expected). However, in the special case where project B, instead of transforming Ada files into .o files, transforms other kind of files into Ada files that are with-ed by units of project A, things get off the road: project A doesn't see out-of-date Ada files produced by project B. Here is a full example. Files are reproduced below (they are meant to land into the same directory). Then you do the following commands: gprbuild -P fuzzy_gen.gpr gprbuild -P code_generation.gpr gnatstudio -P main.gpr First build launched from GNAT Studio does the following on my machine: Compile [Ada] main.adb [Fuzzy] x789.cfg Ada file "fuzzy_x789.adb" is up to date [Fuzzy] x456.cfg Ada file "fuzzy_x456.adb" is up to date [Fuzzy] x123.cfg Ada file "fuzzy_x123.adb" is up to date [Ada] fuzzy_x123.adb [Ada] fuzzy_x456.adb [Ada] fuzzy_x789.adb Bind [gprbind] main.bexch [Ada] main.ali Link [link] main.adb Second build has an expected output as well: Compile [Fuzzy] x789.cfg Ada file "fuzzy_x789.adb" is up to date [Fuzzy] x456.cfg Ada file "fuzzy_x456.adb" is up to date [Fuzzy] x123.cfg Ada file "fuzzy_x123.adb" is up to date gprbuild: "main.exe" up to date Now, say you modify x123.cfg and save it. Compile [Fuzzy] x789.cfg Ada file "fuzzy_x789.adb" is up to date [Fuzzy] x456.cfg Ada file "fuzzy_x456.adb" is up to date [Fuzzy] x123.cfg Converting "x123.cfg" into "fuzzy_x123.adb"... gprbuild: "main.exe" up to date That's *not* what I would like: gprbuild did not detect the out-of-date file "fuzzy_x123.adb" in time. A second call to gprbuild compiles the changed "fuzzy_x123.adb" and all is well, but it is one step too late. The files ========= 1) The code generator ===================== fuzzy_gen.gpr: ------------- project Fuzzy_Gen is for Object_Dir use "obj"; for Exec_Dir use "gen"; for Create_Missing_Dirs use "True"; for Main use ("fuzzy_gen.adb"); end Fuzzy_Gen; fuzzy_gen.adb: ------------- with Ada.Calendar, Ada.Command_Line, Ada.Directories, Ada.Text_IO; procedure Fuzzy_Gen is use Ada.Command_Line, Ada.Directories, Ada.Text_IO; procedure Convert (arg : String) is cfg : constant String := Simple_Name (arg); cfg_file_name : constant String := "../" & cfg; ada_unit_name : constant String := "fuzzy_" & cfg (cfg'First .. cfg'Last - 4); ada_file_name : constant String := ada_unit_name & ".adb"; cfg_in, ada_out : File_Type; use type Ada.Calendar.Time; begin if Exists (ada_file_name) and then Modification_Time (ada_file_name) >= Modification_Time (cfg_file_name) then Put_Line ("Ada file """ & ada_file_name & """ is up to date"); return; end if; Put_Line ("Converting """ & cfg & """ into """ & ada_file_name & """..."); Open (cfg_in, In_File, cfg_file_name); Create (ada_out, Out_File, ada_file_name); Put_Line (ada_out, "function " & ada_unit_name & " return String is"); Put_Line (ada_out, "begin"); Put_Line (ada_out, " return """ & Get_Line (cfg_in) & """;"); Put_Line (ada_out, "end;"); Close (cfg_in); Close (ada_out); end Convert; begin if Argument_Count = 0 then Put_Line (Current_Error, "config file name missing"); else Convert (Argument (1)); end if; end Fuzzy_Gen; 2) The project that generates Ada files ("project B") ===================================================== code_generation.gpr: ------------------- project Code_Generation is for Languages use ("Fuzzy"); for Source_Dirs use ("."); for Object_Dir use "gen"; for Objects_Linked ("Fuzzy") use "False"; package Naming is for Body_Suffix ("Fuzzy") use ".cfg"; end Naming; package Compiler is for Driver ("Fuzzy") use "fuzzy_gen"; end Compiler; end Code_Generation; x123.cfg: -------- 123 x456.cfg: -------- 456 x789.cfg: -------- 789 3) The main project (project A) =============================== main.gpr: -------- with "code_generation.gpr"; project Main is for Source_Dirs use (".", "gen"); for Object_Dir use "obj"; for Create_Missing_Dirs use "True"; for Main use ("main.adb"); end Main; main.adb: -------- with Ada.Text_IO; with Fuzzy_X123, Fuzzy_X456, Fuzzy_X789; procedure Main is begin Ada.Text_IO.Put ("Messages from elsewhere:" & " """ & Fuzzy_X123 & '"' & " """ & Fuzzy_X456 & '"' & " """ & Fuzzy_X789 & '"'); end; ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-03-01 20:08 ` Gautier write-only address @ 2023-03-02 14:11 ` AdaMagica 2023-03-02 16:54 ` AdaMagica 0 siblings, 1 reply; 8+ messages in thread From: AdaMagica @ 2023-03-02 14:11 UTC (permalink / raw) I run all the following from the GPS window, not from a terminal (does this matter?). I ran this on windows with GNAT CE 2021, one project after the other: OK Then I changed one of the .cfg files, the main project did not notice the change as you said. I had to run code_generation alone to recreate from tne new cfg file. I ran main again: OK Then i even deleted one of the generated Ada files and reran main: To my surprise, it did not realize that one Ada file is missing. Project view of Gnat Studio for project main: Main > . >>fuzzy_gen.adb >> main.adb >Code_Generation >>. >>>x123.cfg >>>x456.cfg >>>x789.cfg Note that the generated Ada files are not shown, subdirectory gen is not shown. (The > character is used for indentation, the group swallows blanks.) Perhaps you have to define some surrogate for the .ali (Ada Library Information) files from the .cfg files additionally. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-03-02 14:11 ` AdaMagica @ 2023-03-02 16:54 ` AdaMagica 0 siblings, 0 replies; 8+ messages in thread From: AdaMagica @ 2023-03-02 16:54 UTC (permalink / raw) Project main seems to completely ignore the with clause for code_generation. I added to main for Languages use ("Ada", "Fuzzy"); which results in main.gpr:3:9: warning: there are no sources of language "Fuzzy" in this project You need to teach gprbuild to look into project code_generation when some Ada files are missing. I'm very impressed that you can teach gprbuild a new "language". ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-02-28 21:10 Build order with gprbuild Gautier write-only address 2023-02-28 22:07 ` Dmitry A. Kazakov @ 2023-03-02 22:29 ` Simon Wright 2023-03-04 19:01 ` AdaMagica 1 sibling, 1 reply; 8+ messages in thread From: Simon Wright @ 2023-03-02 22:29 UTC (permalink / raw) Gautier write-only address <gautier_niouzes@hotmail.com> writes: > When a GNAT project A depends on project B, is there a simple (*) way > to make gprbuild build project B before starting the build of A? It > would be useful when project B generates Ada sources… I know it's copping out, but I've been using an Alire pre-build action: e.g. [[actions]] type = "pre-build" command = ["make", "Simple_Buttons.gen", "Digital_IO.gen"] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-03-02 22:29 ` Simon Wright @ 2023-03-04 19:01 ` AdaMagica 2023-03-05 18:35 ` AdaMagica 0 siblings, 1 reply; 8+ messages in thread From: AdaMagica @ 2023-03-04 19:01 UTC (permalink / raw) package Compiler is for Driver ("Fuzzy") use "fuzzy_gen"; end Compiler; I'm still playing around and have problems with the Driver attribute. The documentation says; >Driver: single, indexed, case-insensitive index >Index is a language name. Value is the name of the executable for the compiler of the language. However it does not say where the executable is located, how does gprbuild find it? I moved fuzzy_gen into another directory and changed accordingly for Driver ("Fuzzy") use "path/fuzzy_gen"; Now I get unable to locate fuzzy_gen. How do I solve this problem? ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Build order with gprbuild 2023-03-04 19:01 ` AdaMagica @ 2023-03-05 18:35 ` AdaMagica 0 siblings, 0 replies; 8+ messages in thread From: AdaMagica @ 2023-03-05 18:35 UTC (permalink / raw) AdaMagica schrieb am Samstag, 4. März 2023 um 20:01:17 UTC+1: > for Driver ("Fuzzy") use "path/fuzzy_gen"; > > Now I get > unable to locate fuzzy_gen. > > How do I solve this problem? excuse me, I made a mistake in the path. Silly me. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-03-05 18:35 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-02-28 21:10 Build order with gprbuild Gautier write-only address 2023-02-28 22:07 ` Dmitry A. Kazakov 2023-03-01 20:08 ` Gautier write-only address 2023-03-02 14:11 ` AdaMagica 2023-03-02 16:54 ` AdaMagica 2023-03-02 22:29 ` Simon Wright 2023-03-04 19:01 ` AdaMagica 2023-03-05 18:35 ` AdaMagica
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox