# embed.m4 -*- Autoconf -*- #============================================================================== # Copyright (C)2003,2005 by Eric Sunshine # # 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_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* 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])])