From: brooke@cco.caltech.edu (Brooke Paul Anderson)
Newsgroups: comp.os.os2.programmer
Subject: How to get, install, and start using GNU C/C++ (the emx port)
Date: 6 Oct 1992 12:20:48 GMT
Organization: California Institute of Technology, Pasadena
NNTP-Posting-Host: sandman.caltech.edu

I finally got around to updating this document for emx-0.8e.  Please
let me know if you find any problems with it or if you have suggestions.


A FREE GNU C AND C++ SOFTWARE-DEVELOPMENT SYSTEM FOR OS/2 V2.0

by Brooke P. Anderson, 10/6/92

Brooke Anderson
1155 E. Del Mar #312
Pasadena, CA  91106
USA
Phone:  (818) 577-7555
GEnie:  BROOKE
Internet:  brooke@hope.caltech.edu

TABLE OF CONTENTS

1.0 Introduction
2.0 How to get it
3.0 How to install it
     3.1 Unz50x32.exe
     3.2 Wholeinf.zip
     3.3 Gnumk362.zip
     3.4 Emxdev.zip, gnudev.zip, and gppdev.zip
     3.5 The final steps
4.0 How to use it
     4.1 Using info
     4.2 Using the compiler
     4.3 Using the debugger
     4.4 Using make
5.0 Where to get more information
6.0 Conclusions

Appendix 1:  Optional packages
Appendix 2:  Frequently asked questions
Appendix 3:  Sources of distribution

1.0 INTRODUCTION

This document describes a free GNU C and C++ software-development
system for OS/2 v2.0.  It tells you how to acquire all the
necessary software, how to install it, how to start using it, and
where to look for more information.

