Files
bullet3/mk/autoconf/embed.m4
2006-05-25 19:18:29 +00:00

223 lines
9.8 KiB
Plaintext

# embed.m4 -*- Autoconf -*-
#==============================================================================
# Copyright (C)2003,2005 by Eric Sunshine <sunshine@sunshineco.com>
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Library General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This library is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
# License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; if not, write to the Free Software Foundation,
# Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#==============================================================================
AC_PREREQ([2.56])
#------------------------------------------------------------------------------
# CS_META_INFO_EMBED([EMITTER], [GPL-OKAY])
# Determine if plugin meta-information should be embedded or if it should
# exist in a stand-alone .csplugin file, and check if necessary tools and
# libraries are present. Sets the shell variable
# enable_meta_info_embedding to "yes" if the user requested embedding or
# if it was enabled by default; otherwise sets it to "no".
#
# If EMITTER is provided, then a subset of the following variables
# (depending upon platform and availability) are recorded by invoking
# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is
# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s
# default emitter will be used.
#
# EMBED_META := yes or no
# EMBED_META.CFLAGS := compiler flags
# EMBED_META.LFLAGS := linker flags
# CMD.WINDRES := windres.exe
# OBJCOPY.AVAILABLE := yes or no
# CMD.OBJCOPY := objcopy.exe
# LIBBFD.AVAILABLE := yes or no
# LIBBFD.CFLAGS := libbfd compiler flags
# LIBBFD.LFLAGS := libbfd linker flags
# ELF.AVAILABLE := yes or no
#
# In general, clients need only concern themselves with the various
# EMBED_META-related variables. For building plugin modules, utilize
# EMBED_META.CFLAGS when compiling, and EMBED_META.LFLAGS when linking.
#
# On Unix, when CS' own ELF metadata reader can't be used (because the
# necessary header file elf.h was not found) embedding is accomplished
# via libbfd, which carries a GPL license. Projects which carry licenses
# not compatible with GPL should consider carefully before enabling
# embedding on Unix. If your project is GPL-compatible, then set GPL-OKAY
# to "yes". This will indicate that it is safe to use libbfd if the ELF
# reader can not be used. If your project is not GPL-compatible, then
# set it to "no" in order to disable embedding on Unix if the ELF reader
# is not usable. (The user can still manually override the setting via
# the --enable-meta-info-embedding option.)
#
# IMPLEMENTATION NOTES
#
# Recent versions of Mingw supply libbfd and libiberty. Since Crystal
# Space uses native Win32 API for meta-information embedding on Windows,
# we do not require these libraries on Windows. More importantly, users
# do not want to see these GPL-licensed libraries appear in the link
# statement for plugin modules, thus we explicitly disable the libbfd
# test on Windows.
#------------------------------------------------------------------------------
AC_DEFUN([CS_META_INFO_EMBED],
[AC_REQUIRE([AC_CANONICAL_HOST])
_CS_META_INFO_EMBED_ENABLE([$1], [$2])
AS_IF([test $enable_meta_info_embedding = yes],
[_CS_META_INFO_EMBED_TOOLS([$1])
AS_IF([test $cs_header_elf_h = yes],
[CS_EMIT_BUILD_PROPERTY([ELF.AVAILABLE], [yes], [], [],
CS_EMITTER_OPTIONAL([$1]))],
[case $host_os in
mingw*|cygwin*) ;;
*)
CS_CHECK_LIBBFD([$1],
[CS_EMIT_BUILD_PROPERTY([EMBED_META.CFLAGS],
[$cs_cv_libbfd_ok_cflags], [+], [],
CS_EMITTER_OPTIONAL([$1]))
CS_EMIT_BUILD_PROPERTY([EMBED_META.LFLAGS],
[$cs_cv_libbfd_ok_lflags $cs_cv_libbfd_ok_libs],
[+], [], CS_EMITTER_OPTIONAL([$1]))])
;;
esac])])])
#------------------------------------------------------------------------------
# _CS_META_INFO_EMBED_ENABLE([EMITTER], [GPL-OKAY])
# Helper for CS_META_INFO_EMBED which adds an
# --enable-meta-info-embedding option to the configure script allowing
# the user to control embedding. Sets the shell variable
# enable_meta_info_embedding to yes or no.
#
# IMPLEMENTATION NOTES
#
# On Unix, embedding is enabled by default if elf.h is found and disabled
# by default unless overridden via GPL-OKAY because libbfd carries a GPL
# license which may be incompatible with a project's own license (such as
# LGPL).
#------------------------------------------------------------------------------
AC_DEFUN([_CS_META_INFO_EMBED_ENABLE],
[AC_REQUIRE([CS_CHECK_HOST])
AC_CHECK_HEADERS([elf.h], [cs_header_elf_h=yes], [cs_header_elf_h=no])
AC_MSG_CHECKING([whether to embed plugin meta-information])
case $cs_host_target in
unix) AS_IF([test $cs_header_elf_h = yes],
[cs_embed_meta_info_default=yes],
[cs_embed_meta_info_default=m4_ifval([$2],[$2],[no])]) ;;
*) cs_embed_meta_info_default=yes ;;
esac
AC_ARG_ENABLE([meta-info-embedding],
[AC_HELP_STRING([--enable-meta-info-embedding],
[store plugin meta-information directly inside plugin modules if
supported by platform; if disabled, meta-information is stored in
stand-alone .csplugin files; this option is enabled by default for
non-Unix platforms and on Unix platforms with ELF-format object
files; it is disabled by default on Unix platforms if ELF is not
available and the project uses a non-GPL-compatible license (such
as LGPL) since the non-ELF Unix embedding technology requires the
GPL-licensed libbfd library; if ELF is not available, enable this
option on Unix only if you are certain you want a GPL-licensed
library infecting your project])],
[], [enable_meta_info_embedding=$cs_embed_meta_info_default])
AC_MSG_RESULT([$enable_meta_info_embedding])
CS_EMIT_BUILD_PROPERTY([EMBED_META], [$enable_meta_info_embedding],
[], [], CS_EMITTER_OPTIONAL([$1]))])
#------------------------------------------------------------------------------
# _CS_META_INFO_EMBED_TOOLS([EMITTER])
# Helper for CS_META_INFO_EMBED() which searches for tools required for
# plugin meta-info embedding.
#------------------------------------------------------------------------------
AC_DEFUN([_CS_META_INFO_EMBED_TOOLS],
[CS_CHECK_TOOLS([WINDRES], [windres])
CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES], [], [],
CS_EMITTER_OPTIONAL([$1]))
CS_CHECK_TOOLS([OBJCOPY], [objcopy])
AS_IF([test -n "$OBJCOPY"],
[CS_EMIT_BUILD_PROPERTY([OBJCOPY.AVAILABLE], [yes], [], [],
CS_EMITTER_OPTIONAL([$1]))
CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY], [], [],
CS_EMITTER_OPTIONAL([$1]))])])
#------------------------------------------------------------------------------
# CS_CHECK_LIBBFD([EMITTER], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
# Exhaustive check for a usable GPL-licensed libbfd, the Binary File
# Descriptor library, a component of binutils, which allows low-level
# manipulation of executable and object files. If EMITTER is provided,
# then the following variables are recorded by invoking
# CS_EMIT_BUILD_PROPERTY() with EMITTER. As a convenience, if EMITTER is
# the literal value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s
# default emitter will be used.
#
# LIBBFD.AVAILABLE := yes or no
# LIBBFD.CFLAGS := libbfd compiler flags
# LIBBFD.LFLAGS := libbfd linker flags
#
# The shell variable cs_cv_libbfd_ok is set to yes if a usable libbfd was
# discovered, else no. If found, the additional shell variables
# cs_cv_libbfd_ok_cflags, cs_cv_libbfd_ok_lflags, and
# cs_cv_libbfd_ok_libs are also set.
#
# WARNING
#
# libbfd carries a GPL license which is incompatible with the LGPL
# license of Crystal Space. Do not use this library with projects under
# less restrictive licenses, such as LGPL.
#
# IMPLEMENTATION NOTES
#
# It seems that some platforms have two version of libiberty installed:
# one from binutils and one from gcc. The binutils version resides in
# /usr/lib, whereas the gcc version resides in the gcc installation
# directory. The gcc version, by default, takes precedence at link time
# over the binutils version. Unfortunately, in broken cases, the gcc
# version of libiberty is missing htab_create_alloc() which is required
# by some libbfd functions. The extensive secondary check of libbfd
# catches this anomalous case of broken gcc libiberty. It turns out that
# it is possible to make the linker prefer the binutils version by
# specifying -L/usr/lib, thus the extensive test attempts to do so in an
# effort to resolve this unfortunate issue.
#------------------------------------------------------------------------------
AC_DEFUN([CS_CHECK_LIBBFD],
[CS_CHECK_LIB_WITH([bfd],
[AC_LANG_PROGRAM([[#include <bfd.h>]], [bfd_init();])],
[], [], [], [], [], [], [-liberty])
AS_IF([test $cs_cv_libbfd = yes],
[CS_CHECK_BUILD([if libbfd is usable], [cs_cv_libbfd_ok],
[AC_LANG_PROGRAM([[#include <bfd.h>]],
[bfd* p;
asection* s;
bfd_init();
p = bfd_openr(0,0);
bfd_check_format(p,bfd_object);
bfd_get_section_by_name(p,0);
bfd_section_size(p,s);
bfd_get_section_contents(p,s,0,0,0);
bfd_close(p);])],
[CS_CREATE_TUPLE() CS_CREATE_TUPLE([],[-L/usr/lib],[])],
[], [], [], [],
[$cs_cv_libbfd_cflags],
[$cs_cv_libbfd_lflags],
[$cs_cv_libbfd_libs])],
[cs_cv_libbfd_ok=no])
AS_IF([test $cs_cv_libbfd_ok = yes],
[CS_EMIT_BUILD_RESULT([cs_cv_libbfd_ok], [LIBBFD],
CS_EMITTER_OPTIONAL([$1]))
$2],
[$3])])