~ chicken-core (chicken-5) 1ccb70cb50e9afdf62b2a185110ac2a698b97792
commit 1ccb70cb50e9afdf62b2a185110ac2a698b97792 Merge: 2aa701a3 49042434 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Feb 25 16:13:19 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Feb 25 16:13:19 2010 +0100 resolved conflicts; enabled $ORIGIN for openbsd diff --cc csc.scm index a26037cc,35d99b7e..52f05546 --- a/csc.scm +++ b/csc.scm @@@ -62,8 -63,10 +63,10 @@@ (define mingw (eq? (build-platform) 'mingw32)) (define msvc (eq? (build-platform) 'msvc)) (define osx (eq? (software-version) 'macosx)) - (define hpux-hppa (and (eq? (software-version) 'hpux) - (eq? (machine-type) 'hppa))) + (define win (or mingw msvc)) + + (define elf - (memq (software-version) '(linux freebsd solaris))) ++ (memq (software-version) '(linux freebsd solaris openbsd))) (define (quit msg . args) (fprintf (current-error-port) "~a: ~?~%" CSC_PROGRAM msg args) diff --cc manual/Deployment index 00000000,239e8acd..6684e7a9 mode 000000,100644..100644 --- a/manual/Deployment +++ b/manual/Deployment @@@ -1,0 -1,164 +1,185 @@@ + [[tags: manual]] + [[toc:]] + + + == Deployment + + CHICKEN generates fully native binaries that can be distributed like + normal C/C++ programs. There are various methods of deployment, + depending on platform, linkage, external dependencies and wether + the application should be built from sources or precompiled and + whether the CHICKEN runtime-libraries are expected on the destination + system or if the application should be completely self-contained. + + === Simple executables + + The simplest form of deployment is the single executable. The runtime + libraries ({{libchicken.so}} or {{libchicken.dll}} is required for these + programs to run, unless you link your application statically: + + % csc myprogram.scm + % ldd myprogram # on linux + linux-gate.so.1 => (0xb805c000) + libchicken.so.5 => /home/felix/chicken/core/lib/libchicken.so.5 (0xb7c22000) + libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7bec000) + libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7be7000) + libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7a84000) + /lib/ld-linux.so.2 (0xb805d000) + % ls -l myprogram + -rwxr-xr-x 1 felix felix 34839 2010-02-22 20:19 x + + Linking your application statically will include the runtime library in the executable, + but this will increase its size substantially: + + % ls myprogram + -rwxr-xr-x 1 felix felix 3566656 2010-02-22 20:30 myprogram + + Programs distributed this way can only use [[Extensions]] if these extensions + get linked in statically, which is basically supported but not available for all + extensions. + + === Self contained applications + + The solution to many of these problems is creating an application directory that contains + the executable, the runtime libraries, extensions and additional support files needed by the + program. The executable has to be linked specially to make sure the correct included + runtime library is used. You do this by using the {{-deploy}} options provided by + the compiler driver, {{csc}}: + + % csc -deploy myprogram.scm + % ls -l myprogram + -rwxr-xr-x 1 felix felix 7972753 2010-02-22 20:19 libchicken.so.5 + -rwxr-xr-x 1 felix felix 34839 2010-02-22 20:19 myprogram + % ldd myprogram + linux-gate.so.1 => (0xb806a000) + libchicken.so.5 => /home/felix/tmp/myprogram/libchicken.so.5 (0xb7c30000) + libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7bfa000) + libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7bf5000) + libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7a92000) + /lib/ld-linux.so.2 (0xb806b000) + + As can be seen here, {{myprogram}} is prepared to load the contained {{libchicken}}, + not any installed in the system that happens to have the same name. + + You can even install extensions inside the application directory: + + % chicken-install -deploy -p $PWD/myprogram defstruct + ... + % ls -l myprogram + -rwxr-xr-x 1 felix felix 82842 2010-02-22 20:24 defstruct.import.so + -rw-r--r-- 1 felix felix 182 2010-02-22 20:24 defstruct.setup-info + -rwxr-xr-x 1 felix felix 11394 2010-02-22 20:24 defstruct.so + -rwxr-xr-x 1 felix felix 7972753 2010-02-22 20:19 libchicken.so.5 + -rwxr-xr-x 1 felix felix 34839 2010-02-22 20:19 myprogram + + (Note that the prefix must be an absolute path) + + We can check with ldd that those compiled extension libraries are linked with + the correct library: + + % ldd myprogram/*.so + /home/felix/tmp/myprogram/defstruct.import.so: + linux-gate.so.1 => (0xb7f4f000) + libchicken.so.5 => /home/felix/tmp/myprogram/libchicken.so.5 (0xb7b08000) + libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7ad2000) + libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7acd000) + libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb796a000) + /lib/ld-linux.so.2 (0xb7f50000) + /home/felix/tmp/myprogram/defstruct.so: + linux-gate.so.1 => (0xb80c9000) + libchicken.so.5 => /home/felix/tmp/myprogram/libchicken.so.5 (0xb7c8c000) + libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c56000) + libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7c51000) + libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7aee000) + /lib/ld-linux.so.2 (0xb80ca000) + + The {{-deploy}} option passed to {{csc}} when compiling {{myprogram.scm}} has + taken care of setting up the application directory as the "repository" for + extensions that the program will use at runtime: + + % myprogram/myprogram -:d + [debug] application startup... + [debug] heap resized to 500000 bytes + [debug] stack bottom is 0xbfdbdf60. + [debug] entering toplevel toplevel... + [debug] stack resized to 131072 bytes + [debug] entering toplevel library_toplevel... + [debug] entering toplevel eval_toplevel... + [debug] entering toplevel expand_toplevel... + [debug] loading compiled module `/home/felix/tmp/myprogram/defstruct.so' (handle is 0x886ce98) + ... + + There is one restriction that you should be aware of, though: any extension that + you install inside an application directory must first be installed system-wide + (unless you use a custom repository with the {{CHICKEN_REPOSITORY}} environment variable), + so that {{csc}}/{{chicken}} will find an import library for the extension. Just make + sure you have all the extensions installed that you use in an application (something + you will normally have anyway). + + You can execute the program from its location, or you can install a symbolic + link pointing to it - it will find the correct directory where the actual + executable is located. + + The application directory is fully "portable" in the sense that it will run directly + from an USB-stick or any other removable media. At runtime the program can find + out its location by invoking the {{repository-path}} procedure, which will return + the full pathname in which the application is located. + + Should the program depend on more libraries which are not available by + default on the intended target systems, and which you would like to + include in your application, you will have to hunt them down yourself + and place them in the application directory. If these again have + dependencies, things will get complicated and will involve things like + patching binaries or writing "trampoline" shell scripts to run your + application. + + ==== Platform-specific notes + + ===== Linux + + Deployment is fully suppored on Linux + + ===== Windows + + Deployment is fully supported on Windows. Since Windows looks up dynamic link + libraries in the programs original location by default, adding third-party -libraries to the application directory is no problem. ++libraries to the application directory is no problem. The freely available ++{{depends}} tool is helpful to find out what DLLs your application depends ++on: ++ ++ [[http://dependencywalker.com/]] + + ===== MacOS X + -... ++On the Macintosh, passing the {{-gui}} option to {{csc}} will result in a ++true GUI application bundle (named {{<your-program>.app}}). ++ ++Invoking ++ ++ % otool -L <yourprogram> ++ ++will list dynamic libraries that your application needs. + + ===== Other UNIX flavors + -... ++Setting up the application executable to load runtime libraries from ++the same directory is supported on FreeBSD, OpenBSD and Solaris. ++NetBSD supports this from version 5.0 onwards - this is currently ++disabled in {{csc}} for this particular platform. + + === Deploying source code + -... ++An alternative to deploying binaries is deployment as compiled ++C sources. Usually, you just need to ship your application code, ++compiled to {{.c}} files and the {{chicken.h}} and {{runtime.c}} ++files from the CHICKEN sources. You will also need the {{.c}} files ++of any library units your program uses. Compiling everything and ++linking it together should work on most systems. Consult the ++CHICKEN makefiles for more information about optimization options, ++etc. + + + --- + Previous: [[Extensions]] + + Next: [[Data representation]]Trap