The GNU software-development system includes a C and C++
compiler, a debugger, an assembler, a make utility (for
automating the compilation of programs made of many source
files), and a hypertext reader (for reading the documentation). 
The compiler generates full 32-bit, optimized code, and it
supports many OS/2 API calls, so you software developers out
there can use it for PM programming, manipulating semaphores,
manipulating threads, using named pipes, etc.  Optional packages
include curses (a standard library for manipulating screenfuls of
text and for moving the cursor), emacs (a programmer's editor), a
package for using IBM's OS/2 tool kit, and full source code for
the system.

GNU software is originally developed by the Free Software
Foundation, an organization which produces a lot of free software
for UNIX.  After the Free Software Foundation releases the UNIX
versions, people often port them to many other operation systems
(such as OS/2).  Despite the fact that the software is free, the
UNIX community considers it a standard and often prefers it over
other products because of its high quality.  The compilers, for
example, produce well-optimized code; and emacs is one of the two
most popular editors for UNIX.

Sometimes, there is more than one port of a GNU program.  For
OS/2, for example, there are two different ports of the GNU C
compiler (called "gcc").  This document discusses only one of
them (the EMX port) since the EMX port provides faster floating
point routines and since it works with a debugger.  This document
deals with version 0.8e of the EMX port, which is the latest
version.  People frequently produce new versions of and
enhancements for the GNU software and the ports based on it.

IMPORTANT:  I have not tested the software on FAT file systems. 
I think it will work, but I have not checked all of the file
names to make sure they comply with the egregious 8.3 file-naming
convention.

2.0 HOW TO GET IT

The full software-development system (and the various optional
packages described in Appendix 1) are available from a variety of
sources.  If you have access to Internet, you can get the files
from anonymous-ftp sites.  In the USA, the main anonymous-ftp
site for OS/2 is ftp-os2.nmsu.edu.  In Germany, the main
anonymous-ftp site for OS/2 is rusinfo.rus.uni-stuttgart.de.  The
files are also available on GEnie, and they might be available on
CompuServe and many other on-line services.  Also, see Appendix 3
for a list of people who are willing to distribute the whole
system through regular mail.

You need to obtain the files "emxdev.zip" (which contains
auxiliary programs), "gnudev.zip" (which contains the compiler,
the debugger, the assembler, and more auxiliary programs),
"gppdev.zip" (which contains files for the C++ compiler),
"gnumk362.zip" (which contains make), "wholeinf.zip" (which
contains a hypertext reader and all the documentation for the
compiler, the debugger, and make), and "unz50x32.exe" (a
self-extracting archive which contains unzip v5.0).  See Appendix
1 for a description of what you need for the optional packages. 
In case you need to tell someone how to find this file, is is
in "emxstart.zip".

The sizes of the various files are:  600k for emxdev.zip, 843k
for gnudev.zip, 1085k for gppdev.zip, 139k for gnumk362.zip, 623k
for wholeinf.zip, 114k for unz50x32.exe, and 10k for
emxstart.zip.

On GEnie, all the archives are (or soon will be) in the OS/2
library (library 13) of the IBMPC round table.  On
ftp-os2.nmsu.edu, unz50x32.exe is in pub/os2/2.0/archivers;
gnumk362.zip is in pub/os2/2.0/programming; wholeinf.zip and
emxstart.zip are currently in pub/downloads (but will be moving
elsewhere shortly, probably to pub/os2/2.0/programming/emx-0.8e
or pub/os2/2.0/programming/emx-0.8e/contrib); and the rest of the
files are in pub/os2/2.0/programming/emx-0.8e.  On
rusinfo.rus.uni-stuttgart.de, check in pub/os2/emx-0.8e and other
likely directories (such as those called "gnu").

3.0 HOW TO INSTALL IT

The following subsections describe how to install the various
pieces of the GNU C and C++ software-development system.  Go
through the procedures step by step as described -- the order is
important.  Don't feel compelled to read through any of the
readme files or other documentation spit out during the
unarchiving process -- I think you will have a much easier time
if you go through this document beforehand.

3.1 UNZ50X32.EXE

You will need unzip v5.0 to unarchive the files.  Earlier
versions of unzip (including PKZip versions earlier than 1.9)
will not work.

To unarchive unz50x32.exe, you simply move it to a convenient
directory and type "unz50x32".  Add the name of the directory
unzip is in to your path.  For example, I have unzip in
c:\apps\unzip, so I appended "c:\apps\unzip;" to the "SET PATH"
statement in my config.sys file.  Then reboot.  Now, you can
unarchive any zip archive by typing "unzip filename", where
"filename.zip" is the name of the archive.

3.2 WHOLEINF.ZIP

Copy wholeinf.zip to any convenient directory and unarchive it. 
It will disgorge a program called "info.exe" (the hypertext
reader), several auxiliary files, and a bunch of documentation
files for itself, the compiler, the debugger, and make.

3.3 GNUMK362.ZIP

Copy gnumk362.zip to any convenient directory and unarchive it. 
The archive will disgorge several files, including info files. 
You can delete the info directory as its contents are duplicated
in wholeinf.zip.

Add the name of the directory make is in to your path statement
in config.sys.  (I have make in c:\apps\make, so I appended
"c:\apps\make;" to the "SET PATH" statement in my config.sys.)

3.4 GNUDEV.ZIP, EMXDEV.ZIP, AND GPPDEV.ZIP

These archives create the directory ".\emx" and a bunch of
directories under that.  Thus, unarchive the files from the
directory in which you want this emx directory.  (In other words,
if you unarchive gnudev.zip in the directory "\apps", the process
will create \apps\emx, \apps\emx\bin, \apps\emx\lib, and many
other such directories.)

3.5 THE FINAL STEPS

Now, you need to modify your config.sys file.  The examples below
are from my config.sys file, and I have the emx directory
installed under c:\apps.  Thus, my system has the directories
"c:\apps\emx\dll", "c:\apps\emx\lib", "c:\apps\emx\include",
"c:\apps\emx\bin", and so on -- you will need to modify the
following examples so that the directories are specified
correctly.  

First, you need to specify in your libpath the location of
emx.dll and other dll files.  In my config.sys, I have

LIBPATH=.;C:\OS2\DLL;C:\OS2\MDOS;C:\;C:\OS2\APPS\DLL;c:\apps\emx\dll;

Second, add the name of the emx\bin directory to your path
statement in config.sys.  (I appended "c:\apps\emx\bin;" to the
"SET PATH" statement in my config.sys.)

Third, you need to set a few environmental variables so that the
compiler knows where to find and how to use various files:

set C_INCLUDE_PATH=c:/apps/emx/include
set LIBRARY_PATH=c:/apps/emx/lib
set
CPLUS_INCLUDE_PATH=C:/apps/emx/include.cpp;C:/apps/emx/include
set TERM=mono
set TERMCAP=c:/apps/emx/etc/termcap.dat

IMPORTANT:  you need to use forward slashes ("/") and not
backward slashes ("\") when setting these environmental
variables.  However, do NOT use forward slashes in your libpath
statement.

Now, reboot your machine so that these definitions take effect. 
This completes the installation process.

4.0 HOW TO USE IT

Now, you are ready to use info (the hypertext reader), to compile
programs, to debug programs, and to use make.  The next
subsections discuss each of these actions in turn.

4.1 USING INFO

Go into the directory in which info.exe resides.  Type "info". 
You are now looking at a screen that has some information on the
top half (information such as "Typing 'd' returns here, 'q'
quits, '?' lists all info commands, 'h' gives a primer for
first-timers . . .") and a list of subjects near the bottom
(subjects such as "Info", "Make," "Gcc", "Gdb", etc.).  

Go ahead and type "h" for a tutorial.  The most basic functions
to remember are:  type "q" to quit, type "?" to get a list of
commands, hit the space bar or PgDn key to go down a page, press
the Del key or the PgUp key to go up a page, press "n" to go to
the next node (think of a node as being a collection of one or
more pages dealing with a single topic), press "p" to go to the
previous node, use the up and down arrow keys to highlight
choices of new nodes to jump to, and press enter to jump to the
highlighted node.

Just play around with it a little while, and you will get the
hang of it.  Type "d" to get back to the main directory, use the
down arrow to highlight "Gcc", press enter, press the down arrow
to highlight "Contributors", press enter, scan through the pages
of text by hitting the PgDn key a couple of times, type "?" to
see a list of commands, type "p" a couple of times, etc.

4.2 USING THE COMPILER

To compile a C source file called "myprog.c", type "gcc -o
myprog.exe myprog.c".  The -o switch tells gcc that it should
call the resulting executable "myprog.exe".  To compile the C++
source file "myprog.cc", type "gcc -o myprog.exe myprog.cc
-lgpp".  C++ source files should have the extension ".cc".  The
-lgpp switch tells gcc to link the C++ libraries.  You can also
tell gcc to optimize your code by using the -O switch.  There are
two levels of optimization (-O and -O2, the highest being -O2). 
Thus, for the fastest-executing code (at the expense of time to
compile and of size of the executable), you would type "gcc -O2
-o myprog.exe myprog.c" for myprog.c and "gcc -O2 -o myprog.exe
myprog.cc -lgpp" for myprog.cc.

Note:  Specifying "-o myprog.exe" is important.  If you don't
specify ".exe" as the suffix of the output file name, the
compiler will generate a UNIX-style executable which will not run
under OS/2 even if you subsequently rename the file so that it
has a .exe extension.

4.3 USING THE DEBUGGER

To debug a program, you need to compile it with the -g switch: 
"gcc -g -o myprog.exe myprog.c" for myprog.c and likewise for
myprog.cc.  After compiling, you then type "gdb myprog.exe" to
start the debugger.  Type "h" at the debugger prompt to get a
list of help topics.  gdb supports all sorts of breakpoints
(including conditional ones), and you can watch variables, set
variables to different values, etc.  For example, to get help on
running programs from within the gdb, you can type "help
running".  That will give you a list of commands such as run,
kill, step, etc.  You can get help on individual commands by
typing, for example, "help step".

The following is a sample compile and debug session.  Go into the
emx\test directory and type "gcc -g -o hello.exe hello.cc -lgpp"
to compile hello.cc.  Type "hello" to run it, to see if the
compiler is functioning.  The program will print "Hello, world!"
on the screen.  Now type "gdb hello.exe" to start gdb.  At the
prompt "(gdb)", type "list main" to list the function "main". 
Then type "break 5" to cause execution to stop at line 5 in the
main function.  Type "run" to start execution -- it will stop at
line 5.  Type "print argc" to see the value of the variable
"argc".  Type "step" to run line 5 then halt execution at the
next line.  Type "quit" to quit.  To list a function (main(),
say) that is longer than a screenful, type "list main"; then type
"list" again to list the next screenful of main.

You can run the debugger interactively from within emacs, too. 
This arrangement provides a more visual system similar to
MicroSoft's CodeView or Borland's Integrated Development
Environment.  See Appendix 1 for details.

4.4 USING MAKE

Assume you have a program made of the following source files: 
"myprog1.c" and "myprog2.c".  You might manually compile these
files by typing "gcc -o myprog.exe myprog1.c myprog2.c".  Of
course, if you change only one of the files, typing such a
command causes the recompiling of both source files.  During
development, this could be tiresome if the files take a long time
to compile.  A better way would be to type "gcc -c myprog1.c"
which compiles myprog1.c into the object file "myprog1.o" (the -c
switch tells gcc to make an object file), then to type "gcc -c
myprog2.c" to generate myprog2.o, and finally to type "gcc -o
myprog.exe myprog1.o myprog2.o".  This way, if you change only
myprog1.c, you can recompile it and relink it with myprog2.o to
create myprog.exe (skipping the "gcc -c myprog2.c" step).  This
will be much faster if the source files take a long time to
compile (or if you have a lot of source files).

Of course, doing all this typing is tiresome, too.  Also, if
myprog1.c happens to depend on myprog1.h, and you change
myprog1.h, you must recompile myprog1.c.  Thus, you have to keep
track of all the file dependencies in order to know, after
changing one header file, which other files need to be
recompiled.

Fortunately, make takes care of all of this automatically.  All
you have to do is create one text file that describes the various
dependencies and the various steps to compile the program.  You
name the text file "Makefile".  From then on, whenever you type
"make", make examines the Makefile, looks for files which have
changed since the last compile, recompiles any files which depend
on the changed files, and relinks everything into a new
executable.

For example, suppose that myprog.exe is made from myprog1.c and
myprog2.c, that myprog1.c contains the lines "#include
"myprog1.c"" and "#include "mainhead.h"", and that myprog2.c
includes myprog2.h and mainhead.h.  The Makefile describing all
of this is

myprog.exe: myprog1.o myprog2.o
     gcc -o myprog.exe myprog1.o myprog2.o

myprog1.o: myprog1.c myprog1.h mainhead.h
     gcc -c myprog1.c

myprog2.o: myprog2.c myprog2.h mainhead.h
     gcc -c myprog2.c

The first line shows that myprog.exe depends on myprog1.o and
myprog2.o.  If either of those has changed since the last time
make was invoked, make will relink them to create myprog.exe by
giving the command under the first line.  The fourth line shows
that myprog1.o depends on myprog1.c, myprog1.h, and mainhead.h. 
If any of these three files have changed since the last time make
was run, make will recompile myprog1.o by issuing the command on
line five.  It will also realize that myprog.o has changed, that
myprog.exe depends on myprog.o, and will relink myprog.exe.  If
mainhead.h is changed, make will recompile and relink everything
since myprog1.o needs to be changed, myprog2.o needs to be
changed, and thus myprog.exe needs to be changed.

The example above shows the general form of a Makefile.  You give
a target (like "myprog.exe" or "myprog1.o") followed by a colon,
followed by a space, followed by a space-delimited list of files
the target depends on.  The next line specifies the action to be
taken when any of the dependencies change:  the first character
MUST be a tab (not just a bunch of spaces used for indentation);
then you type the command make should issue.  A Makefile is just
a list of such targets, dependencies, and actions.

5.0 WHERE TO GET MORE INFORMATION

The GNU C and C++ software-development system does not come with
documentation like that you would get with, for example, Borland
C++.  However, emxdev.doc (in the emx\doc directory) does contain
a complete list of library functions, including a list of headers
you need to include, what the functions do, and what parameters
they accept.

Also, since the C compiler is ANSI C compliant (or at least close
to it) and since the C++ compiler is very close to AT&T C++ 2.0,
you can use just about any ANSI C and AT&T C++ 2.0 reference
manuals.  I use the ones I got with an old version of Borland
Turbo C++.  If you don't have such manuals, you should be able to
find something suitable in a bookstore.  If you want a C
reference manual, I recommend C:  A Reference Manual, by S. P.
Harbison and G. L. Steele, Jr. (Prentice-Hall, 1991).  If you are
just learning C or C++, there is a large number of books to
choose from, and you shouldn't have any trouble finding one that
is suitable.

For those of you developing applications that use the PM or that
use special OS/2 functions, the system DOES support many of the
OS/2 API functions, including ones for semaphores, PM
programming, named pipes, threads, etc.  See emxdev.doc (in the
emx\doc directory) for a list of the supported functions.  (Also,
see Appendix 1 for information on an optional package that
enables you to use the full IBM OS/2 2.0 tool kit.)  The
documentation does not contain a manual on how to use these API
calls -- you need an OS/2 programming book for that.  For
information on programming the PM, take a look at OS/2 2.0
Presentation Manager GPI:  A Programming Guide to Text, Graphics,
and Printing, by G. C. E. Winn (Van Norstrand-Reinhold, 1992); or
Learning to Program OS/2 2.0 Presentation Manager by Example: 
Putting the Pieces Together, by Stephen Knight (Van
Norstrand-Reinhold, 1992).  [I  will add more titles when I find
out more information.  Does anyone have recommendations for books
on the OS/2 API in general, not just the PM?]

Also, way back when you were unarchiving, you might have been
itching to examine the various readme files and other
documentation.  Now is the time to do that to your heart's
content.  Browse through the files in the emx/doc directory and
the information available from the hypertext reader.

6.0 CONCLUSIONS

I wrote this to help people get started with a free -- yet
powerful -- 32-bit C and C++ software-development system for
OS/2.  For (at most) the price of a couple of books, you have a
full C and C++ programming system.  For the additional price of
an OS/2 programming book, you have a bargain-basement SDK.

If you find errors in this document, or if you have suggestions
for its improvement, please let me know.  My GEnie address is
"BROOKE", and my Internet address is "brooke@hope.caltech.edu".

APPENDIX 1:  OPTIONAL PACKAGES

There are four optional packages you can get for this
software-development system, packages which are not necessary but
which can nevertheless be important.

The first package contains curses.  Curses is a library of
functions that allow you to move the cursor around on the screen,
manipulate screenfuls of text, and get input.  You need the files
"bsddev.zip" and "bsddoc.zip".  The source code is available in
"bsdsrc.zip".  On ftp-os2.nmsu.edu, these files are available in
pub/os2/2.0/programming/emx-0.8e.

The second package contains emacs, the GNU programmer's editor. 
I don't like emacs, as it is too complicated for my taste. 
Nevertheless, as mentioned earlier, this is one of the two most
popular editors for UNIX, and it is very popular on many other
operating systems as well.  An interesting feature of GNU emacs
is that you can use it to interact both with the info files (the
ones used by the hypertext reader) and with the debugger.  This
latter ability provides fully-interactive debugging, similar to
what MicroSoft's CodeView or Borland's Integrated Development
Environment offers.  To use emacs, you need the files
"emacs1.zip" (which contains main files), "emacs2.zip" (which
contains more main files), "emacsp1.zip" (which contains a bug
fix), "emacsp2.zip" (which contains another bug fix),
"emacsdoc.zip" (which contains information on installing emacs),
"emacsman.zip" (which contains information on using emacs),
"emacs08e.zip" (which contains a patch so that emacs works with
emx-0.8e), and "emacsinf.zip" (which contains info files).  The
source code is available in "emacssrc.zip" and "emacspat.zip". 
On ftp-os2.nmsu.edu, these files are available in
pub/os2/2.0/gnu/emacs.

The third is a package that allows you to use IBM's OS/2 tool
kit.  You still have to buy the tool kit from IBM, but it is not
very expensive.  (In fact, currently, if you join IBM's
developers' assistance program, you can -- for about $15 -- get a
CD with lots and lots of goodies including the tool kit, a beta
version of IBM's software development kit, and a beta version of
OS/2 with Windows 3.1 capability.  Call 1-407-982-6408 or type
"go os2dap" on CompuServe for more details.  You might also be
able to find out details from IBM's 1-800-3-ibm-os2 number.) 
With this third package and IBM's tool kit, you have full use of
all OS/2 API functions.  The package consists of the files
"icc2gcc_1_1.zip", "makeimp_1_1.zip", and "16_to_32.zip".  On
ftp-os2.nmsu.edu, these files are available in
pub/os2/2.0/programming/emx-0.8e/contrib.

The fourth package contains full source code to the
software-development system.  Most people do not need the source
code to everything, but the source code to the libraries (i.e.,
to all the functions) is sometimes useful.  The source code to
the C libraries is in "emxlib.zip", and the source to the C++
libraries is in "gccsrc.zip".  install.doc (in the emx\doc
directory) gives the names of all the other relevant archives. 
They are available on ftp-os2.nmsu.edu in
pub/os2/2.0/programming/emx-0.8e and on
rusinfo.rus.uni-stuttgart.de in pub/os2/emx-0.8e.  GEnie has only
the source code to the libraries.

APPENDIX 2:  FREQUENTLY ASKED QUESTIONS

This is such a common question concerning gcc (the compiler) that
I figured I should answer it from the start:  "What's wrong with
printf()?"  People find that printf() doesn't immediately echo to
the screen; the string is held in a buffer and dumped later,
usually long after the printf() statement is executed.  This is
not really a bug -- ANSI C does not specify that printf() should
flush the I/O buffer (since it is probably more efficient on
mainframe systems with terminals to flush the I/O buffer only by
large chunks at a time).  So, to get a printf() to work like you
are probably accustomed, put an fflush(stdout) after any printf()
you want immediately displayed.

APPENDIX 3:  SOURCES OF DISTRIBUTION

This document already described some places from which you can
get the necessary archives:  ftp-os2.nmsu.edu,
rusinfo.rus.uni-stuttgart.de, GEnie, and perhaps CompuServe and
other on-line services.  However, some people don't have access
to these sites, don't have modems fast enough to download
megabytes of data in a reasonable amount of time, or can't afford
the charges which they might incur by downloading from on-line
services.  For these people, I am including the following list of
people willing to distribute the whole system through regular
mail.  Keep in mind that people might change their prices, cease
distributing the software, move, etc., so contact them first to
get current details.

Brooke Anderson
1155 E. Del Mar #312
Pasadena, CA  91106
USA
Phone:  (818) 577-7555
GEnie:  BROOKE
Internet:  brooke@hope.caltech.edu
Cost:  $18 in US; in other countries, disks + shipping + $5

Juergen Egeling
Werderstr. 41
7500 Karlsruhe
Germany
Phone:  0721-373842
FAX:  0721-373842
BITNET:  ry90@dkauni2
Internet:  ry90@ibm3090.rz.uni-karlsruhe.dbp.de
X.400:  S=ry90;OU=ibm3090;OU=rz;P=uni-karlsruhe;A=dbp;C=de
Cost:  disks + shipping + DM 25

Doug Robison
1311 Webster
Chillicothe, MO  64601
USA
Phone:  (816) 646-1085
GEnie:  D.ROBISON
Cost:  disks + shipping + $5

If you would like to get on this list and if you have access to
Internet or an on-line service, just send me your name, a
description of how people can contact you (including your e-mail
address), and how much money you want for the job (such as "$20",
"disks + shipping + $30", or whatever you want to charge).  It
would be helpful to have a list that includes people in various
countries.


                             The End