SGI IRIX Freeware

Notes on building Open Source software on IRIX

This is a draft document to help people build open source software on IRIX. It may be missing some items but having built literally hundreds of packages on IRIX over the years we're pretty confident that most of the pitfalls are covered.

General

IRIX has a very comprehensive Unix API. Not only it is POSIX and POSIX-2 compliant, it is also compliant with XOPEN XPG/4, SVID (SystemV R4), BSD extensions, Unix 95 (Spec 1170) and more.

Software that compiles on other UNIX'es (notably those with a smaller API, like Linux and Free/Open/Net BSD), should, almost with no exceptions, compile and run smoothly on IRIX. But read on...

Still there's way too much software out there that makes non-portable assumptions or is written improperly, which may cause problems.

Here's an item list to save you time porting open source software to IRIX.





  • GNU configure and autoconf

    GNU autoconf generates configure scripts that assume that if a library exists, it should be used. This is incorrect on IRIX, which keeps some old libraries around just for the sake of backward compatibility with very old programs. This alone breaks most of the GNU utilities on IRIX. To prevent this from happening, simply force GNU configure to explicitly ignore 'libsocket', 'libnsl', 'libgen' and 'libsun'. All these interfaces have their up-to-date entries in the standard C library libc.so on IRIX 6.x.

    For example, when calling GNU configure you should use something like:

    	ac_cv_lib_gen_getmntent=no \
    	ac_cv_lib_sun=no \
            ac_cv_lib_sun_getpwnam=no \
    	ac_cv_lib_sun_getmntent=no \
            ac_cv_lib_sun_yp_match=no \
            ac_cv_lib_socket=no \
    	ac_cv_lib_socket_main=no \
    		configure ...
    
    Note that this is just an example. Make sure to look at your config.cache (or equivalent) file after configuration, and inspect it for any suspicious ac_cv_lib... entries that match one of the libraries mentioned above and force them to no (or equivalent).

  • Makefiles

    Some open source programs assume GNU make in their Makefiles. You should probably use GNU make on IRIX too. Compatibility is good. With GNU make supporting parallel makes there's really no reason to use any IRIX specific make like smake, pmake, or make.

    If you don't have GNU make for IRIX you can download it from http://freeware.sgi.com/ and not worry about Makefile portability anymore.

  • ranlib

    This is a historical BSD thing that should have been done transparently by the linker. You don't need to run ranlib in IRIX. If your Makefile calls ranlib either delete this or define it to a no-op.

    	gmake RANLIB=:  ...
    

  • install

    The Berkeley 'install' is incompatible with the SYSV version. Either upgrade to IRIX 6.5 (where the IRIX install has transparent BSD compatibility) or define:

    	gmake INSTALL=bsdinst  ...

  • BSD

    BSD programs that assume a BSD environment should compile on IRIX without change (at least in 95% of cases) by forcing BSD compatibility via CFLAGS, e.g:

    	gmake CFLAGS="-D_BSD_COMPAT ..."

    If you don't want full BSD compatibility, consider using one or more of:

    	-D_BSD_TYPES
    	-D_BSD_TIME
    	-D_BSD_SIGNALS
    
    Important: if your software is more "properly" written and uses POSIX signals (i.e. sigaction instead of signal) then you must not compile with -D_BSD_SIGNALS. Mixing signal models may cause unpredictable problems.

  • System types

    Some programs assume system types, in particular 'off_t', are 32 bit (i.e. that files don't exceed 4GB in size) These programs are making bad assumptions, but this problem can be overcome by compiling in the o32 (cc -32) ABI:

    	gmake CC="cc -32 ..."
    

  • varargs

    Some programs do not comply with the ANSI varargs syntax and conventions (i.e. include <stdarg.h> and use ellipsis in the argument list) Again, if those don't work they may start working by compiling using the o32 ABI:

    	gmake CC="cc -32 ..."
    

  • Catching other problems

    The SGI cc is verbose and pedantic. The problem is that when you get way too many warnings you start ignoring the real ones.

    To make the SGI compiler more like gcc in terms of warnings you may use something like:

    	NOWARN = -woff 1009,1014,1110,1116,1185,1188,1204,1230,1233 \
            	-Wl,-woff,85,-woff,84
    	$(CC) $(NOWARN) ...
    In your Makefiles

  • SGI cc

    While the SGI cc may look too pedantic, it can catch a lot of real source code bugs. Consider compiling with:

    	CC="cc -fullwarn ..."
    

    and really clean your source of type mismatches.

  • Multiple other problems (too many to list here)

    Over the years IRIX got thousands of bug fixes. As expected, problems on IRIX 4.0.x are much more numerous than problems on IRIX 6.5. If you can upgrade, please do. Life is way easier with IRIX 6.5.

  • Build vs. target env

    Virtually all open source packages assume that the building environment is the same as the target environment. In fact every Makefile with a 'make install' that directly installs into system directories probably makes this assumption. IRIX supports a much more elegant model of 'inst'able packages that can be built anywhere and installed anywhere else.

    It would be nice if there was a UNIX-wide standard for this. Red Hat RPM and other Linux installers are getting there, which is great.

    We usually build open source software with an IRIX 6.5 ROOT (i.e. get include files and libraries from a backward compatible 6.5 mounted directory). Assuming this directory is called /6.5_root this can be done by:

    	cc -nostdinc -I. -I/6.5_root/usr/include ...	(compiling)
    	cc -nostdlib -L/6.5_root/usr/lib32 ...		(linking)
    

    The packaging itself is an art form. At SGI we use a specialized 'install' perl script to intercept calls from 'make install'. This install adds the appropriate lines to the 'idb' file instead of actually installing files. Later, this idb file is used by 'gendist' to create the packages. Unfortunately, far too many open source packages call mv, cp, tar, etc. to install, so they bypass this mechanism. We have considered but not yet implemented other solutions, such as trapping system calls or running in a chroot directory. If you find (or implement!) a better solution please let us know.

  • gcc vs. cc

    Code that runs fine when compiled with SGI cc and doesn't run when compiled with gcc might be calling functions compiled with MIPSpro C that get passed or return structs that are smaller than 16 bytes but not 8 bytes long. gcc and SGI cc are incompatible in the way they pass these structs so compiling with gcc and linking with a shared library that was compiled with the SGI cc) can cause these problems. There are very few such library functions, but inet_ntoa, inet_lnaof, inet_netof, inet_makeaddr and semctl are all examples. Work-arounds for these particular routines have been built into libgcc.a, but that is not a general fix. If you find more instances in IRIX libraries please report them. Often a small wrapper procedure that realigns the problematic arguments will avoid the problem.

  • portable types

    Occasionally code that works on other platforms will compile fine on IRIX, but will misbehave when run. These problems can be difficult to track down, but one thing to check for is assumptions about whether char is signed or unsigned. IRIX compilers default to unsigned -- if it matters your code should be explicit!

    Setting up parallel debugging sessions and stepping through the working and non-working code simultaneously to find where they diverge is often helpful.


Additions and contributions to this list will be gratefully accepted.
freeware@sgi.com