The Big Online Book of Linux Ada Programming
An online documentation project.
Last Updated: February 14, 2004
Copyright © 1999-2004, Ken O. Burtch. All Rights Reserved.
Permission given to copy (including printing and photocopying) this document
for education purposes provided this notice is kept intact.
Do you want to develop Linux applications twice as
fast as typical C language applications?
Read on! |
Special Thanks To
Jean-Marc Bourguet (C++ exceptions)
Mike Brenner (Pure)
Jeff Creem (user stack and errno clarifications)
Warren W. Gay (Ada Streams)
Bernhard Gubanka (Debugging Pools clarifications)
Eric L. Schott, Warren W. Gay, Jean-Marc Bourguet (Adjust vs. C++ Copy
Constructors)
Rush Kesler (PDF version)
Rolf Offermanns (currency.adb corrections)
Jürgen Pfeifer (Multithreading information)
Karl Ranseier and Preben Randhol (sound bugs)
Duncan Sands (Fortran, Elaborate_All)
Erik Sigra (Automake)
Wilhelm Spickermann (CVS)
Leonid A. Timochouk (Florist clarifications)
Michael Uplawski (typing mistake)
Björn Lundin (message queues)
Talk with the author at ken-nospam@pegasoft.ca (remove the "-nospam").
Hosted by
PegaSoft Canada.
Special thanks to the
Ada Linux Team.
Table of Contents
i. Preface
1 Introduction
1.1 A Brief History of Linux
1.2 1995: The Year of Ada and Gnat
1.3 Why use Ada?
1.4 Why Ada and Linux?
1.5 Linux Ada Resources
2 Installing Gnat on Linux
2.1 Installing the ALT RPMs
2.2 Installing the ACT Binaries
2.3 Compiling Gnat from its Sources
2.4 Case Study: Building GCC 3.2 with Ada
2.5 Compiling Older Versions of Gnat from Sources
2.6 Case Study: Installing Gnat 3.11 on over an
old Linux Distribution
2.7 Gnat and Windows
3 The Integrated Development Environments
3.1 TIA: The Console IDE
3.1.1 Quick Start
3.1.2 TIA Keyboard Legend
3.1.3 The File Menu
3.1.4 The Edit Menu
3.1.5 The Find Menu
3.1.6 The Misc Menu
3.1.7 The Project Menu
3.1.8 The ? Menu
3.2 GRASP-the X windows IDE
3.2.1 Installation
3.2.2 QuickStart
3.2.3 The Project Window
3.2.4 The Source File Window
3.2.5 The Button Bar
3.3 Other Tools and IDEs
3.3.1 VAD - an IDE
3.3.2 Jessie - an IDE
3.3.3 RAPID - a GUI builder
3.3.3 VIDE - an IDE
3.3.5 GLIDE - an GUI builder
3.3.6 AdaGIDE (for Win32)
3.3.7 AdaBrowse - documentation tool
3.4 BUSH (AdaScript Business Shell)
4 From Source Code to Executable
4.1 Gnat Filename Conventions
4.2 Writing Your First Ada Program
4.2.1 Writing a Program with an IDE
4.2.2 Writing a Program without an IDE
4.2.3 After Building
4.3 The Three Step Process
4.4 Gnat Compiling Options
4.4.1 Run-time Error Checking
4.4.2 Checking without Compiling
4.4.3 When you have Too Many Errors
4.5 Gnat Binding Options
4.6 Gnat Linking Options
4.7 Gnatmake Options
4.7.1 So you changed the comments ?
4.7.2 Gnatbl: Bind and Link
5 Building Large Projects
5.1 Make: the Traditional Project Builder
5.1.1 A Simple Ada Makefile
5.2 Cook: A Parallel Make
5.2.1 Cooking in Parallel
5.2.2 A Simple Ada Cookbook
5.3 Automake and Autoconf: UNIX Portability
5.4 PRCS: Project-wide Source Control
6 Development Utilities
6.1 Saving Time with Gnatstub
6.2 Crossreferencing with Gnatxref
6.3 Eliminating Dead Code with Gnatelim
6.4 Execution Stack & Memory Leak Detection
6.5 Conditional Compiling with Gnatprep
6.6 Profiling with gprof
6.7 Static Libraries and Shared Libraries (gnatdll)
6.8 Source as Web Pages Using GnatHTML
6.9 GnatFIND
7 Optimizing Your Project
7.1 Compiler Optimization Options
7.2 Gnat Source Optimization Options
7.3 CPU Optimization Options
7.4 What Differnece Does Optimization Make?
7.5 Working with the Assmebly Source
8 Debugging Your Project
8.1 Limit and the Heap Size
8.2 The Debugging Pragmas
8.3 Identifying Files
8.4 Compiler Info with -gnatG
8.5 Floating Point Numbers
8.6 Gdb: The GNU Debugger
8.7 Code Restrictions
9 Team Development
9.1 Change Logs
9.2 RCS: Revision Control System
9.3 CVS: Concurrent Versions System
9.4 Creating Transcripts with Script
9.5 Timing Execution with Time
10 An Introduction to Ada
10.1 Your Main Program
10.2 Text_IO
10.3 Fundamental Data Types
10.4 Type Attributes
10.5 Operatiors and Expressions
10.6 Variable Declarations
10.7 New Types
10.7.1 Modular Types
10.7.2 Text_IO and New Types
10.8 Aggregate Types
10.9 Enumerated Types
10.10 Procedures and Function
10.11 Flow of Control
11 Advanced Ada Programming
11.1 Packages
11.2 Controlling Elaboration
11.2.1 First line of defense: Pure, Preelaborate and No_Elaboration_Code
11.2.2 Second line of defense: Elaborate, Elaborate_Body, Elaborate_All
11.2.3 Other Elaboration Pragmas
11.3 Objects
11.4 Objects with Automatic Initialization/Finalization
11.5 Multiple Inheritance
11.6 Private Objects
11.7 Generics
11.8 Exceptions
11.9 Dynamic Allocation
11.10 Callbacks
11.10.1 Storage Pools
11.10.2 Access Parameters
11.11 Multithreading
11.11.1 FSU vs. Native Threads
11.11.2 Tasks
11.11.3 Task Types
11.11.4 Protected Items/Types
11.12 Ada Text Streams
11.13 Pragmas
11.14 Low-Level Ada
12 Standard Gnat Packages
12.1 Standard String and Character Packages
12.1.1 String Performance
12.2 Advanced Input/Output
12.2.1 GNAT.IO
12.2.2 GNAT.IO_Aux
12.3 Sequential_IO
12.4 Direct_IO
12.5 Formatted Output
12.6 Calendar Package
12.7 Tags Package
12.8 Tables
12.8.1 Dynamic Tables [Not Yet Written]
12.9 Hash Tables
12.10 Bubble and Heap Sorts
12.11 Regular Expressions
12.12 Advanced String Processing
12.13 GLADE Distributed Processing [not finished]
12.14 Basic Math Packages
12.15 Exception Handling and Traceback Packages
12.16 GNAT.Most_Recent_Exception [Not Yet Written]
12.17 GNAT.Exception_Traces Package [Not Yet Written]
12.18 GNAT.CGI [Not Yet Written]
12.19 GNAT.CGI.Cookies [Not Yet Written]
12.20 GNAT.AWK [Not Yet Written]
12.21 GNAT.Threads [Not Yet Written]
12.22 GNAT.Expect [Not Yet Written]
13 Linux Introduction
13.1 Introduction to Processes
13.1.1 Parents, Children and Families
13.1.2 Ownership and Permissions
13.2 Using System and OsLib.Spawn
13.3 The Linux Environment
13.4 Standard C Libraries
13.5 The Linux Kernel
13.5.1 Kernel Calls
13.5.2 Devices
13.5.3 Proc File System
13.5.4 AudioCD: An Example Program
13.6 Standard Input/Output/Error
13.8 Linux Binary Formats
13.9 Linux Libraries
13.10 Libc5, Libc6 and Upward Compatibility
13.11 Linux Basics
14 Linux Programming
14.1 Gnat OS Library
14.2 Installing Binding Packages
14.3 Catching Linux Signals
14.3.1 Ada.Interrupts.Signals [Not Yet Written]
14.4 Working with the Command Line
14.4 Linux Environment Variables
14.6 GNAT.Directory_Operations Package
14.7 GNAT.Lock_Files Package
14.8 GNAT.Sockets
15 Free Ada Bindings
15.1 Using Florist, a POSIX binding
15.2 Using Texttools
15.2.1 Installation
15.2.2 Introduction
15.2.3 Package Overview
15.2.4 Window Overview
15.2.5 Other Useful Window Manager Subprograms
15.2.6 Alerts
15.2.7 Other Predefined Windows
15.2.8 Control Overview
15.2.9 OS Package
15.2.10 UserIO Overview
15.2.11 Appearance and Keys
15.3 Using Ncurses [not finished]
15.4 Using GTK+ Widgets [not finished]
15.5 Using Motif Widgets [not finished]
15.6 Using the TASH TCL Binding [not finished
15.7 Using the Mesa/OpenGL Binding [not finished]
15.8 Engine_3D
15.9 Using the APQ Postgres Binding
15.10 GNU.PDF - A PDF Package
15.11 Gwindows (for Win32) - GUI, DB, ActiveX
15.12 GNATCOM and DirectX (for Win32)
15.13 Graph - plotting library
16 Advanced Linux Programming
16.1 Writing Your Own Bindings
16.2 Linux Errors and Errno
16.3 The Linux Clock
16.3.1 Basic time functions
16.3.2 Timeval Calls - Microsecond Accuracy
16.3.3 Functions Using the tm Record
16.3.4 Time as a String
16.3.5 Timer Functions
16.4 Process Information
16.4.1 Ownership
16.4.2 Other Functions
16.5 Environment Variables
16.6 Multitasking
16.7 Linux File Operations
16.8 Opening and Closing Files
16.9 Directories
16.10 Stdio Files
16.11 Stdio Pipes
16.12 Memory Management
16.13 The Virtual Consoles
16.14 Making Database Queries
16.14.1 mySQL [not finished]
16.14.2 PostgreSQL [not finished]
16.15 Dynamic Loading [not finished]
16.16 Writing Linux Modules
16.17 Linux Sound
16.17.1 Detecting a Sound Card
16.17.2 Playing Sound Samples
16.17.3 Using the Mixer
16.17.4 Recording Sound Samples [not finished]
16.18 Audio CDs
16.19 Kernel Pipes [not finished]
16.20 Shared Memory [not finished]
16.21 Message Queues
16.22 Semaphores [not finished]
16.23 Sockets
16.24 Memory Management
16.25 Exit Procedures
17 Translating To Ada
17.1 c2ada: Translating Your Programs
17.2 Interfaces.C package
17.3 Interfaces.C.Pointers package
17.4 Interfaces.C_Streams package
17.5 Ada and C Files
17.6 A Word on Interfaces.Fortran
17.7 P2Ada - Pascal to Ada
18 Data Structures
18.1 Using the Booch Components
18.1.1 Containers
18.1.2 Iterators
18.1.3 Single linked Lists
18.1.4 Double linked Lists
18.1.5 Bags
18.1.6 Sets
18.1.7 Collections
18.1.8 Queues
18.1.9 Stacks
18.1.10 Deques
18.1.11 Rings
18.1.12 Maps
18.1.13 Binary Trees
18.1.14 AVL Trees
18.1.15 Multiway Trees
18.1.16 Graphs
18.1.17 Smart Pointers
18.1.18 Booch Multithreading
19 Java Byte Code and Mixing Languages
19.1 Ada Meets Java
19.1.1 The Java Virtual Machine
19.1.2 JGNAT [unfinished]
19.2 ASIS
19.3 Assembly Language
19.3.1 Pentium Family Processors
19.3.2 Instruction Set
19.3.3 Operands
19.3.4 System.Machine_Code.Asm
19.3.5 Other Asm Flags
19.3.6 A Complete Example
19.4 Calling Ada from C
19.5 Calling C++ from Ada
19.6 Calling Ada from C++
19.7 Calling Ada from Java
20 Developing Your Project
20.1 The Project Proposal
20.2 The Design Phase
20.3 The Development Phase
20.4 The Alpha/Beta Release
20.5 Releasing Your Software
20.5.1 A Third Party Library
20.6 Distribution Formats
20.6.1 RPM: Red Hat Package Manager [not finished]
20.6.2 TGZ Packages
20.6.3 TAR.BZ2 Packages
20.6.4 Other Formats
20.7 Man Pages
20.8 Linux Software Map Entry
20.9 Licensing Options
Appendices
Appendix A: The Linux Shell
Appendix B: Linux Error Codes
Appendix C: Linux Kernel Calls
Appendix D: Signals
Appendix E: Ioctl parameters
Appendix F: Overview of Gnat Packages
Glossary