The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

Building DynCall with generic makefiles
=======================================
Description
-----------
Makefile.generic is a simple and _hybrid_ make-based build system setup for dyncall,
designed to work with with GNU and BSD make.
This build-flavour supports two operating modes: Embedded and Configure.
Project files are specified in Makefile.generic.
History
-------
During the integration of dyncall into the R package rdyncall, there
was a need for a clean simple build system that could be launched from R
and works with various make's such as GNU, BSD and sun make.
Generic Usage
-------------
[g|bsd]make [-f Makefile.generic] [all|clean|install|...] [INSTALL_TOP=<path>]
Embedded Mode
-------------
Makefile.generic makefiles are taken "as-is" without the need for extra configuration.
<VAR1>=<VALUE1> ... bsdmake -f Makefile.generic
<VAR1>=<VALUE1> ... gmake -f Makefile.generic
(Note that setting an env var as above (<VAR1>=<VALUE1>) before running a command is
shell specific. If your shell doesn't support this, set it according to the shell's
style.)
Example:
dyncall libraries should compile fine on most platforms:
BSDmake:
$ bsdmake -f Makefile.generic
GNUmake:
$ make -f Makefile.generic
The tests sometimes require special attention to additional 'usual' libraries
such as math and dynamic linker run-time libs.
$ LDLIBS="-lm -ldl" make -f Makefile.generic
Configure Mode
--------------
Usage:
cd <build-dir> # build-dir can be arbitrary
../<path-to-source>/configure [--prefix=<path>]
make
make install [DESTDIR=<path>]
The configure script 'configure' writes 'Makefile' files that
include 'Makefile.generic' and setup variables such as
VPATH, {SRC,BLD}{TOP,DIR}.
Two build types are supported: In-source and out-of-Source.
in-source builds:
Makefile's are created in parallel to the Makefile.generic files.
out-of-source builds:
the configure script is executed from a (possible empty) build directory.
The source directory tree is duplicated into that directory.
Useful Variables
----------------
For libraries:
CC, CFLAGS, CPPFLAGS
For tests:
CXX, LDLIBS
MAKE_CMD - The make tool (including -f flag) to run sub-directories.
SRCTOP - Source top-level directory (defaults to relative top).
BLDTOP - Build top-level directory (defaults to SRCTOP).
SRCDIR - Source directory (defaults to '.').
BLDDIR - Build directory (defaults to SRCDIR).
e.g. Makefile.generic in source-tree:
SRCTOP ?= ../../../ # relative path to source-top
BLDTOP ?= ${SRCTOP} # defaults for in-source builds
SRCDIR ?= . # relative path to current directory
BLDDIR ?= ${BLDDIR} # relative path to current directory
Include Directories
-------------------
Use -I${SRCTOP}/... to refer to other include directories.
Link Directories
----------------
Use -L${BLDTOP}/... to refer to other build directories.
Plaform Notes:
--------------
Linux:
- all: ok.
make -f Makefile.generic all
- tests: need 'm' and 'dl' libs.
( cd tests ; LDLIBS="-lm -ldl" make -f Makefile.generic )
- see batch script: buildsys/scripts/batch-build-linux.sh
Minix: No dynload support. No '-fPIC' is allowed.
- dynload: unsupport, no dynamic linker present in Minix 3.
- dyn{call,callback}: ok, without '-fPIC'!
( cd dyncall ; CFLAGS= make -f Makefile.generic dyncall dyncallback )
- tests: ok
( cd test ; make -f Makefile.generic all-dyncall all-dyncallback )
- see batch script: buildsys/scripts/batch-build-minix.sh
NetBSD/FreeBSD:
- all: ok.
make -f Makefile.generic all
- tests: need math lib:
( cd tests ; LDLIBS="-lm" make -f Makefile.generic )
OpenBSD:
- all: ok.
make -f Makefile.generic all
- tests: *.cpp implicit rule not set, therefore only c tests work:
( cd tests ; LDLIBS="-lm" make -f Makefile.generic all-c )
- install: ok.
Haiku Alpha 2:
- dynload: elf.h header found, install system source for dynload support
- dyn{call,callback}: ok.
make -f Makefile.generic dyncall dyncallback
- tests: ok
( cd test ; make -f Makefile.generic all-dyncall all-dyncallback )
Build notes related to dyncall:
-------------------------------
CFLAGS
Use '-fPIC' for at least 64-bit systems and when you want the code to be
included as a shared library or module image.
LDLIBS
Use '-lm' for test/suite - it uses pow function.
Use '-ldl' for dynload examples such as test/nm and test/resolve_self on Linux.
Feature:
--------
configure --prefix=<prefix> -> Makefile DESTDIR=variable
make -f Makefile.generic DESTDIR=<prefix>
Todo:
-----
- sun's make: CXX does not exist.. no rule for *.cpp files but *.cc.