|
Prev: Why I hate Gtk+/GNOME (from the perspective of an Ada supporter)
Next: Small changes in Ada handling in Gentoo
From: Simon Wright on 24 Jan 2008 00:27 This relates to building TASH as a library (static, libtash.a) using GNAT Project, as in GNAT-GPL-2007. As well as Ada source, this library needs two C-sourced units to act as wrappers for macros in the Tcl/Tk header files. I can do this by hand (obviously only for a static library) by doing this after gnatmake has done its part: gcc -c -g -O2 -I/usr/include tclmacro.c gcc -c -g -O2 -I/usr/include tkmacro.c ar -r lib/libtash.a tclmacro.o tkmacro.o ranlib lib/libtash.a but can't help feeling there should be a way to tell gnatmake to do this! So far I have with "../tash_options"; project Build_Tash_Library is for Library_Name use "tash"; for Languages use ("Ada","C"); for Library_Interface use ( "cargv", "chelper", "tash.arrays", "tash.file", "tash.file_io", "tash.float_arrays", "tash.float_lists", "tash.floats", "tash.integer_arrays", "tash.integer_lists", "tash.integers", "tash.lists", "tash.platform", "tash.regexp", "tash.strings", "tash.system", "tash", "tcl.ada", "tcl.tk.ada", "tcl.tk", "tcl" ); for Source_Files use ( "tclmacro.c", "tkmacro.c", "cargv.adb", "cargv.ads", "chelper.adb", "chelper.ads", "tash-arrays.adb", "tash-arrays.ads", "tash-file.adb", "tash-file.ads", "tash-file_io.adb", "tash-file_io.ads", "tash-float_arrays.ads", "tash-float_lists.ads", "tash-floats.adb", "tash-floats.ads", "tash-integer_arrays.ads", "tash-integer_lists.ads", "tash-integers.adb", "tash-integers.ads", "tash-lists.adb", "tash-lists.ads", "tash-platform.adb", "tash-platform.ads", "tash-regexp.adb", "tash-regexp.ads", "tash-strings.adb", "tash-strings.ads", "tash-system.adb", "tash-system.ads", "tash.adb", "tash.ads", "tcl-ada.adb", "tcl-ada.ads", "tcl-tk-ada.adb", "tcl-tk-ada.ads", "tcl-tk.adb", "tcl-tk.ads", "tcl.adb", "tcl.ads" ); for Object_Dir use ".build_lib"; for Library_Kind use "static"; for Library_Src_Dir use "lib"; for Library_Dir use "lib"; package IDE is for Compiler_Command ("ada") use "gnatmake"; for Gnatlist use "gnatls"; for VCS_Kind use "CVS"; end IDE; package Builder is for Default_Switches ("ada") use ("-m", "-g"); end Builder; package Compiler is for Default_Switches ("ada") use Tash_Options.Compiler_Options; for Default_Switches ("C") use ("-c", "-g", "-O2", "-I/usr/include"); end Compiler; end Build_Tash_Library;
From: Per Sandberg on 24 Jan 2008 00:54 Simon, The project file looks ok to me but gnatmake only accepts Ada so you need to use gprmake to use other languages. /Per Simon Wright wrote: > This relates to building TASH as a library (static, libtash.a) using > GNAT Project, as in GNAT-GPL-2007. > > As well as Ada source, this library needs two C-sourced units to act > as wrappers for macros in the Tcl/Tk header files. > > I can do this by hand (obviously only for a static library) by doing > this after gnatmake has done its part: > > gcc -c -g -O2 -I/usr/include tclmacro.c > gcc -c -g -O2 -I/usr/include tkmacro.c > ar -r lib/libtash.a tclmacro.o tkmacro.o > ranlib lib/libtash.a > > but can't help feeling there should be a way to tell gnatmake to do > this! > > So far I have > > with "../tash_options"; > > project Build_Tash_Library is > > for Library_Name use "tash"; > for Languages use ("Ada","C"); > for Library_Interface use > ( > "cargv", > "chelper", > "tash.arrays", > "tash.file", > "tash.file_io", > "tash.float_arrays", > "tash.float_lists", > "tash.floats", > "tash.integer_arrays", > "tash.integer_lists", > "tash.integers", > "tash.lists", > "tash.platform", > "tash.regexp", > "tash.strings", > "tash.system", > "tash", > "tcl.ada", > "tcl.tk.ada", > "tcl.tk", > "tcl" > ); > for Source_Files use > ( > "tclmacro.c", > "tkmacro.c", > "cargv.adb", > "cargv.ads", > "chelper.adb", > "chelper.ads", > "tash-arrays.adb", > "tash-arrays.ads", > "tash-file.adb", > "tash-file.ads", > "tash-file_io.adb", > "tash-file_io.ads", > "tash-float_arrays.ads", > "tash-float_lists.ads", > "tash-floats.adb", > "tash-floats.ads", > "tash-integer_arrays.ads", > "tash-integer_lists.ads", > "tash-integers.adb", > "tash-integers.ads", > "tash-lists.adb", > "tash-lists.ads", > "tash-platform.adb", > "tash-platform.ads", > "tash-regexp.adb", > "tash-regexp.ads", > "tash-strings.adb", > "tash-strings.ads", > "tash-system.adb", > "tash-system.ads", > "tash.adb", > "tash.ads", > "tcl-ada.adb", > "tcl-ada.ads", > "tcl-tk-ada.adb", > "tcl-tk-ada.ads", > "tcl-tk.adb", > "tcl-tk.ads", > "tcl.adb", > "tcl.ads" > ); > for Object_Dir use ".build_lib"; > for Library_Kind use "static"; > for Library_Src_Dir use "lib"; > for Library_Dir use "lib"; > > package IDE is > for Compiler_Command ("ada") use "gnatmake"; > for Gnatlist use "gnatls"; > for VCS_Kind use "CVS"; > end IDE; > > package Builder is > for Default_Switches ("ada") use ("-m", "-g"); > end Builder; > > package Compiler is > for Default_Switches ("ada") use Tash_Options.Compiler_Options; > for Default_Switches ("C") use ("-c", "-g", "-O2", "-I/usr/include"); > end Compiler; > > end Build_Tash_Library; >
From: Simon Wright on 24 Jan 2008 01:05 Simon Wright <simon.j.wright(a)mac.com> writes: > As well as Ada source, this library needs two C-sourced units to act > as wrappers for macros in the Tcl/Tk header files. > > I can do this by hand (obviously only for a static library) by doing > this after gnatmake has done its part: > > gcc -c -g -O2 -I/usr/include tclmacro.c > gcc -c -g -O2 -I/usr/include tkmacro.c > ar -r lib/libtash.a tclmacro.o tkmacro.o > ranlib lib/libtash.a > > but can't help feeling there should be a way to tell gnatmake to do > this! OK, this seems to work: gprmake -P build_tash_library.gpr gnatmake -P build_tash_library.gpr because gnatmake includes all the objects it finds in the object directory in the resulting library. Is this The Way?
From: Simon Wright on 24 Jan 2008 03:33
Per Sandberg <per.sandberg(a)bredband.net> writes: > The project file looks ok to me but gnatmake only accepts Ada so you > need to use gprmake to use other languages. Got it, thanks. The next problem (may only be a Darwin thing) is that I was trying to construct a static standalone library. It looks as though a client gnatmake may manage to work out the required elaboration but may not compute the library dependencies right: eg, if the main program doesn't use tasking and neither do the used parts of the library, things appear to work; but if the used parts of the library use tasking, the binder leaves out libgnarl (I only have .a, didn't build .dynlib). I'm not even sure that elaboration is OK, because when I added -largs -lgnarl it linked but I got a segv at runtime. Workround: don't try to build a standalone static library! (ie, leave out the Library_Interface attribute). This does mean copying the source files to an include directory (can be the same as the object directory). Good to see the -p switch for {gnat,gpr}make (create required output directories if needed). |