/* * This file documents the process of porting JACK to new platforms. * It is part of the JACK reference manual, built using doxygen. */ /** @page porting-guide Porting JACK The @ref index is designed to be portable to any system supporting the relevant POSIX and C language standards. It currently works with GNU/Linux and Mac OS X on several different processor architectures. This document describes the steps needed to port JACK to another platform, and the methods used to provide portability. - @ref portrequirements - @ref portoverview - @ref portopsys - @ref portcpu - @ref portissues @section portrequirements Requirements - Each platform should build directly from CVS or from a tarball using the GNU @c ./configure tools. Platform-specific toolsets can by used for development, but the GNU tools should at least work for basic distribution and configuration. - For long-term maintainability we want to minimize the use of conditional compilation in source files. - We should provide generic versions of all system-dependent headers, so platforms need only provide those they modify. - In some cases, operating system-specific information must be able to override processor-specific data. @section portoverview Overview JACK relies on two types of platform-specific headers: - @ref portopsys - @ref portcpu OS-specific headers take precedence over CPU-specific headers. The JACK @c configure.host script and its system-dependent header directories were adapted from the @c libstdc++-v3 component of the GNU Compiler Collective, . @section portlang C Language Dependencies JACK is written to conform with C99, as defined in International Standard ISO/IEC 9899:1999. Because many existing compilers do not fully support this standard, some new features should be avoided for portablility reasons. For example, variables should not be declared in the middle of a compound statement, because many compilers still cannot handle that language extension. @section portopsys Operating System Dependencies JACK is written for a POSIX environment compliant with IEEE Std 1003.1-2001, ISO/IEC 9945:2003, including the POSIX Threads Extension (1003.1c-1995) and the Realtime and Realtime Threads feature groups. When some needed POSIX feature is missing on a platform, the preferred solution is to provide a substitute, as with the @c fakepoll.c implementation for Mac OS X. Whenever possible, OS dependencies should be auto-detected by @c configure. Sometimes they can be isolated in OS-specific header files, found in subdirectories of @c config/os and referenced with a @c name. If conditional compilation must be used in mainline platform-independent code, avoid using the system name. Instead, @c \#define a descriptive name in @c , and test it like this: @code \#ifdef JACK_USE_MACH_THREADS allocate_mach_serverport(engine, client); client->running = FALSE; \#endif @endcode Be sure to place any generic implementation alternative in the @c \#else or use an @c \#ifndef, so no other code needs to know your conditional labels. @section portissues Issues Not Addressed - Cross-compilation has not been tested, or even thought through in much detail. The @a host is the system on which JACK will run. This may differ from the @a build system doing the compilation. These are selected using the standard @c ./configure options @c --host and @c --build. Usually, @c ./config.guess can print the appropriate canonical name for any system on which it runs. - Platform-specific build tools like Apple's Project Builder are not well-supported. */