moved files around
This commit is contained in:
230
mk/autoconf/checkbuild.m4
Normal file
230
mk/autoconf/checkbuild.m4
Normal file
@@ -0,0 +1,230 @@
|
||||
# checkbuild.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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_SPLIT_TUPLE(TUPLE, OUTPUT-VARIABLES)
|
||||
# Split a build-tuple into its component parts. A build tuple is
|
||||
# constructed by CS_CREATE_TUPLE() and is comprised of compiler flags,
|
||||
# linker flags, and library references. OUTPUT-VARIABLES is a
|
||||
# comma-delimited list of shell variables which should receive the
|
||||
# extracted compiler flags, linker flags, and library references,
|
||||
# respectively.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_SPLIT_TUPLE],
|
||||
[CS_SPLIT([$1], [cs_dummy,$2], [@])
|
||||
m4_map([_CS_SPLIT_TUPLE], [$2])])
|
||||
|
||||
AC_DEFUN([_CS_SPLIT_TUPLE],
|
||||
[$1=`echo $$1 | sed 'y%@%:@% %'`
|
||||
])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CREATE_TUPLE([CFLAGS], [LFLAGS], [LIBS])
|
||||
# Construct a build-tuple which is comprised of compiler flags, linker
|
||||
# flags, and library references. Build tuples are encoded so as to
|
||||
# preserve whitespace in each component. This makes it possible for
|
||||
# macros (such as CS_BUILD_IFELSE) which employ build tuples to accept
|
||||
# whitespace-delimited lists of tuples, and for shell "for" statements to
|
||||
# iterate over tuple lists without compromising whitespace embedded
|
||||
# within individual flags or library references.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CREATE_TUPLE], [`echo @$1@$2@$3 | sed 'y% %@%:@%'`])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_LANG_CFLAGS
|
||||
# Return the literal string CFLAGS if the current language is C. Return
|
||||
# the literal string CXXFLAGS if the current language is C++. Generic
|
||||
# compiler test macros which need to modify or save the compiler flags
|
||||
# can invoke this macro to get the name of the compiler flags environment
|
||||
# variable (either CFLAGS or CXXFLAGS) depending upon the current
|
||||
# language. For example:
|
||||
# CS_LANG_CFLAGS="$CS_LANG_CFLAGS -Wall"
|
||||
# With C, this expands to:
|
||||
# CFLAGS="$CFLAGS -Wall"
|
||||
# With C++, it expands to:
|
||||
# CXXFLAGS="$CXXFLAGS -Wall"
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_LANG_CFLAGS], [AC_LANG_CASE([C], [CFLAGS], [C++], [CXXFLAGS])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_BUILD_IFELSE([PROGRAM], [FLAGS], [LANGUAGE], [ACTION-IF-BUILT],
|
||||
# [ACTION-IF-NOT-BUILT], [OTHER-CFLAGS], [OTHER-LFLAGS],
|
||||
# [OTHER-LIBS], [INHIBIT-OTHER-FLAGS], [ERROR-REGEX])
|
||||
# Try building a program using the supplied compiler flags, linker flags,
|
||||
# and library references. PROGRAM is typically a program composed via
|
||||
# AC_LANG_PROGRAM(). PROGRAM may be omitted if you are interested only
|
||||
# in learning if the compiler or linker respects certain flags. LANGUAGE
|
||||
# is typically either C or C++ and specifies which compiler to use for
|
||||
# the test. If LANGUAGE is omitted, C is used. FLAGS is a whitespace
|
||||
# delimited list of build tuples. Tuples are created with
|
||||
# CS_CREATE_TUPLE() and are composed of up to three elements each. The
|
||||
# first element represents compiler flags, the second linker flags, and
|
||||
# the third libraries used when linking the program. Each tuple from
|
||||
# FLAGS is attempted in order. If you want a build attempted with no
|
||||
# special flags prior to builds with specialized flags, create an empty
|
||||
# tuple with CS_CREATE_TUPLE() at the start of the FLAGS list. If the
|
||||
# build is successful, then the shell variables cs_build_ok is set to
|
||||
# "yes", cs_build_cflags, cs_build_lflags, and cs_build_libs are set to
|
||||
# the tuple elements which resulted in the successful build, and
|
||||
# ACTION-IF-BUILT is invoked. Upon successful build, no further tuples
|
||||
# are consulted. If no tuple results in a successful build, then
|
||||
# cs_build_ok is set to "no" and ACTION-IF-NOT-BUILT is invoked.
|
||||
# OTHER-CFLAGS, OTHER-LFLAGS, and OTHER-LIBS specify additional compiler
|
||||
# flags, linker flags, and libraries which should be used with each tuple
|
||||
# build attempt. Upon successful build, these additional flags are also
|
||||
# reflected in the variables cs_build_cflags, cs_build_lflags, and
|
||||
# cs_build_libs unless INHIBIT-OTHER-FLAGS is a non-empty string. The
|
||||
# optional ERROR-REGEX places an additional constraint upon the build
|
||||
# check. If specified, ERROR-REGEX, which is a standard `grep' regular
|
||||
# expression, is applied to output captured from the compiler and linker.
|
||||
# If ERROR-REGEX matches, then the build is deemed a failure, and
|
||||
# cs_build_ok is set to "no". This facility is useful for broken build
|
||||
# tools which emit an error message yet still return success as a result.
|
||||
# In such cases, it should be possible to detect the failure by scanning
|
||||
# the tools' output.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
#
|
||||
# In Autoconf 2.57 and earlier, AC_LINK_IFELSE() invokes AC_TRY_EVAL(),
|
||||
# which does not provide access to the captured output. To work around
|
||||
# this limitation, we temporarily re-define AC_TRY_EVAL() as
|
||||
# _AC_EVAL_STDERR(), which leaves the captured output in conftest.err
|
||||
# (which we must also delete). In Autoconf 2.58, however,
|
||||
# AC_LINK_IFELSE() instead already invokes _AC_EVAL_STDERR() on our
|
||||
# behalf, however we must be careful to apply ERROR-REGEX within the
|
||||
# invocation AC_LINK_IFELSE(), since AC_LINK_IFELSE() deletes
|
||||
# conftest.err before it returns.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_BUILD_IFELSE],
|
||||
[AC_LANG_PUSH(m4_default([$3],[C]))
|
||||
cs_cflags_save="$CS_LANG_CFLAGS"
|
||||
cs_lflags_save="$LDFLAGS"
|
||||
cs_libs_save="$LIBS"
|
||||
cs_build_ok=no
|
||||
m4_ifval([$10], [m4_pushdef([AC_TRY_EVAL], [_AC_EVAL_STDERR]($$[1]))])
|
||||
|
||||
for cs_build_item in m4_default([$2],[CS_CREATE_TUPLE()])
|
||||
do
|
||||
CS_SPLIT_TUPLE(
|
||||
[$cs_build_item],[cs_cflags_test,cs_lflags_test,cs_libs_test])
|
||||
CS_LANG_CFLAGS="$cs_cflags_test $6 $cs_cflags_save"
|
||||
LDFLAGS="$cs_lflags_test $7 $cs_lflags_save"
|
||||
LIBS="$cs_libs_test $8 $cs_libs_save"
|
||||
AC_LINK_IFELSE(m4_default([$1], [AC_LANG_PROGRAM([],[])]),
|
||||
[m4_ifval([$10],
|
||||
[AS_IF([AC_TRY_COMMAND(
|
||||
[grep "AS_ESCAPE([$10])" conftest.err >/dev/null 2>&1])],
|
||||
[cs_build_ok=no], [cs_build_ok=yes])],
|
||||
[cs_build_ok=yes])])
|
||||
AS_IF([test $cs_build_ok = yes], [break])
|
||||
done
|
||||
|
||||
m4_ifval([$10], [m4_popdef([AC_TRY_EVAL]) rm -f conftest.err])
|
||||
CS_LANG_CFLAGS=$cs_cflags_save
|
||||
LDFLAGS=$cs_lflags_save
|
||||
LIBS=$cs_libs_save
|
||||
AC_LANG_POP(m4_default([$3],[C]))
|
||||
|
||||
AS_IF([test $cs_build_ok = yes],
|
||||
[cs_build_cflags=CS_TRIM([$cs_cflags_test[]m4_ifval([$9],[],[ $6])])
|
||||
cs_build_lflags=CS_TRIM([$cs_lflags_test[]m4_ifval([$9],[],[ $7])])
|
||||
cs_build_libs=CS_TRIM([$cs_libs_test[]m4_ifval([$9],[],[ $8])])
|
||||
$4],
|
||||
[$5])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_BUILD(MESSAGE, CACHE-VAR, [PROGRAM], [FLAGS], [LANGUAGE],
|
||||
# [ACTION-IF-BUILT], [ACTION-IF-NOT-BUILT], [IGNORE-CACHE],
|
||||
# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS],
|
||||
# [INHIBIT-OTHER-FLAGS], [ERROR-REGEX])
|
||||
# Like CS_BUILD_IFELSE() but also prints "checking" and result messages,
|
||||
# and optionally respects the cache. Sets CACHE-VAR to "yes" upon
|
||||
# success, else "no" upon failure. Additionally, sets CACHE-VAR_cflags,
|
||||
# CACHE-VAR_lflags, and CACHE-VAR_libs to the values which resulted in a
|
||||
# successful build. If IGNORE-CACHE is "yes", then the cache variables
|
||||
# are ignored upon entry to this macro, however they are still set to
|
||||
# appropriate values upon exit.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_BUILD],
|
||||
[AS_IF([test "$8" != yes],
|
||||
[AC_CACHE_CHECK([$1], [$2],
|
||||
[CS_BUILD_IFELSE([$3], [$4], [$5],
|
||||
[$2=yes
|
||||
$2_cflags=$cs_build_cflags
|
||||
$2_lflags=$cs_build_lflags
|
||||
$2_libs=$cs_build_libs],
|
||||
[$2=no], [$9], [$10], [$11], [$12], [$13])])],
|
||||
[AC_MSG_CHECKING([$1])
|
||||
CS_BUILD_IFELSE([$3], [$4], [$5],
|
||||
[$2=yes
|
||||
$2_cflags=$cs_build_cflags
|
||||
$2_lflags=$cs_build_lflags
|
||||
$2_libs=$cs_build_libs],
|
||||
[$2=no], [$9], [$10], [$11], [$12], [$13])
|
||||
AC_MSG_RESULT([$$2])])
|
||||
AS_IF([test $$2 = yes], [$6],
|
||||
[$2_cflags=''
|
||||
$2_lflags=''
|
||||
$2_libs=''
|
||||
$7])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE],
|
||||
# [ACTION-IF-RECOGNIZED], [ACTION-IF-NOT-RECOGNIZED],
|
||||
# [OTHER-CFLAGS], [OTHER-LFLAGS], [OTHER-LIBS],
|
||||
# [ERROR-REGEX])
|
||||
# Like CS_CHECK_BUILD(), but checks only if the compiler or linker
|
||||
# recognizes a command-line option or options. MESSAGE is the "checking"
|
||||
# message. CACHE-VAR is the shell cache variable which receives the flag
|
||||
# or flags recognized by the compiler or linker. FLAGS is a
|
||||
# whitespace-delimited list of build tuples created with
|
||||
# CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in order until
|
||||
# one is found which is recognized by the compiler. After that, no
|
||||
# further flags are checked. LANGUAGE is typically either C or C++ and
|
||||
# specifies which compiler to use for the test. If LANGUAGE is omitted,
|
||||
# C is used. If a command-line option is recognized, then CACHE-VAR is
|
||||
# set to the composite value of $cs_build_cflags, $cs_build_lflags, and
|
||||
# $cs_build_libs of the FLAGS element which succeeded (not including the
|
||||
# "other" flags) and ACTION-IF-RECOGNIZED is invoked. If no options are
|
||||
# recognized, then CACHE-VAR is set to the empty string, and
|
||||
# ACTION-IF-NOT-RECOGNIZED is invoked. As a convenience, in case
|
||||
# comparing CACHE-VAR against the empty string to test for failure is
|
||||
# undesirable, a second variable named CACHE-VAR_ok is set to the literal
|
||||
# "no" upon failure, and to the same value as CACHE-VAR upon success.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_BUILD_FLAGS],
|
||||
[AC_CACHE_CHECK([$1], [$2_ok],
|
||||
[CS_BUILD_IFELSE([], [$3], [$4],
|
||||
[$2=CS_TRIM([$cs_build_cflags $cs_build_lflags $cs_build_libs])
|
||||
$2_ok="$$2"],
|
||||
[$2=''
|
||||
$2_ok=no], [$7], [$8], [$9], [Y], [$10])])
|
||||
AS_IF([test "$$2_ok" != no], [$5], [$6])])
|
||||
111
mk/autoconf/checkcommon.m4
Normal file
111
mk/autoconf/checkcommon.m4
Normal file
@@ -0,0 +1,111 @@
|
||||
#==============================================================================
|
||||
# Copyright (C)2003-2006 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_CHECK_COMMON_TOOLS_LINK
|
||||
# Checks for common tools related to linking.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_COMMON_TOOLS_LINK],
|
||||
[
|
||||
# The default RANLIB in Jambase is wrong on some platforms, and is also
|
||||
# unsuitable during cross-compilation, so we set the value unconditionally
|
||||
# (sixth argument of CS_EMIT_BUILD_PROPERTY).
|
||||
AC_PROG_RANLIB
|
||||
CS_EMIT_BUILD_PROPERTY([RANLIB], [$RANLIB], [], [], [], [Y])
|
||||
|
||||
CS_CHECK_TOOLS([DLLTOOL], [dlltool])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DLLTOOL], [$DLLTOOL])
|
||||
|
||||
CS_CHECK_TOOLS([DLLWRAP], [dllwrap])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DLLWRAP], [$DLLWRAP])
|
||||
|
||||
CS_CHECK_TOOLS([WINDRES], [windres])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.WINDRES], [$WINDRES])
|
||||
|
||||
CS_CHECK_TOOLS([STRINGS], [strings])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.STRINGS], [$STRINGS])
|
||||
|
||||
CS_CHECK_TOOLS([STRINGS], [objcopy])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.OBJCOPY], [$OBJCOPY])
|
||||
|
||||
CS_CHECK_LIBTOOL
|
||||
CS_EMIT_BUILD_PROPERTY([LIBTOOL], [$LIBTOOL])
|
||||
CS_EMIT_BUILD_PROPERTY([APPLE_LIBTOOL], [$APPLE_LIBTOOL])
|
||||
])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_COMMON_TOOLS_BASIC
|
||||
# Checks for basic tools for building things.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_COMMON_TOOLS_BASIC],
|
||||
[CS_CHECK_MKDIR
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.MKDIR], [$MKDIR])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.MKDIRS], [$MKDIRS])
|
||||
|
||||
CS_CHECK_PROGS([INSTALL], [install])
|
||||
CS_EMIT_BUILD_PROPERTY([INSTALL], [$INSTALL])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_COMMON_TOOLS_DOC_TEXINFO
|
||||
# Checks for tools to generate documentation from texinfo files.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_TEXINFO],
|
||||
[CS_CHECK_PROGS([TEXI2DVI], [texi2dvi])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.TEXI2DVI], [$TEXI2DVI])
|
||||
|
||||
CS_CHECK_PROGS([TEXI2PDF], [texi2pdf])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.TEXI2PDF], [$TEXI2PDF])
|
||||
|
||||
CS_CHECK_PROGS([DVIPS], [dvips])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DVIPS], [$DVIPS])
|
||||
|
||||
CS_CHECK_PROGS([DVIPDF], [dvipdf])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DVIPDF], [$DVIPDF])
|
||||
|
||||
CS_CHECK_PROGS([MAKEINFO], [makeinfo])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.MAKEINFO], [$MAKEINFO])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN
|
||||
# Checks for tools to generate source documentation via doxygen.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_COMMON_TOOLS_DOC_DOXYGEN],
|
||||
[CS_CHECK_PROGS([DOXYGEN], [doxygen])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DOXYGEN], [$DOXYGEN])
|
||||
|
||||
CS_CHECK_TOOLS([DOT], [dot])
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.DOT], [$DOT])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_COMMON_LIBS
|
||||
# Check for typical required libraries (libm, libmx, libdl, libnsl).
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_COMMON_LIBS],
|
||||
[AC_LANG_PUSH([C])
|
||||
AC_CHECK_LIB([m], [pow], [cs_cv_libm_libs=-lm], [cs_cv_libm_libs=])
|
||||
AC_CHECK_LIB([m], [cosf], [cs_cv_libm_libs=-lm])
|
||||
AC_CHECK_LIB([mx], [cosf])
|
||||
AC_CHECK_LIB([dl], [dlopen], [cs_cv_libdl_libs=-ldl], [cs_cv_libdl_libs=])
|
||||
AC_CHECK_LIB([nsl], [gethostbyname])
|
||||
AC_LANG_POP([C])])
|
||||
51
mk/autoconf/checkcppunit.m4
Normal file
51
mk/autoconf/checkcppunit.m4
Normal file
@@ -0,0 +1,51 @@
|
||||
# checkcppunit.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)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_CHECK_CPPUNIT([EMITTER])
|
||||
# Check if CppUnit (http://cppunit.sourceforge.net/), the unit-testing
|
||||
# framework is available. The shell variable cs_cv_libcppunit is set to
|
||||
# "yes" if CppUnit is discovered, else "no". If available, then the
|
||||
# variables cs_cv_libcppunit_cflags, cs_cv_libcppunit_lflags, and
|
||||
# cs_cv_libcppunit_libs are set. If EMITTER is provided, then
|
||||
# CS_EMIT_BUILD_RESULT() is invoked with EMITTER in order to record the
|
||||
# results in an output file. As a convenience, if EMITTER is the literal
|
||||
# value "emit" or "yes", then CS_EMIT_BUILD_RESULT()'s default emitter
|
||||
# will be used.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_CPPUNIT],
|
||||
[CS_CHECK_LIB_WITH([cppunit],
|
||||
[AC_LANG_PROGRAM([[#include <cppunit/ui/text/TestRunner.h>]],
|
||||
[CppUnit::TextUi::TestRunner r; r.run();])],
|
||||
[], [C++])
|
||||
|
||||
AS_IF([test $cs_cv_libcppunit = yes],
|
||||
[CS_CHECK_BUILD([if cppunit is sufficiently recent],
|
||||
[cs_cv_libcppunit_recent],
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <cppunit/BriefTestProgressListener.h>]],
|
||||
[CppUnit::BriefTestProgressListener b; b.startTest(0);])],
|
||||
[], [C++],
|
||||
[CS_EMIT_BUILD_RESULT([cs_cv_libcppunit], [CPPUNIT],
|
||||
CS_EMITTER_OPTIONAL([$1]))], [], [],
|
||||
[$cs_cv_libcppunit_cflags],
|
||||
[$cs_cv_libcppunit_lflags],
|
||||
[$cs_cv_libcppunit_libs])])])
|
||||
312
mk/autoconf/checklib.m4
Normal file
312
mk/autoconf/checklib.m4
Normal file
@@ -0,0 +1,312 @@
|
||||
# checklib.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_lib_paths_default
|
||||
# Whitespace delimited list of directory tuples in which to search, by
|
||||
# default, for external libraries. Each list item can specify an
|
||||
# include|library directory tuple (for example, "/usr/include|/usr/lib"),
|
||||
# or a single directory (for example, "/usr"). If the second form is
|
||||
# used, then "include" and "lib" subdirectories of the directory are
|
||||
# searched. If the library resources are not found, then the directory
|
||||
# itself is searched. Thus, "/proj" is shorthand for
|
||||
# "/proj/include|/proj/lib /proj|/proj".
|
||||
#
|
||||
# Present Cases:
|
||||
# /usr/local -- Not all compilers search here by default, so we specify
|
||||
# it manually.
|
||||
# /sw -- Fink, the MacOS/X manager of Unix packages, installs here by
|
||||
# default.
|
||||
# /opt/local -- DarwinPorts installs here by default.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_define([cs_lib_paths_default],
|
||||
[/usr/local/include|/usr/local/lib \
|
||||
/sw/include|/sw/lib \
|
||||
/opt/local/include|/opt/local/lib \
|
||||
/opt/include|/opt/lib])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# cs_pkg_paths_default
|
||||
# Comma delimited list of additional directories in which the
|
||||
# `pkg-config' command should search for its `.pc' files.
|
||||
#
|
||||
# Present Cases:
|
||||
# /usr/local/lib/pkgconfig -- Although a common location for .pc files
|
||||
# installed by "make install", many `pkg-config' commands neglect
|
||||
# to search here automatically.
|
||||
# /sw/lib/pkgconfig -- Fink, the MacOS/X manager of Unix packages,
|
||||
# installs .pc files here by default.
|
||||
# /opt/local/lib/pkgconfig -- DarwinPorts installs .pc files here by
|
||||
# default.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_define([cs_pkg_paths_default],
|
||||
[/usr/local/lib/pkgconfig,
|
||||
/sw/lib/pkgconfig,
|
||||
/opt/local/lib/pkgconfig,
|
||||
/opt/lib/pkgconfig])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_LIB_WITH(LIBRARY, PROGRAM, [SEARCH-LIST], [LANGUAGE],
|
||||
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [OTHER-CFLAGS],
|
||||
# [OTHER-LFLAGS], [OTHER-LIBS], [ALIASES])
|
||||
# Very roughly similar in concept to AC_CHECK_LIB(), but allows caller to
|
||||
# to provide list of directories in which to search for LIBRARY; allows
|
||||
# user to override library location via --with-LIBRARY=dir; and consults
|
||||
# `pkg-config' (if present) and `LIBRARY-config' (if present, i.e.
|
||||
# `sdl-config') in order to obtain compiler and linker flags. LIBRARY is
|
||||
# the name of the library or MacOS/X framework which is to be located
|
||||
# (for example, "readline" for `libreadline.a' or `readline.framework').
|
||||
# PROGRAM, which is typically composed with AC_LANG_PROGRAM(), is a
|
||||
# program which references at least one function or symbol in LIBRARY.
|
||||
# SEARCH-LIST is a whitespace-delimited list of paths in which to search
|
||||
# for the library and its header files, in addition to those searched by
|
||||
# the compiler and linker by default, and those referenced by the
|
||||
# cs_lib_paths_default macro. Each list item can specify an
|
||||
# `include|library' directory tuple (for example,
|
||||
# "/usr/include|/usr/lib"), or a single directory (for example, "/usr").
|
||||
# If the second form is used, then "include" and "lib" subdirectories of
|
||||
# the directory are searched. If the library resources are not found,
|
||||
# then the directory itself is searched. Thus, "/proj" is shorthand for
|
||||
# "/proj/include|/proj/lib /proj|/proj". Items in the search list can
|
||||
# include wildcards. SEARCH-LIST can be overridden by the user with the
|
||||
# --with-LIBRARY=dir option, in which case only "dir/include|dir/lib" and
|
||||
# "dir|dir" are searched. If SEARCH-LIST is omitted and the user did not
|
||||
# override the search list via --with-LIBRARY=dir, then only the
|
||||
# directories normally searched by the compiler and the directories
|
||||
# mentioned via cs_lib_paths_default are searched. LANGUAGE is typically
|
||||
# either C or C++ and specifies which compiler to use for the test. If
|
||||
# LANGUAGE is omitted, C is used. OTHER-CFLAGS, OTHER-LFLAGS, and
|
||||
# OTHER-LIBS can specify additional compiler flags, linker flags, and
|
||||
# libraries needed to successfully link with LIBRARY. The optional
|
||||
# ALIASES is a comma-delimited list of library names for which to search
|
||||
# in case LIBRARY is not located (for example "[sdl1.2, sdl12]" for
|
||||
# libsdl1.2.a, sdl1.2.framework, libsdl12.a, and sdl12.framework). If
|
||||
# the library or one of its aliases is found and can be successfully
|
||||
# linked into a program, then the shell cache variable cs_cv_libLIBRARY
|
||||
# is set to "yes"; cs_cv_libLIBRARY_cflags, cs_cv_libLIBRARY_lflags, and
|
||||
# cs_cv_libLIBRARY_libs are set, respectively, to the compiler flags
|
||||
# (including OTHER-CFLAGS), linker flags (including OTHER-LFLAGS), and
|
||||
# library references (including OTHER-LIBS) which resulted in a
|
||||
# successful build; and ACTION-IF-FOUND is invoked. If the library was
|
||||
# not found or was unlinkable, or if the user disabled the library via
|
||||
# --without-LIBRARY, then cs_cv_libLIBRARY is set to "no" and
|
||||
# ACTION-IF-NOT-FOUND is invoked. Note that the exported shell variable
|
||||
# names are always composed from LIBRARY regardless of whether the test
|
||||
# succeeded because the primary library was discovered or one of the
|
||||
# aliases.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_LIB_WITH],
|
||||
[AC_ARG_WITH([$1], [AC_HELP_STRING([--with-$1=dir],
|
||||
[specify location of lib$1 if not detected automatically; searches
|
||||
dir/include, dir/lib, and dir])])
|
||||
|
||||
# Backward compatibility: Recognize --with-lib$1 as alias for --with-$1.
|
||||
AS_IF([test -n "$with_lib$1" && test -z "$with_$1"],
|
||||
[with_$1="$with_lib$1"])
|
||||
|
||||
AS_IF([test -z "$with_$1"], [with_$1=yes])
|
||||
AS_IF([test "$with_$1" != no],
|
||||
[# If --with-$1 value is same as cached value, then assume other
|
||||
# cached values are also valid; otherwise, ignore all cached values.
|
||||
AS_IF([test "$with_$1" != "$cs_cv_with_$1"],
|
||||
[cs_ignore_cache=yes], [cs_ignore_cache=no])
|
||||
|
||||
cs_check_lib_flags=''
|
||||
AS_IF([test $with_$1 = yes],
|
||||
[m4_foreach([cs_check_lib_alias], [$1, $10],
|
||||
[_CS_CHECK_LIB_PKG_CONFIG_FLAGS([cs_check_lib_flags],
|
||||
cs_check_lib_alias)
|
||||
_CS_CHECK_LIB_CONFIG_FLAGS([cs_check_lib_flags],
|
||||
cs_check_lib_alias)
|
||||
])])
|
||||
|
||||
AS_IF([test $with_$1 != yes],
|
||||
[cs_check_lib_paths=$with_$1],
|
||||
[cs_check_lib_paths="| cs_lib_paths_default $3"])
|
||||
m4_foreach([cs_check_lib_alias], [$1, $10],
|
||||
[_CS_CHECK_LIB_CREATE_FLAGS([cs_check_lib_flags],
|
||||
cs_check_lib_alias, [$cs_check_lib_paths])
|
||||
])
|
||||
|
||||
CS_CHECK_BUILD([for lib$1], [cs_cv_lib$1], [$2], [$cs_check_lib_flags],
|
||||
[$4], [], [], [$cs_ignore_cache], [$7], [$8], [$9])],
|
||||
[cs_cv_lib$1=no])
|
||||
|
||||
cs_cv_with_$1="$with_$1"
|
||||
AS_IF([test "$cs_cv_lib$1" = yes], [$5], [$6])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_PKG_CONFIG
|
||||
# Check if the `pkg-config' command is available and reasonably recent.
|
||||
# This program acts as a central repository of build flags for various
|
||||
# packages. For example, to determine the compiler flags for FreeType2
|
||||
# use, "pkg-config --cflags freetype2"; and "pkg-config --libs freetype2"
|
||||
# to determine the linker flags. If `pkg-config' is found and is
|
||||
# sufficiently recent, PKG_CONFIG is set and AC_SUBST() invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_define([CS_PKG_CONFIG_MIN], [0.9.0])
|
||||
AC_DEFUN([CS_CHECK_PKG_CONFIG],
|
||||
[AS_IF([test "$cs_prog_pkg_config_checked" != yes],
|
||||
[CS_CHECK_TOOLS([PKG_CONFIG], [pkg-config])
|
||||
_CS_CHECK_PKG_CONFIG_PREPARE_PATH
|
||||
cs_prog_pkg_config_checked=yes])
|
||||
AS_IF([test -z "$cs_cv_prog_pkg_config_ok"],
|
||||
[AS_IF([test -n "$PKG_CONFIG"],
|
||||
[AS_IF([$PKG_CONFIG --atleast-pkgconfig-version=CS_PKG_CONFIG_MIN],
|
||||
[cs_cv_prog_pkg_config_ok=yes],
|
||||
[cs_cv_prog_pkg_config_ok=no])],
|
||||
[cs_cv_prog_pkg_config_ok=no])])])
|
||||
|
||||
AC_DEFUN([_CS_CHECK_PKG_CONFIG_PREPARE_PATH],
|
||||
[PKG_CONFIG_PATH="m4_foreach([cs_pkg_path], [cs_pkg_paths_default],
|
||||
[cs_pkg_path$PATH_SEPARATOR])$PKG_CONFIG_PATH"
|
||||
export PKG_CONFIG_PATH])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_CHECK_LIB_PKG_CONFIG_FLAGS(VARIABLE, LIBRARY)
|
||||
# Helper macro for CS_CHECK_LIB_WITH(). Checks if `pkg-config' knows
|
||||
# about LIBRARY and, if so, appends a build tuple consisting of the
|
||||
# compiler and linker flags reported by `pkg-config' to the list of
|
||||
# tuples stored in the shell variable VARIABLE.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_CHECK_LIB_PKG_CONFIG_FLAGS],
|
||||
[CS_CHECK_PKG_CONFIG
|
||||
AS_IF([test $cs_cv_prog_pkg_config_ok = yes],
|
||||
[AC_CACHE_CHECK([if $PKG_CONFIG recognizes $2], [_CS_CLPCF_CVAR([$2])],
|
||||
[AS_IF([$PKG_CONFIG --exists $2],
|
||||
[_CS_CLPCF_CVAR([$2])=yes], [_CS_CLPCF_CVAR([$2])=no])])
|
||||
AS_IF([test $_CS_CLPCF_CVAR([$2]) = yes],
|
||||
[_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [pkg_config_$2],
|
||||
[$PKG_CONFIG], [$2])])])])
|
||||
|
||||
AC_DEFUN([_CS_CLPCF_CVAR], [AS_TR_SH([cs_cv_prog_pkg_config_$1])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_CHECK_LIB_CONFIG_FLAGS(VARIABLE, LIBRARY)
|
||||
# Helper macro for CS_CHECK_LIB_WITH(). Checks if `LIBRARY-config'
|
||||
# (i.e. `sdl-config') exists and, if so, appends a build tuple consisting
|
||||
# of the compiler and linker flags reported by `LIBRARY-config' to the
|
||||
# list of tuples stored in the shell variable VARIABLE.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_CHECK_LIB_CONFIG_FLAGS],
|
||||
[CS_CHECK_TOOLS(_CS_CLCF_SHVAR([$2]), [$2-config])
|
||||
AS_IF([test -n "$_CS_CLCF_SHVAR([$2])"],
|
||||
[AS_IF([test -z "$_CS_CLCF_CVAR([$2])"],
|
||||
[AS_IF([$_CS_CLCF_SHVAR([$2]) --cflags --libs >/dev/null 2>&1],
|
||||
[_CS_CLCF_CVAR([$2])=yes], [_CS_CLCF_CVAR([$2])=no])])
|
||||
AS_IF([test $_CS_CLCF_CVAR([$2]) = yes],
|
||||
[_CS_CHECK_LIB_CONFIG_PROG_FLAGS([$1], [config_$2],
|
||||
[$_CS_CLCF_SHVAR([$2])])])])])
|
||||
|
||||
AC_DEFUN([_CS_CLCF_CVAR], [AS_TR_SH([cs_cv_prog_config_$1_ok])])
|
||||
AC_DEFUN([_CS_CLCF_SHVAR], [m4_toupper(AS_TR_SH([CONFIG_$1]))])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_CHECK_LIB_CONFIG_PROG_FLAGS(VARIABLE, TAG, CONFIG-PROGRAM, [ARGS])
|
||||
# Helper macro for _CS_CHECK_LIB_PKG_CONFIG_FLAGS() and
|
||||
# _CS_CHECK_LIB_CONFIG_FLAGS(). CONFIG-PROGRAM is a command which
|
||||
# responds to the --cflags and --libs options and returns suitable
|
||||
# compiler and linker flags for some package. ARGS, if supplied, is
|
||||
# passed to CONFIG-PROGRAM after the --cflags or --libs argument. The
|
||||
# results of the --cflags and --libs options are packed into a build
|
||||
# tuple and appended to the list of tuples stored in the shell variable
|
||||
# VARIABLE. TAG is used to compose the name of the cache variable. A good
|
||||
# choice for TAG is some unique combination of the library name and
|
||||
# configuration program.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_CHECK_LIB_CONFIG_PROG_FLAGS],
|
||||
[AS_IF([test -z "$_CS_CLCPF_CVAR([$2])"],
|
||||
[cs_check_lib_cflag=CS_RUN_PATH_NORMALIZE([$3 --cflags $4])
|
||||
cs_check_lib_lflag=''
|
||||
cs_check_lib_libs=CS_RUN_PATH_NORMALIZE([$3 --libs $4])
|
||||
_CS_CLCPF_CVAR([$2])=CS_CREATE_TUPLE(
|
||||
[$cs_check_lib_cflag],
|
||||
[$cs_check_lib_lflag],
|
||||
[$cs_check_lib_libs])])
|
||||
$1="$$1 $_CS_CLCPF_CVAR([$2])"])
|
||||
|
||||
AC_DEFUN([_CS_CLCPF_CVAR], [AS_TR_SH([cs_cv_prog_$1_flags])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_CHECK_LIB_CREATE_FLAGS(VARIABLE, LIBRARY, PATHS)
|
||||
# Helper macro for CS_CHECK_LIB_WITH(). Constructs a list of build
|
||||
# tuples suitable for CS_CHECK_BUILD() and appends the tuple list to the
|
||||
# shell variable VARIABLE. LIBRARY and PATHS have the same meanings as
|
||||
# the like-named arguments of CS_CHECK_LIB_WITH().
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAGS],
|
||||
[for cs_lib_item in $3
|
||||
do
|
||||
case $cs_lib_item in
|
||||
*\|*) CS_SPLIT(
|
||||
[$cs_lib_item], [cs_check_incdir,cs_check_libdir], [|])
|
||||
_CS_CHECK_LIB_CREATE_FLAG([$1],
|
||||
[$cs_check_incdir], [$cs_check_libdir], [$2])
|
||||
;;
|
||||
*) _CS_CHECK_LIB_CREATE_FLAG([$1],
|
||||
[$cs_lib_item/include], [$cs_lib_item/lib], [$2])
|
||||
_CS_CHECK_LIB_CREATE_FLAG(
|
||||
[$1], [$cs_lib_item], [$cs_lib_item], [$2])
|
||||
;;
|
||||
esac
|
||||
done])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_CHECK_LIB_CREATE_FLAG(VARIABLE, HEADER-DIR, LIBRARY-DIR, LIBRARY)
|
||||
# Helper macro for _CS_CHECK_LIB_CREATE_FLAGS(). Constructs build tuples
|
||||
# suitable for CS_CHECK_BUILD() for given header and library directories,
|
||||
# and appends the tuples to the shell variable VARIABLE. Synthesizes
|
||||
# tuples which check for LIBRARY as a MacOS/X framework, and a standard
|
||||
# link library.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_CHECK_LIB_CREATE_FLAG],
|
||||
[AS_IF([test -n "$2"], [cs_check_lib_cflag="-I$2"], [cs_check_lib_cflag=''])
|
||||
AS_IF([test -n "$3"], [cs_check_lib_lflag="-L$3"], [cs_check_lib_lflag=''])
|
||||
AS_IF([test -n "$4"],
|
||||
[cs_check_lib_libs="-l$4"
|
||||
cs_check_lib_framework="-framework $4"],
|
||||
[cs_check_lib_libs=''
|
||||
cs_check_lib_framework=''])
|
||||
$1="$$1
|
||||
CS_CREATE_TUPLE(
|
||||
[$cs_check_lib_cflag],
|
||||
[$cs_check_lib_lflag],
|
||||
[$cs_check_lib_framework])
|
||||
CS_CREATE_TUPLE(
|
||||
[$cs_check_lib_cflag],
|
||||
[$cs_check_lib_lflag],
|
||||
[$cs_check_lib_libs])"])
|
||||
68
mk/autoconf/checklibtool.m4
Normal file
68
mk/autoconf/checklibtool.m4
Normal file
@@ -0,0 +1,68 @@
|
||||
# checklibtool.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2004 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_CHECK_LIBTOOL
|
||||
# Find and identify the various implementations of libtool. In
|
||||
# particular, this macro is aware of GNU libtool and Apple's libtool
|
||||
# (which serves a completely different purpose). On MacOS/X, GNU libtool
|
||||
# is typically named glibtool, however a user might also use Fink to
|
||||
# install the unadorned libtool; and the Fink-installed version might
|
||||
# shadow Apple's own libtool if it appears in the PATH before the Apple
|
||||
# tool. This macro jumps through the necessary hoops to distinguish and
|
||||
# locate the various implementations. Sets the shell variable LIBTOOL to
|
||||
# the located GNU libtool (if any), and APPLE_LIBTOOL to the located
|
||||
# Apple libtool. Invokes AC_SUBST() for LIBTOOL and APPLE_LIBTOOL.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_LIBTOOL],
|
||||
[# GNU: Search for libtool before glibtool since Fink version is likely newer.
|
||||
m4_define([cs_lt_path_gnu],
|
||||
[/sw/bin$PATH_SEPARATOR/usr/local/bin$PATH_SEPARATOR$PATH])
|
||||
AS_IF([test -z "$LIBTOOL"],
|
||||
[CS_CHECK_TOOLS([LIBTOOL_TEST], [libtool glibtool gnulibtool], [],
|
||||
[cs_lt_path_gnu])
|
||||
AS_IF([test -n "$LIBTOOL_TEST"],
|
||||
[CS_PATH_PROG([LIBTOOL_PATH], [$LIBTOOL_TEST], [], [cs_lt_path_gnu])
|
||||
CS_LIBTOOL_CLASSIFY([$LIBTOOL_PATH],
|
||||
[LIBTOOL="$LIBTOOL_PATH"],
|
||||
[AS_IF([test -z "$APPLE_LIBTOOL"], [APPLE_LIBTOOL="$LIBTOOL_PATH"])
|
||||
CS_CHECK_TOOLS([LIBTOOL], [glibtool gnulibtool])])])])
|
||||
AC_SUBST([LIBTOOL])
|
||||
|
||||
# Apple: Ensure that Apple libtool will be found before GNU libtool from Fink.
|
||||
m4_define([cs_lt_path_apple],[/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH])
|
||||
AS_IF([test -z "$APPLE_LIBTOOL"],
|
||||
[CS_PATH_PROG([CS_LT_APPLE], [libtool], [], [cs_lt_path_apple])
|
||||
CS_LIBTOOL_CLASSIFY([$CS_LT_APPLE], [],
|
||||
[APPLE_LIBTOOL="$CS_LT_APPLE"])])
|
||||
AC_SUBST([APPLE_LIBTOOL])])
|
||||
|
||||
AC_DEFUN([CS_LIBTOOL_CLASSIFY],
|
||||
[AS_IF([test -n "$1"],
|
||||
[AC_MSG_CHECKING([classification of $1])
|
||||
CS_LIBTOOL_GNU_IFELSE([$1],
|
||||
[AC_MSG_RESULT([gnu])
|
||||
$2],
|
||||
[AC_MSG_RESULT([apple])
|
||||
$3])])])
|
||||
|
||||
AC_DEFUN([CS_LIBTOOL_GNU_IFELSE],
|
||||
[AS_IF([AC_RUN_LOG([$1 --version 1>&2])], [$2], [$3])])
|
||||
235
mk/autoconf/checkopengl.m4
Normal file
235
mk/autoconf/checkopengl.m4
Normal file
@@ -0,0 +1,235 @@
|
||||
#==============================================================================
|
||||
# Copyright (C)2003-2006 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_CHECK_OPENGL
|
||||
# Check for OpenGL.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
#
|
||||
# Some Mesa installations require pthread, so pthread flags are employed if
|
||||
# available.
|
||||
#
|
||||
# The check for opengl32 needs to precede other checks because Cygwin users
|
||||
# often have Mesa installed, and Mesa's OpenGL library is compiled without the
|
||||
# __stdcall flags which results in link errors, whereas Microsoft's native
|
||||
# opengl32 works fine. Conversely, some Unix implementations have Wine
|
||||
# installed (Windows emulation layer) which includes an opengl32.so library.
|
||||
# We need to avoid detection of this library on Unix since it would cause an
|
||||
# undesirable dependence upon Wine.
|
||||
#
|
||||
# Many OpenGL libraries on Unix already contain GLX, so there is no separate
|
||||
# GLX library, thus we first check for GLX using the discovered OpenGL library
|
||||
# before attempting to locate a separate GLX-specific library.
|
||||
#
|
||||
# On MacOS/X, some users have XFree86 installed which creates a link from
|
||||
# /usr/include/GL to /usr/X11R6/include/GL. We want to ignore this directory
|
||||
# and instead check for Apple's OpenGL.framework, if we are not cross-building
|
||||
# for Darwin. We accomplish this by placing the OpenGL.framework test ahead of
|
||||
# the other tests.
|
||||
#
|
||||
# At least one user (Jorrit) has a strange installation in which inclusion of
|
||||
# <windows.h> fails if an int32 is not present, thus we must take this into
|
||||
# account.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_define([cs_define_int32],
|
||||
[[#if !HAVE_TYPE_INT32
|
||||
typedef long int32;
|
||||
#endif
|
||||
]])
|
||||
|
||||
# CS_GL_INCLUDE(CPP-MACRO,FALLBACK,HEADER)
|
||||
AC_DEFUN([CS_GL_INCLUDE],
|
||||
[[#if HAVE_WINDOWS_H
|
||||
#if !HAVE_TYPE_INT32
|
||||
typedef long int32;
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#ifndef CS_HEADER_GLOBAL
|
||||
#define CS_HEADER_GLOBAL(X,Y) CS_HEADER_GLOBAL_COMPOSE(X,Y)
|
||||
#define CS_HEADER_GLOBAL_COMPOSE(X,Y) <X/Y>
|
||||
#endif
|
||||
#ifdef $1
|
||||
#include CS_HEADER_GLOBAL($1,$3)
|
||||
#else
|
||||
#include <$2/$3>
|
||||
#endif]])
|
||||
|
||||
AC_DEFUN([CS_CHECK_OPENGL],
|
||||
[AC_REQUIRE([CS_CHECK_HOST])
|
||||
AC_REQUIRE([CS_CHECK_COMMON_LIBS])
|
||||
AC_REQUIRE([CS_CHECK_PTHREAD])
|
||||
AC_REQUIRE([AC_PATH_X])
|
||||
AC_REQUIRE([AC_PATH_XTRA])
|
||||
AC_CHECK_TYPE([int32], [AC_DEFINE([HAVE_TYPE_INT32], [],
|
||||
[Whether the int32 type is available])], [])
|
||||
AC_CHECK_HEADERS([windows.h], [], [], [cs_define_int32])
|
||||
|
||||
# Apply plaform-specific flags if necessary.
|
||||
cs_gl_plat_cflags=''
|
||||
cs_gl_plat_lflags=''
|
||||
cs_gl_plat_libs=''
|
||||
AS_IF([test -n "$cs_cv_libm_cflags$cs_cv_libm_lflags$cs_cv_libm_libs"],
|
||||
[cs_gl_plat_cflags="$cs_cv_libm_cflags $cs_gl_plat_cflags"
|
||||
cs_gl_plat_lflags="$cs_cv_libm_lflags $cs_gl_plat_lflags"
|
||||
cs_gl_plat_libs="$cs_cv_libm_libs $cs_gl_plat_libs"])
|
||||
AS_IF([test $cs_cv_sys_pthread = yes],
|
||||
[cs_gl_plat_cflags="$cs_cv_sys_pthread_cflags $cs_gl_plat_cflags"
|
||||
cs_gl_plat_lflags="$cs_cv_sys_pthread_lflags $cs_gl_plat_lflags"
|
||||
cs_gl_plat_libs="$cs_cv_sys_pthread_libs $cs_gl_plat_libs"])
|
||||
AS_IF([test "$no_x" != yes],
|
||||
[cs_gl_plat_cflags="$X_CFLAGS $cs_gl_plat_cflags"
|
||||
cs_gl_plat_lflags="$cs_gl_plat_lflags"
|
||||
cs_gl_plat_libs="
|
||||
$X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS $cs_gl_plat_libs"])
|
||||
|
||||
# Mesa requested?
|
||||
AC_ARG_WITH([mesa], [AC_HELP_STRING([--with-mesa],
|
||||
[use Mesa OpenGL library if available (default YES)])],
|
||||
[], [with_mesa=yes])
|
||||
|
||||
AS_IF([test $with_mesa != no],
|
||||
[cs_mesa_gl=CS_CREATE_TUPLE([],[],[-lMesaGL])])
|
||||
|
||||
# MacOS/X or Darwin?
|
||||
AS_IF([test "x$cs_host_macosx" = "xyes"],
|
||||
[cs_osx_gl=CS_CREATE_TUPLE([-DCS_OPENGL_PATH=OpenGL],[],[-framework OpenGL])])
|
||||
|
||||
# Windows?
|
||||
AS_IF([test $cs_host_family = windows],
|
||||
[cs_win32_gl=CS_CREATE_TUPLE([],[],[-lopengl32])])
|
||||
|
||||
# Check for OpenGL.
|
||||
CS_CHECK_BUILD([for OpenGL], [cs_cv_libgl],
|
||||
[AC_LANG_PROGRAM([CS_GL_INCLUDE([CS_OPENGL_PATH],[GL],[gl.h])],[glEnd()])],
|
||||
[$cs_win32_gl \
|
||||
$cs_osx_gl \
|
||||
CS_CREATE_TUPLE([],[],[-lGL]) \
|
||||
CS_CREATE_TUPLE([],[],[-lgl]) \
|
||||
$cs_mesa_gl], [],
|
||||
[CS_EMIT_BUILD_RESULT([cs_cv_libgl], [GL])], [], [],
|
||||
[$cs_gl_plat_cflags], [$cs_gl_plat_lflags], [$cs_gl_plat_libs])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_GLU
|
||||
# Check for GLU.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_GLU],
|
||||
[AC_REQUIRE([CS_CHECK_OPENGL])
|
||||
AS_IF([test $cs_cv_libgl = yes],
|
||||
[AS_IF([test $with_mesa != no],
|
||||
[cs_mesa_glu=CS_CREATE_TUPLE([],[],[-lMesaGLU])])
|
||||
|
||||
# MacOS/X or Darwin?
|
||||
AS_IF([test "x$cs_host_macosx" = "xyes"],
|
||||
[cs_osx_glu=CS_CREATE_TUPLE([-DCS_GLU_PATH=OpenGL],[],[-framework OpenGL])])
|
||||
|
||||
# Windows?
|
||||
AS_IF([test $cs_host_family = windows],
|
||||
[cs_win32_gl=CS_CREATE_TUPLE([],[],[-lopengl32])])
|
||||
|
||||
# Check for GLU.
|
||||
CS_CHECK_BUILD([for GLU], [cs_cv_libglu],
|
||||
[AC_LANG_PROGRAM(
|
||||
[CS_GL_INCLUDE([CS_GLU_PATH],[GL],[glu.h])], [gluNewQuadric()])],
|
||||
[$cs_osx_glu \
|
||||
CS_CREATE_TUPLE() \
|
||||
$cs_win32_glu \
|
||||
CS_CREATE_TUPLE([],[],[-lGLU]) \
|
||||
CS_CREATE_TUPLE([],[],[-lglu]) \
|
||||
$cs_mesa_glu], [],
|
||||
[CS_EMIT_BUILD_RESULT([cs_cv_libglu], [GLU])], [], [],
|
||||
[$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_GLX
|
||||
# Check for GLX.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_GLX],
|
||||
[AC_REQUIRE([CS_CHECK_OPENGL])
|
||||
AS_IF([test $cs_cv_libgl = yes],
|
||||
[AS_IF([test $with_mesa != no],
|
||||
[cs_mesa_glx=CS_CREATE_TUPLE([],[],[-lMesaGLX])])
|
||||
|
||||
# Check for GLX.
|
||||
AS_IF([test "$no_x" != yes],
|
||||
[CS_CHECK_BUILD([for GLX], [cs_cv_libglx],
|
||||
[AC_LANG_PROGRAM([[#include <GL/glx.h>]], [glXWaitGL()])],
|
||||
[CS_CREATE_TUPLE() \
|
||||
CS_CREATE_TUPLE([],[],[-lGLX]) \
|
||||
CS_CREATE_TUPLE([],[],[-lglx]) \
|
||||
$cs_mesa_glx], [],
|
||||
[CS_EMIT_BUILD_RESULT([cs_cv_libglx], [GLX])], [], [],
|
||||
[$cs_cv_libgl_cflags], [$cs_cv_libgl_lflags], [$cs_cv_libgl_libs])])])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_GLXEXT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
# Check for GLX extensions.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_GLXEXT],
|
||||
[AC_REQUIRE([CS_CHECK_GLX])
|
||||
AS_IF([test x$cs_cv_libglx = "xyes"],
|
||||
[# Check for GLX extensions.
|
||||
CS_CHECK_BUILD([for GLX extensions], [cs_cv_libglx_extensions],
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#define GLX_GLXEXT_PROTOTYPES
|
||||
#include <GL/glx.h>]],
|
||||
[glXGetProcAddressARB(0)])],
|
||||
[CS_CREATE_TUPLE(
|
||||
[$cs_cv_libglx_cflags],
|
||||
[$cs_cv_libglx_lflags],
|
||||
[$cs_cv_libglx_libs])],
|
||||
[], [$1], [$2])])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_GLUT
|
||||
# Check for GLUT.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_GLUT],
|
||||
[AC_REQUIRE([CS_CHECK_GLU])
|
||||
AS_IF([test x$cs_cv_libglu = "xyes"],
|
||||
[# MacOS/X or Darwin?
|
||||
AS_IF([test "x$cs_host_macosx" = "xyes"],
|
||||
[cs_osx_glut=CS_CREATE_TUPLE([-DCS_GLUT_PATH=GLUT],[],[-framework GLUT])])
|
||||
|
||||
# Windows?
|
||||
AS_IF([test $cs_host_family = windows],
|
||||
[cs_win32_glut=CS_CREATE_TUPLE([],[],[-lglut32])])
|
||||
|
||||
# Check for GLUT.
|
||||
CS_CHECK_BUILD([for GLUT], [cs_cv_libglut],
|
||||
[AC_LANG_PROGRAM(
|
||||
[CS_GL_INCLUDE([CS_GLUT_PATH],[GL],[glut.h])], [glutSwapBuffers()])],
|
||||
[$cs_osx_glut \
|
||||
CS_CREATE_TUPLE() \
|
||||
$cs_win32_glut \
|
||||
CS_CREATE_TUPLE([],[],[-lGLUT]) \
|
||||
CS_CREATE_TUPLE([],[],[-lglut])], [],
|
||||
[CS_EMIT_BUILD_RESULT([cs_cv_libglut], [GLUT])], [], [],
|
||||
[$cs_cv_libgl_cflags $cs_cv_libglu_cflags],
|
||||
[$cs_cv_libgl_lflags $cs_cv_libglu_lflags],
|
||||
[$cs_cv_libgl_libs $cs_cv_libglu_libs])])])
|
||||
|
||||
59
mk/autoconf/checkpic.m4
Normal file
59
mk/autoconf/checkpic.m4
Normal file
@@ -0,0 +1,59 @@
|
||||
# checkpic.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)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_COMPILER_PIC([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check if compiler can be instructed to produce
|
||||
# position-independent-code (PIC). This feature is required by some
|
||||
# platforms when building plugin modules and shared libraries. If
|
||||
# LANGUAGE is not provided, then `C' is assumed (other options include
|
||||
# `C++'). If CACHE-VAR is not provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_pic". If a PIC-enabling option (such as `-fPIC')
|
||||
# is discovered, then it is assigned to CACHE-VAR and ACTION-IF-FOUND is
|
||||
# invoked; otherwise the empty string is assigned to CACHE-VAR and
|
||||
# ACTION-IF-NOT-FOUND is invoked.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
#
|
||||
# On some platforms (such as Windows), the -fPIC option is superfluous
|
||||
# and emits a warning "-fPIC ignored for target (all code is position
|
||||
# independent)", despite the fact that the compiler accepts the option
|
||||
# and returns a success code. We want to re-interpret the warning as a
|
||||
# failure in order to avoid unnecessary compiler diagnostics in case the
|
||||
# client inserts the result of this check into CFLAGS, for instance. We
|
||||
# do so by attempting to promote warnings to errors using the result of
|
||||
# CS_COMPILER_ERRORS(). As an extra safe-guard, we also scan the compiler
|
||||
# output for an appropriate diagnostic because some gcc warnings fail to
|
||||
# promote to error status despite use of -Werror.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_PIC],
|
||||
[CS_COMPILER_ERRORS([$1],
|
||||
[m4_default([$2_werror],[cs_cv_prog_compiler_pic_werror])])
|
||||
CS_CHECK_BUILD_FLAGS(
|
||||
[how to enable m4_default([$1],[C]) PIC generation],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_pic])],
|
||||
[CS_CREATE_TUPLE([-fPIC])], [$1], [$3], [$4],
|
||||
[m4_default([$$2_werror],[$cs_cv_prog_compiler_pic_werror])], [], [],
|
||||
[fPIC])])
|
||||
|
||||
# Backward-compatiblity alias.
|
||||
AC_DEFUN([CS_CHECK_COMPILER_PIC], [CS_COMPILER_PIC([$1],[$2],[$3],[$4])])
|
||||
138
mk/autoconf/checkprog.m4
Normal file
138
mk/autoconf/checkprog.m4
Normal file
@@ -0,0 +1,138 @@
|
||||
# checkprog.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2004 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_bin_paths_default
|
||||
# Comma delimited list of additional directories in which tools and
|
||||
# commands might be found.
|
||||
#
|
||||
# Present Cases:
|
||||
# /usr/local/bin -- Although a common location for executables, it is
|
||||
# now-and-then absent from the default PATH setting.
|
||||
# /sw/bin -- Fink, the MacOS/X manager of Unix packages, installs
|
||||
# executables here.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_define([cs_bin_paths_default], [/usr/local/bin, /sw/bin])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_PROG(VARIABLE, PROGRAM, VALUE-IF-FOUND, [VALUE-IF-NOT-FOUND],
|
||||
# [PATH], [REJECT])
|
||||
# Simple wrapper for AC_CHECK_PROG() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_PROG],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_CHECK_PROG([$1], [$2], [$3], [$4],
|
||||
m4_ifval([$5], [_CS_PROG_CLIENT_PATH([$5])]), [$6])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_CHECK_PROGS() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_PROGS],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_CHECK_PROGS([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_CHECK_TOOL() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_TOOL],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_CHECK_TOOL([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_TOOLS(VARIABLE, TOOLS, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_CHECK_TOOLS() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_TOOLS],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_CHECK_TOOLS([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_PATH_PROG(VARIABLE, PROGRAM, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_PATH_PROG() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PATH_PROG],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_PATH_PROG([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_PATH_PROGS(VARIABLE, PROGRAMS, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_PATH_PROGS() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PATH_PROGS],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_PATH_PROGS([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_PATH_TOOL(VARIABLE, TOOL, [VALUE-IF-NOT-FOUND], [PATH])
|
||||
# Simple wrapper for AC_PATH_TOOL() which ensures that the search path
|
||||
# is augmented by the directories mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PATH_TOOL],
|
||||
[_CS_PROG_PATH_PREPARE
|
||||
AC_PATH_TOOL([$1], [$2], [$3],
|
||||
m4_ifval([$4], [_CS_PROG_CLIENT_PATH([$4])]))])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_PROG_PATH_PREPARE
|
||||
# Ensure that the PATH environment variable mentions the set of
|
||||
# directories listed in cs_bin_paths_default. These directories may not
|
||||
# appear by default in the typical PATH, yet they might be common
|
||||
# locations for tools and commands.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_PROG_PATH_PREPARE],
|
||||
[AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE])
|
||||
AS_IF([test "$cs_prog_path_prepared" != yes],
|
||||
[cs_prog_path_prepared=yes
|
||||
PATH="$PATH[]m4_foreach([cs_bin_path], [cs_bin_paths_default],
|
||||
[$PATH_SEPARATOR[]cs_bin_path])"
|
||||
export PATH])])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# _CS_PROG_CLIENT_PATH(CLIENT-PATH)
|
||||
# Given a client-supplied replacement for PATH, augment the list by
|
||||
# appending the locations mentioned in cs_bin_paths_default.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([_CS_PROG_CLIENT_PATH],
|
||||
[AS_REQUIRE([_AS_PATH_SEPARATOR_PREPARE])dnl
|
||||
$1[]m4_foreach([cs_bin_path], [cs_bin_paths_default],
|
||||
[$PATH_SEPARATOR[]cs_bin_path])])
|
||||
102
mk/autoconf/checkpthread.m4
Normal file
102
mk/autoconf/checkpthread.m4
Normal file
@@ -0,0 +1,102 @@
|
||||
# checkpthread.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_CHECK_PTHREAD([REJECT-MASK])
|
||||
# Check for pthread. Also check if the pthread implementation supports
|
||||
# the recursive and timed mutex extensions. (Timed mutexes are needed for
|
||||
# the NPTL: New Posix Thread Library on GNU/Linux if the mutex is going
|
||||
# to be used with any of the timed condition-wait functions.) The shell
|
||||
# variable cs_cv_sys_pthread is set to "yes" if pthread is available,
|
||||
# else "no". If available, then the variables cs_cv_sys_pthread_cflags,
|
||||
# cs_cv_sys_pthread_lflags, and cs_cv_sys_pthread_libs are set. (As a
|
||||
# convenience, these variables can be emitted to an output file with
|
||||
# CS_EMIT_BUILD_RESULT() by passing "cs_cv_sys_pthread" as its CACHE-VAR
|
||||
# argument.) If the recursive mutex extension is supported, then
|
||||
# cs_cv_sys_pthread_mutex_recursive will be set with the literal name of
|
||||
# the constant which must be passed to pthread_mutexattr_settype() to
|
||||
# enable this feature. The constant name will be typically
|
||||
# PTHREAD_MUTEX_RECURSIVE or PTHREAD_MUTEX_RECURSIVE_NP. If the recursive
|
||||
# mutex extension is not available, then
|
||||
# cs_cv_sys_pthread_mutex_recursive will be set to "no". If the timed
|
||||
# mutex extension is supported, then cs_cv_sys_pthread_mutex_timed will
|
||||
# be set with the literal name of the constant which must be passed to
|
||||
# pthread_mutexattr_settype() to enable this feature. The constant name
|
||||
# will be typically PTHREAD_MUTEX_TIMED or PTHREAD_MUTEX_TIMED_NP. If the
|
||||
# timed mutex extension is not available, then
|
||||
# cs_cv_sys_pthread_mutex_timed will be set to "no". REJECT-MASK can be
|
||||
# used to limit the platforms on which the pthread test is performed. It
|
||||
# is compared against $host_os; matches are rejected. If omitted, then
|
||||
# the test is performed on all platforms. Examples: To avoid testing on
|
||||
# Cygwin, use "cygwin*"; to avoid testing on Cygwin and AIX, use
|
||||
# "cygwin*|aix*".
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_PTHREAD],
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
case $host_os in
|
||||
m4_ifval([$1],
|
||||
[$1)
|
||||
cs_cv_sys_pthread=no
|
||||
;;
|
||||
])
|
||||
*)
|
||||
CS_CHECK_BUILD([for pthread], [cs_cv_sys_pthread],
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
void* worker(void* p) { (void)p; return p; }]],
|
||||
[pthread_t tid;
|
||||
sem_t sem;
|
||||
pthread_create(&tid, 0, worker, 0);
|
||||
sem_init(&sem, 0, 0);
|
||||
sem_destroy(&sem);])],
|
||||
[cs_pthread_flags])
|
||||
;;
|
||||
esac
|
||||
_CS_CHECK_MUTEX_FEATURE([PTHREAD_MUTEX_RECURSIVE],
|
||||
[cs_cv_sys_pthread_mutex_recursive], [for pthread recursive mutexes])])
|
||||
|
||||
# _CS_CHECK_MUTEX_FEATURE(FEATURE, CACHE-VAR, MESSAGE)
|
||||
AC_DEFUN([_CS_CHECK_MUTEX_FEATURE],
|
||||
[AS_IF([test $cs_cv_sys_pthread = yes],
|
||||
[AC_CACHE_CHECK([$3], [$2],
|
||||
[CS_BUILD_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <pthread.h>]],
|
||||
[pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_settype(&attr, CS_MUTEX_FEATURE);])],
|
||||
[CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1]) \
|
||||
CS_CREATE_TUPLE([-DCS_MUTEX_FEATURE=$1_NP])],
|
||||
[],
|
||||
[$2=`echo $cs_build_cflags | sed 's/.*\($1_*N*P*\).*/\1/'`],
|
||||
[$2=no],
|
||||
[$cs_cv_sys_pthread_cflags -D_GNU_SOURCE],
|
||||
[$cs_cv_sys_pthread_lflags],
|
||||
[$cs_cv_sys_pthread_libs])])],
|
||||
[$2=no])])
|
||||
|
||||
m4_define([cs_pthread_flags],
|
||||
[CS_CREATE_TUPLE() \
|
||||
CS_CREATE_TUPLE([], [], [-lpthread]) \
|
||||
CS_CREATE_TUPLE([], [], [-lpthread -lrt]) \
|
||||
CS_CREATE_TUPLE([-pthread], [-pthread], []) \
|
||||
CS_CREATE_TUPLE([-pthread], [-pthread], [-lpthread]) \
|
||||
CS_CREATE_TUPLE([-pthread], [-pthread], [-lc_r])])
|
||||
45
mk/autoconf/checktt2.m4
Normal file
45
mk/autoconf/checktt2.m4
Normal file
@@ -0,0 +1,45 @@
|
||||
# checktt2.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2004,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_CHECK_TEMPLATE_TOOLKIT2([EMITTER])
|
||||
# Check if Template Toolkit 2 (http://www.tt2.org/) is available. The
|
||||
# shell variable cs_cv_perl_tt2 is set to "yes" if the package is
|
||||
# discovered, else "no". Also sets the shell variable TTREE to the name
|
||||
# path of the 'ttree' utility program and invokes AC_SUBST(). If EMITTER
|
||||
# is provided and the package was discovered, then
|
||||
# CS_EMIT_BUILD_PROPERTY() is invoked with EMITTER in order to record the
|
||||
# value of the TTREE variable in an output file. As a convenience, if
|
||||
# EMITTER is the literal value "emit" or "yes", then
|
||||
# CS_EMIT_BUILD_RESULT()'s default emitter will be used.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_TEMPLATE_TOOLKIT2],
|
||||
[CS_CHECK_PROGS([PERL], [perl5 perl])
|
||||
AS_IF([test -n "$PERL"],
|
||||
[AC_CACHE_CHECK([for TemplateToolkit], [cs_cv_perl_tt2],
|
||||
[AS_IF([AC_RUN_LOG(
|
||||
[$PERL -M'Template 2.11' -MTemplate::Plugin -e 0 1>&2])],
|
||||
[cs_cv_perl_tt2=yes],
|
||||
[cs_cv_perl_tt2=no])])
|
||||
CS_PATH_PROGS([TTREE], [ttree])
|
||||
AS_IF([test $cs_cv_perl_tt2 = yes && test -n "$TTREE"],
|
||||
[CS_EMIT_BUILD_PROPERTY([TTREE], [$TTREE], [], [],
|
||||
CS_EMITTER_OPTIONAL([$1]))])])])
|
||||
99
mk/autoconf/compiler.m4
Normal file
99
mk/autoconf/compiler.m4
Normal file
@@ -0,0 +1,99 @@
|
||||
# compiler.m4 -*- Autoconf -*-
|
||||
#=============================================================================
|
||||
# Copyright (C)2003 by Matze Braun <matze@braunis.de>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#=============================================================================
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Detection of C and C++ compilers and setting flags
|
||||
#
|
||||
# CS_PROG_CC
|
||||
# Detects the C compiler. Also takes care of the CFLAGS, CPPFLAGS and CC
|
||||
# environment variables. This will filter out all -g and -O from the
|
||||
# CFLAGS variable because Autoconf's -g and -O defaults are not always
|
||||
# desired. This will also set the CMD.CC and COMPILER.CFLAGS variables
|
||||
# in Jamconfig
|
||||
# CS_PROG_CXX
|
||||
# Detects the C++ compiler. Also takes care of the CXXFLAGS, CPPFLAGS
|
||||
# and CXX environment variables. This will filter out all -g and -O from
|
||||
# the CXXFLAGS variable because Autoconf's -g and -O defaults are not
|
||||
# always desired. This will also set the CMD.C++ and COMPILER.C++FLAGS
|
||||
# variables in Jamconfig
|
||||
# CS_PROG_LINK
|
||||
# Tries to determine a linker. This is done by checking if a C++ or
|
||||
# Objecctive-C++ compiler is available in which case it is used for
|
||||
# linking; otherwise the C or Objective-C compiler is used. This also
|
||||
# sets the CMD.LINK and COMPILER.LFLAGS variables in Jamconfig and
|
||||
# respects the LDFLAGS environment variable. Finally, checks if linker
|
||||
# recognizes -shared and sets PLUGIN.LFLAGS; and checks if linker
|
||||
# recognizes -soname and sets PLUGIN.LFLAGS.USE_SONAME to "yes".
|
||||
#-----------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PROG_CC],[
|
||||
CFLAGS="$CFLAGS" # Filter undesired flags
|
||||
AC_PROG_CC
|
||||
AS_IF([test -n "$CC"],[
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.CC], [$CC])
|
||||
CS_EMIT_BUILD_PROPERTY([COMPILER.CFLAGS], [$CPPFLAGS $CFLAGS], [+])
|
||||
|
||||
# Check if compiler recognizes -pipe directive.
|
||||
CS_EMIT_BUILD_FLAGS([if $CC accepts -pipe], [cs_cv_prog_cc_pipe],
|
||||
[CS_CREATE_TUPLE([-pipe])], [C], [COMPILER.CFLAGS], [+])
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([CS_PROG_CXX],[
|
||||
CXXFLAGS="$CXXFLAGS" # Filter undesired flags
|
||||
AC_PROG_CXX
|
||||
AS_IF([test -n "$CXX"],[
|
||||
CS_EMIT_BUILD_PROPERTY([CMD.C++], [$CXX])
|
||||
|
||||
CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS], [$CPPFLAGS $CXXFLAGS], [+])
|
||||
|
||||
# Check if compiler can be instructed to produce position-independent-code
|
||||
# (PIC). This feature is required by some platforms when building plugin
|
||||
# modules and shared libraries.
|
||||
CS_COMPILER_PIC([C++], [cs_cv_prog_cxx_pic],
|
||||
[CS_EMIT_BUILD_PROPERTY([COMPILER.C++FLAGS.PIC],
|
||||
[$cs_cv_prog_cxx_pic])])
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([CS_PROG_LINK],[
|
||||
AS_IF([test -n "$CXX"],
|
||||
[CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.C++)])])],
|
||||
[CS_EMIT_BUILD_PROPERTY([CMD.LINK], [AS_ESCAPE([$(CMD.CC)])])])
|
||||
|
||||
CS_EMIT_BUILD_PROPERTY([COMPILER.LFLAGS], [$LDFLAGS], [+])
|
||||
|
||||
# Check if compiler/linker recognizes -shared directive which is needed for
|
||||
# linking plugin modules. Unfortunately, the Apple compiler (and possibly
|
||||
# others) requires extra effort. Even though the compiler does not recognize
|
||||
# the -shared option, it nevertheless returns a "success" result after emitting
|
||||
# the warning "unrecognized option `-shared'". Worse, even -Werror fails to
|
||||
# promote the warning to an error, so we must instead scan the compiler's
|
||||
# output for an appropriate diagnostic.
|
||||
CS_CHECK_BUILD_FLAGS([if -shared is accepted], [cs_cv_prog_link_shared],
|
||||
[CS_CREATE_TUPLE([-shared])], [C++],
|
||||
[CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS], [-shared], [+])], [],
|
||||
[], [], [], [shared])
|
||||
|
||||
# Check if linker recognizes -soname which is used to assign a name internally
|
||||
# to plugin modules.
|
||||
CS_CHECK_BUILD([if -soname is accepted], [cs_cv_prog_link_soname], [],
|
||||
[CS_CREATE_TUPLE([-Wl,-soname,foobar])], [C++],
|
||||
[CS_EMIT_BUILD_PROPERTY([PLUGIN.LFLAGS.USE_SONAME], [yes])])
|
||||
])
|
||||
1459
mk/autoconf/config.guess
vendored
Normal file
1459
mk/autoconf/config.guess
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1549
mk/autoconf/config.sub
vendored
Normal file
1549
mk/autoconf/config.sub
vendored
Normal file
File diff suppressed because it is too large
Load Diff
144
mk/autoconf/cs_check_host.m4
Normal file
144
mk/autoconf/cs_check_host.m4
Normal file
@@ -0,0 +1,144 @@
|
||||
#------------------------------------------------------------------------------
|
||||
# Determine host platform. Recognized families: Unix, Windows, MacOS/X.
|
||||
# Orginial Macros Copyright (C)2003 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.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Determine host CPU.
|
||||
#
|
||||
# CS_CHECK_HOST_CPU
|
||||
# Set the shell variable cs_host_cpu to a normalized form of the CPU name
|
||||
# returned by config.guess/config.sub. Typically, Crystal Space's
|
||||
# conception of CPU name is the same as that returned by
|
||||
# config.guess/config.sub, but there may be exceptions as seen in the
|
||||
# `case' statement. Also takes the normalized name, uppercases it to
|
||||
# form a name suitable for the C preprocessor. Additionally sets the
|
||||
# TARGET.PROCESSOR Jamconfig property.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_HOST_CPU],
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
case $host_cpu in
|
||||
[[Ii][3-9]86*|[Xx]86*]) cs_host_cpu=x86 ;;
|
||||
*) cs_host_cpu=$host_cpu ;;
|
||||
esac
|
||||
cs_host_cpu_normalized="AS_TR_CPP([$cs_host_cpu])"
|
||||
CS_JAMCONFIG_PROPERTY([TARGET.PROCESSOR], [$cs_host_cpu_normalized])
|
||||
])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_CHECK_HOST
|
||||
# Sets the shell variables cs_host_target cs_host_family,
|
||||
# cs_host_os_normalized, and cs_host_os_normalized_uc. Emits appropriate
|
||||
# CS_PLATFORM_UNIX, CS_PLATFORM_WIN32, CS_PLATFORM_MACOSX via
|
||||
# AC_DEFINE(), and TARGET.OS and TARGET.OS.NORMALIZED to Jamconfig.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_HOST],
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
CS_CHECK_HOST_CPU
|
||||
cs_host_os_normalized=''
|
||||
case $host_os in
|
||||
mingw*|cygwin*)
|
||||
cs_host_target=win32gcc
|
||||
cs_host_family=windows
|
||||
;;
|
||||
darwin*)
|
||||
_CS_CHECK_HOST_DARWIN
|
||||
;;
|
||||
*)
|
||||
# Everything else is assumed to be Unix or Unix-like.
|
||||
cs_host_target=unix
|
||||
cs_host_family=unix
|
||||
;;
|
||||
esac
|
||||
|
||||
case $cs_host_family in
|
||||
windows)
|
||||
AC_DEFINE([CS_PLATFORM_WIN32], [],
|
||||
[Define when compiling for Win32])
|
||||
AS_IF([test -z "$cs_host_os_normalized"],
|
||||
[cs_host_os_normalized='Win32'])
|
||||
;;
|
||||
unix)
|
||||
AC_DEFINE([CS_PLATFORM_UNIX], [],
|
||||
[Define when compiling for Unix and Unix-like (i.e. MacOS/X)])
|
||||
AS_IF([test -z "$cs_host_os_normalized"],
|
||||
[cs_host_os_normalized='Unix'])
|
||||
;;
|
||||
esac
|
||||
|
||||
cs_host_os_normalized_uc="AS_TR_CPP([$cs_host_os_normalized])"
|
||||
CS_JAMCONFIG_PROPERTY([TARGET.OS], [$cs_host_os_normalized_uc])
|
||||
CS_JAMCONFIG_PROPERTY([TARGET.OS.NORMALIZED], [$cs_host_os_normalized])
|
||||
])
|
||||
|
||||
AC_DEFUN([_CS_CHECK_HOST_DARWIN],
|
||||
[AC_REQUIRE([CS_PROG_CC])
|
||||
AC_REQUIRE([CS_PROG_CXX])
|
||||
|
||||
# Both MacOS/X and Darwin are identified via $host_os as "darwin". We need
|
||||
# a way to distinguish between the two. If Carbon.h is present, then
|
||||
# assume MacOX/S; if not, assume Darwin. If --with-x=yes was invoked, and
|
||||
# Carbon.h is present, then assume that user wants to cross-build for
|
||||
# Darwin even though build host is MacOS/X.
|
||||
# IMPLEMENTATION NOTE *1*
|
||||
# The QuickTime 7.0 installer removes <CarbonSound/CarbonSound.h>, which
|
||||
# causes #include <Carbon/Carbon.h> to fail unconditionally. Re-installing
|
||||
# the QuickTime SDK should restore the header, however not all developers
|
||||
# know to do this, so we work around the problem of the missing
|
||||
# CarbonSound.h by #defining __CARBONSOUND__ in the test in order to
|
||||
# prevent Carbon.h from attempting to #include the missing header.
|
||||
# IMPLEMENTATION NOTE *2*
|
||||
# At least one MacOS/X user switches between gcc 2.95 and gcc 3.3 with a
|
||||
# script which toggles the values of CC, CXX, and CPP. Unfortunately, CPP
|
||||
# was being set to run the preprocessor directly ("cpp", for instance)
|
||||
# rather than running it via the compiler ("gcc -E", for instance). The
|
||||
# problem with running the preprocessor directly is that __APPLE__ and
|
||||
# __GNUC__ are not defined, which causes the Carbon.h check to fail. We
|
||||
# avoid this problem by supplying a non-empty fourth argument to
|
||||
# AC_CHECK_HEADER(), which causes it to test compile the header only (which
|
||||
# is a more robust test), rather than also testing it via the preprocessor.
|
||||
|
||||
AC_DEFINE([__CARBONSOUND__], [],
|
||||
[Avoid problem caused by missing <Carbon/CarbonSound.h>])
|
||||
AC_CHECK_HEADER([Carbon/Carbon.h],
|
||||
[cs_host_macosx=yes], [cs_host_macosx=no], [/* force compile */])
|
||||
|
||||
AS_IF([test $cs_host_macosx = yes],
|
||||
[AC_MSG_CHECKING([for --with-x])
|
||||
AS_IF([test "${with_x+set}" = set && test "$with_x" = "yes"],
|
||||
[AC_MSG_RESULT([yes (assume Darwin)])
|
||||
cs_host_macosx=no],
|
||||
[AC_MSG_RESULT([no])])])
|
||||
|
||||
AS_IF([test $cs_host_macosx = yes],
|
||||
[cs_host_target=macosx
|
||||
cs_host_family=unix
|
||||
cs_host_os_normalized='MacOS/X'
|
||||
AC_DEFINE([CS_PLATFORM_MACOSX], [],
|
||||
[Define when compiling for MacOS/X])
|
||||
|
||||
AC_CACHE_CHECK([for Objective-C compiler], [cs_cv_prog_objc],
|
||||
[cs_cv_prog_objc="$CC"])
|
||||
CS_JAMCONFIG_PROPERTY([CMD.OBJC], [$cs_cv_prog_objc])
|
||||
AC_CACHE_CHECK([for Objective-C++ compiler], [cs_cv_prog_objcxx],
|
||||
[cs_cv_prog_objcxx="$CXX"])
|
||||
CS_JAMCONFIG_PROPERTY([CMD.OBJC++], [$cs_cv_prog_objcxx])],
|
||||
|
||||
[cs_host_target=unix
|
||||
cs_host_family=unix])])
|
||||
31
mk/autoconf/diagnose.m4
Normal file
31
mk/autoconf/diagnose.m4
Normal file
@@ -0,0 +1,31 @@
|
||||
# diagnose.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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_MSG_ERROR(ERROR-DESCRIPTION, [EXIT-STATUS])
|
||||
# A convenience wrapper for AC_MSG_ERROR() which invokes AC_CACHE_SAVE()
|
||||
# before aborting the script. Saving the cache should make subsequent
|
||||
# re-invocations of the configure script faster once the user has
|
||||
# corrected the problem(s) which caused the failure.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_MSG_ERROR],
|
||||
[AC_CACHE_SAVE
|
||||
AC_MSG_ERROR([$1], [$2])])
|
||||
222
mk/autoconf/embed.m4
Normal file
222
mk/autoconf/embed.m4
Normal file
@@ -0,0 +1,222 @@
|
||||
# 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])])
|
||||
172
mk/autoconf/emit.m4
Normal file
172
mk/autoconf/emit.m4
Normal file
@@ -0,0 +1,172 @@
|
||||
# emit.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_EMIT_BUILD_PROPERTY(KEY, VALUE, [APPEND], [EMPTY-OKAY], [EMITTER],
|
||||
# [UNCONDITIONAL])
|
||||
# A utility function which invokes an emitter to record the KEY/VALUE
|
||||
# tuple if VALUE is not the empty string (after leading and trailing
|
||||
# whitespace is stripped). If EMPTY-OKAY is not an empty string, then the
|
||||
# property is emitted even if VALUE is empty; that is, it is emitted
|
||||
# unconditionally. If APPEND is the empty string, then the emitter sets
|
||||
# the key's value directly (though it may be overridden by the
|
||||
# environment), otherwise the emitter appends VALUE to the existing value
|
||||
# of the key. EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or
|
||||
# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the
|
||||
# KEY/VALUE tuple; it should also accept APPEND as an optional third
|
||||
# argument. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. Some
|
||||
# emitters accept an optional fourth argument, UNCONDITIONAL, which
|
||||
# instructs it to set KEY's value unconditionally, even if KEY already
|
||||
# had been assigned a value via some other mechanism (such as imported
|
||||
# from the environment, or from Jambase, in the case of
|
||||
# CS_JAMCONFIG_PROPERTY).
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_EMIT_BUILD_PROPERTY],
|
||||
[cs_build_prop_val="$2"
|
||||
cs_build_prop_val=CS_TRIM([$cs_build_prop_val])
|
||||
m4_ifval([$4],
|
||||
[CS_JAMCONFIG_PROPERTY([$1], [$cs_build_prop_val], [$3])],
|
||||
AS_IF([test -n "$cs_build_prop_val"],
|
||||
[m4_default([$5],[CS_JAMCONFIG_PROPERTY])(
|
||||
[$1], [$cs_build_prop_val], [$3], [$6])]))])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_EMIT_BUILD_RESULT(CACHE-VAR, PREFIX, [EMITTER])
|
||||
# Record the results of CS_CHECK_BUILD() or CS_CHECK_LIB_WITH() via some
|
||||
# emitter. If CACHE-VAR indicates that the build succeeded, then the
|
||||
# following properties are emitted:
|
||||
#
|
||||
# PREFIX.AVAILABLE = yes
|
||||
# PREFIX.CFLAGS = $CACHE-VAR_cflags
|
||||
# PREFIX.LFLAGS = $CACHE-VAR_lflags $CACHE-VAR_libs
|
||||
#
|
||||
# EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or
|
||||
# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the
|
||||
# KEY/VALUE tuple. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_EMIT_BUILD_RESULT],
|
||||
[AS_IF([test "$$1" = yes],
|
||||
[CS_EMIT_BUILD_PROPERTY([$2.AVAILABLE], [yes], [], [], [$3])
|
||||
CS_EMIT_BUILD_PROPERTY([$2.CFLAGS], [$$1_cflags], [], [], [$3])
|
||||
CS_EMIT_BUILD_PROPERTY([$2.LFLAGS], [$$1_lflags $$1_libs],
|
||||
[], [], [$3])])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_EMIT_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], EMITTER-KEY,
|
||||
# [APPEND], [ACTION-IF-RECOGNIZED],
|
||||
# [ACTION-IF-NOT-RECOGNIZED], [EMITTER])
|
||||
# A convenience wrapper for CS_CHECK_BUILD_FLAGS() which also records the
|
||||
# results via CS_EMIT_BUILD_PROPERTY(). Checks if the compiler or linker
|
||||
# recognizes a command-line option. MESSAGE is the "checking" message.
|
||||
# CACHE-VAR is the shell cache variable which receives the flag
|
||||
# recognized by the compiler or linker, or "no" if the flag was not
|
||||
# recognized. FLAGS is a whitespace- delimited list of build tuples
|
||||
# created with CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in
|
||||
# order until one is found which is recognized by the compiler. After
|
||||
# that, no further flags are checked. LANGUAGE is typically either C or
|
||||
# C++ and specifies which compiler to use for the test. If LANGUAGE is
|
||||
# omitted, C is used. EMITTER-KEY is the name to pass as the emitter's
|
||||
# "key" argument if a usable flag is encountered. If APPEND is not the
|
||||
# empty string, then the discovered flag is appended to the existing
|
||||
# value of the EMITTER-KEY. If the command-line option was recognized,
|
||||
# then ACTION-IF-RECOGNIZED is invoked, otherwise
|
||||
# ACTION-IF-NOT-RECOGNIZED is invoked. EMITTER is a macro name, such as
|
||||
# CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs the
|
||||
# actual task of emitting the KEY/VALUE tuple; it should also accept
|
||||
# APPEND as an optional third argument. If EMITTER is omitted,
|
||||
# CS_JAMCONFIG_PROPERTY is used.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_EMIT_BUILD_FLAGS],
|
||||
[CS_CHECK_BUILD_FLAGS([$1], [$2], [$3], [$4],
|
||||
[CS_EMIT_BUILD_PROPERTY([$5], [$$2], [$6], [], [$9])
|
||||
$7],
|
||||
[$8])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_EMITTER_OPTIONAL([EMITTER])
|
||||
# The CS_EMIT_FOO() macros optionally accept an emitter. If no emitter is
|
||||
# supplied to those macros, then a default emitter is chosen. Other
|
||||
# macros, however, which perform testing and optionally emit the results
|
||||
# may wish to interpret an omitted EMITTER as a request not to emit the
|
||||
# results. CS_EMITTER_OPTIONAL() is a convenience macro to help in these
|
||||
# cases. It should be passed to one of the CS_EMIT_FOO() macros in place
|
||||
# of the literal EMITTER argument. It functions by re-interpretating
|
||||
# EMITTER as follows:
|
||||
#
|
||||
# - If EMITTER is omitted, then CS_NULL_EMITTER is returned, effectively
|
||||
# disabling output by the CS_EMIT_FOO() macro.
|
||||
# - If EMITTER is the literal string "emit" or "yes", then it returns an
|
||||
# empty string, which signals to the CS_EMIT_FOO() macro that is should
|
||||
# use its default emitter.
|
||||
# - Any other value for EMITTER is passed along as-is to the
|
||||
# CS_EMIT_FOO() macro.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_EMITTER_OPTIONAL],
|
||||
[m4_case([$1],
|
||||
[], [[CS_NULL_EMITTER]],
|
||||
[emit], [],
|
||||
[yes], [],
|
||||
[[$1]])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_NULL_EMITTER(KEY, VALUE, [APPEND])
|
||||
# A do-nothing emitter suitable for use as the EMITTER argument of one of
|
||||
# the CS_EMIT_FOO() macros.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_NULL_EMITTER], [:
|
||||
])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_SUBST_EMITTER(KEY, VALUE, [APPEND])
|
||||
# An emitter wrapped around AC_SUBST(). Invokes
|
||||
# AC_SUBST(AS_TR_SH(KEY),VALUE). The APPEND argument is ignored.
|
||||
# Suitable for use as the EMITTER argument of one of the CS_EMIT_FOO()
|
||||
# macros. The call to AS_TR_SH() ensures that KEY is transformed into a
|
||||
# valid shell variable. For instance, if a macro attempts to emit
|
||||
# MYLIB.CFLAGS and MYLIB.LFLAGS via CS_SUBST_EMITTER(), then the names
|
||||
# will be transformed to MYLIB_CFLAGS and MYLIB_LFLAGS, respectively, for
|
||||
# the invocation of AC_SUBST().
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_SUBST_EMITTER], [AC_SUBST(AS_TR_SH([$1]),[$2])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_DEFINE_EMITTER(KEY, VALUE, [APPEND])
|
||||
# An emitter wrapped around AC_DEFINE_UNQUOTED(). Invokes
|
||||
# AC_DEFINE_UNQUOTED(AS_TR_CPP(KEY),VALUE). The APPEND argument is
|
||||
# ignored. Suitable for use as the EMITTER argument of one of the
|
||||
# CS_EMIT_FOO() macros. The call to AS_TR_CPP() ensures that KEY is a
|
||||
# well-formed token for the C-preprocessor.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_DEFINE_EMITTER],
|
||||
[AC_DEFINE_UNQUOTED(AS_TR_CPP([$1]),[$2],
|
||||
[Define when feature is available])])
|
||||
48
mk/autoconf/headercache.m4
Normal file
48
mk/autoconf/headercache.m4
Normal file
@@ -0,0 +1,48 @@
|
||||
# headercache.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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])
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Text cache facility for C-style #define properties. The cache is stored in
|
||||
# the shell variable cs_header_text.
|
||||
#
|
||||
# CS_HEADER_APPEND(TEXT)
|
||||
# Append text to the C header text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_APPEND().
|
||||
#
|
||||
# CS_HEADER_PREPEND(TEXT)
|
||||
# Prepend text to the C header text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_PREPEND().
|
||||
#
|
||||
# CS_HEADER_PROPERTY(KEY, [VALUE])
|
||||
# Append a line of the form "#define KEY VALUE" to the C header text
|
||||
# cache. If the VALUE argument is omitted, then the appended line has
|
||||
# the simplified form "#define KEY".
|
||||
#
|
||||
# CS_HEADER_OUTPUT(FILENAME)
|
||||
# Instruct config.status to write the C header text cache to the given
|
||||
# filename. This is a cover for CS_TEXT_CACHE_OUTPUT().
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_HEADER_APPEND], [CS_TEXT_CACHE_APPEND([cs_header_text], [$1])])
|
||||
AC_DEFUN([CS_HEADER_PREPEND], [CS_TEXT_CACHE_PREPEND([cs_header_text], [$1])])
|
||||
AC_DEFUN([CS_HEADER_PROPERTY],
|
||||
[CS_HEADER_APPEND([@%:@define $1[]m4_ifval([$2], [ $2], [])
|
||||
])])
|
||||
AC_DEFUN([CS_HEADER_OUTPUT], [CS_TEXT_CACHE_OUTPUT([cs_header_text], [$1])])
|
||||
322
mk/autoconf/install-sh
Normal file
322
mk/autoconf/install-sh
Normal file
@@ -0,0 +1,322 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2004-07-05.00
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch. It can only install one file at a time, a restriction
|
||||
# shared with many OS's install programs.
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=
|
||||
chgrpcmd=
|
||||
stripcmd=
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dstarg=
|
||||
no_target_directory=
|
||||
|
||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
-c (ignored)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test -n "$1"; do
|
||||
case $1 in
|
||||
-c) shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--help) echo "$usage"; exit 0;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd=$stripprog
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t) dstarg=$2
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-T) no_target_directory=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit 0;;
|
||||
|
||||
*) # When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
test -n "$dir_arg$dstarg" && break
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dstarg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dstarg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dstarg=$arg
|
||||
done
|
||||
break;;
|
||||
esac
|
||||
done
|
||||
|
||||
if test -z "$1"; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call `install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names starting with `-'.
|
||||
case $src in
|
||||
-*) src=./$src ;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
src=
|
||||
|
||||
if test -d "$dst"; then
|
||||
mkdircmd=:
|
||||
chmodcmd=
|
||||
else
|
||||
mkdircmd=$mkdirprog
|
||||
fi
|
||||
else
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dstarg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
dst=$dstarg
|
||||
# Protect names starting with `-'.
|
||||
case $dst in
|
||||
-*) dst=./$dst ;;
|
||||
esac
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dstarg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst/`basename "$src"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# This sed command emulates the dirname command.
|
||||
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if test ! -d "$dstdir"; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-$defaultIFS}"
|
||||
|
||||
oIFS=$IFS
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS=$oIFS
|
||||
|
||||
pathcomp=
|
||||
|
||||
while test $# -ne 0 ; do
|
||||
pathcomp=$pathcomp$1
|
||||
shift
|
||||
if test ! -d "$pathcomp"; then
|
||||
$mkdirprog "$pathcomp"
|
||||
# mkdir can fail with a `File exist' error in case several
|
||||
# install-sh are creating the directory concurrently. This
|
||||
# is OK.
|
||||
test -d "$pathcomp" || exit
|
||||
fi
|
||||
pathcomp=$pathcomp/
|
||||
done
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
$doit $mkdircmd "$dst" \
|
||||
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
||||
|
||||
else
|
||||
dstfile=`basename "$dst"`
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
|
||||
trap '(exit $?); exit' 1 2 13 15
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
$doit $cpprog "$src" "$dsttmp" &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
||||
|| {
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
if test -f "$dstdir/$dstfile"; then
|
||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
||||
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
||||
|| {
|
||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
||||
(exit 1); exit
|
||||
}
|
||||
else
|
||||
:
|
||||
fi
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
||||
}
|
||||
}
|
||||
fi || { (exit 1); exit; }
|
||||
done
|
||||
|
||||
# The final little trick to "correctly" pass the exit status to the exit trap.
|
||||
{
|
||||
(exit 0); exit
|
||||
}
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-end: "$"
|
||||
# End:
|
||||
100
mk/autoconf/installdirs.m4
Normal file
100
mk/autoconf/installdirs.m4
Normal file
@@ -0,0 +1,100 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
# installdirs.m4 (c) Matze Braun <matze@braunis.de>
|
||||
# Macro for emitting the installation paths gathered by Autoconf.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# CS_OUTPUT_INSTALLDIRS([EMITTER], [RAW-BACKSLASHES])
|
||||
# Emit installation directories collected by Autoconf. EMITTER is a macro
|
||||
# name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs
|
||||
# the actual task of emitting the KEY/VALUE tuple. If EMITTER is omitted,
|
||||
# CS_JAMCONFIG_PROPERTY is used. If RAW-BACKSLASHES is not provided, then
|
||||
# backslashes in emitted values are each escaped with an additional
|
||||
# backslash. If RAW-BACKSLASHES is not the null value, then backslashes are
|
||||
# emitted raw. The following properties are emitted:
|
||||
#
|
||||
# prefix
|
||||
# exec_prefix
|
||||
# bindir
|
||||
# sbindir
|
||||
# libexecdir
|
||||
# datadir
|
||||
# sysconfdir
|
||||
# sharedstatedir
|
||||
# localstatedir
|
||||
# libdir
|
||||
# includedir
|
||||
# oldincludedir
|
||||
# infodir
|
||||
# mandir
|
||||
#-----------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_OUTPUT_INSTALLDIRS],[
|
||||
# Handle the case when no prefix is given, and the special case when a path
|
||||
# contains more than 2 slashes, these paths seem to be correct but Jam fails
|
||||
# on them.
|
||||
AS_IF([test $prefix = NONE],
|
||||
[cs_install_prefix="$ac_default_prefix"],
|
||||
[cs_install_prefix=`echo "$prefix" | sed -e 's:///*:/:g'`])
|
||||
AS_IF([test $exec_prefix = NONE],
|
||||
[cs_install_exec_prefix="AS_ESCAPE([$(prefix)])"],
|
||||
[cs_install_exec_prefix=`echo "$exec_prefix" | sed -e 's:///*:/:g'`])
|
||||
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [prefix],
|
||||
[CS_PREPARE_INSTALLPATH([$cs_install_prefix], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [exec_prefix],
|
||||
[CS_PREPARE_INSTALLPATH([$cs_install_exec_prefix], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [bindir],
|
||||
[CS_PREPARE_INSTALLPATH([$bindir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [sbindir],
|
||||
[CS_PREPARE_INSTALLPATH([$sbindir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [libexecdir],
|
||||
[CS_PREPARE_INSTALLPATH([$libexecdir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [datadir],
|
||||
[CS_PREPARE_INSTALLPATH([$datadir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [sysconfdir],
|
||||
[CS_PREPARE_INSTALLPATH([$sysconfdir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [sharedstatedir],
|
||||
[CS_PREPARE_INSTALLPATH([$sharedstatedir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [localstatedir],
|
||||
[CS_PREPARE_INSTALLPATH([$localstatedir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [libdir],
|
||||
[CS_PREPARE_INSTALLPATH([$libdir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [includedir],
|
||||
[CS_PREPARE_INSTALLPATH([$includedir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [oldincludedir],
|
||||
[CS_PREPARE_INSTALLPATH([$oldincludedir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [infodir],
|
||||
[CS_PREPARE_INSTALLPATH([$infodir], [$2])])
|
||||
_CS_OUTPUT_INSTALL_DIRS([$1], [mandir],
|
||||
[CS_PREPARE_INSTALLPATH([$mandir], [$2])])
|
||||
])
|
||||
|
||||
AC_DEFUN([_CS_OUTPUT_INSTALL_DIRS],
|
||||
[m4_default([$1], [CS_JAMCONFIG_PROPERTY])([$2], [$3])])
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# CS_PREPARE_INSTALLPATH(VALUE, [RAW-BACKSLASHES])
|
||||
# Transform variable references of the form ${bla} to $(bla) in VALUE and
|
||||
# correctly quotes backslashes. This is needed if you need to emit some of
|
||||
# the paths from Autoconf. RAW-BACKSLASHES has the same meaning as in
|
||||
# CS_OUTPUT_INSTALLDIRS.
|
||||
#-----------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PREPARE_INSTALLPATH],
|
||||
[`echo "$1" | sed 's/\${\([[a-zA-Z_][a-zA-Z_]]*\)}/$(\1)/g;m4_ifval([$2],
|
||||
[s/\\/\\\\/g], [s/\\\\/\\\\\\\\/g])'`])
|
||||
58
mk/autoconf/jamcache.m4
Normal file
58
mk/autoconf/jamcache.m4
Normal file
@@ -0,0 +1,58 @@
|
||||
# jamcache.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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])
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Text cache facility for Jam-style properties. The cache is stored in
|
||||
# the shell variable cs_jamfile_text.
|
||||
#
|
||||
# CS_JAMCONFIG_APPEND(TEXT)
|
||||
# Append text to the Jam text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_APPEND().
|
||||
#
|
||||
# CS_JAMCONFIG_PREPEND(TEXT)
|
||||
# Prepend text to the Jam text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_PREPEND().
|
||||
#
|
||||
# CS_JAMCONFIG_PROPERTY(KEY, VALUE, [APPEND], [UNCONDITIONAL])
|
||||
# Append a line of the form "KEY ?= VALUE" to the Jam text cache. If the
|
||||
# APPEND argument is not the empty string, then VALUE is appended to the
|
||||
# existing value of KEY using the form "KEY += VALUE". If the
|
||||
# UNCONDITIONAL argument is not empty, then the value of KEY is set
|
||||
# unconditionally "KEY = VALUE", rather than via "KEY ?= VALUE". APPEND
|
||||
# takes precedence over UNCONDITIONAL. Note that if VALUE references
|
||||
# other Jam variables, for example $(OBJS), then be sure to protect the
|
||||
# value with AS_ESCAPE(). For example:
|
||||
# CS_JAMCONFIG_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])])
|
||||
#
|
||||
# CS_JAMCONFIG_OUTPUT(FILENAME)
|
||||
# Instruct config.status to write the Jam text cache to the given
|
||||
# filename. This is a cover for CS_TEXT_CACHE_OUTPUT().
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_JAMCONFIG_APPEND],
|
||||
[CS_TEXT_CACHE_APPEND([cs_jamconfig_text], [$1])])
|
||||
AC_DEFUN([CS_JAMCONFIG_PREPEND],
|
||||
[CS_TEXT_CACHE_PREPEND([cs_jamconfig_text], [$1])])
|
||||
AC_DEFUN([CS_JAMCONFIG_PROPERTY],
|
||||
[CS_JAMCONFIG_APPEND(
|
||||
[$1 m4_ifval([$3], [+=], m4_ifval([$4], [=], [?=])) \"$2\" ;
|
||||
])])
|
||||
AC_DEFUN([CS_JAMCONFIG_OUTPUT],
|
||||
[CS_TEXT_CACHE_OUTPUT([cs_jamconfig_text], [$1])])
|
||||
53
mk/autoconf/makecache.m4
Normal file
53
mk/autoconf/makecache.m4
Normal file
@@ -0,0 +1,53 @@
|
||||
# makecache.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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])
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Text cache facility for makefile-style properties. The cache is stored in
|
||||
# the shell variable cs_makefile_text.
|
||||
#
|
||||
# CS_MAKEFILE_APPEND(TEXT)
|
||||
# Append text to the makefile text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_APPEND().
|
||||
#
|
||||
# CS_MAKEFILE_PREPEND(TEXT)
|
||||
# Prepend text to the makefile text cache. This is a cover for
|
||||
# CS_TEXT_CACHE_PREPEND().
|
||||
#
|
||||
# CS_MAKEFILE_PROPERTY(KEY, VALUE, [APPEND])
|
||||
# Append a line of the form "KEY = VALUE" to the makefile text cache. If
|
||||
# the APPEND argument is not the empty string, then VALUE is appended to
|
||||
# the existing value of KEY using the form "KEY += VALUE". Note that if
|
||||
# VALUE references other makefile variables, for example $(OBJS), then be
|
||||
# sure to protect the value with AS_ESCAPE(). For example:
|
||||
# CS_MAKEFILE_PROPERTY([ALLOBJS], [AS_ESCAPE([$(OBJS) $(LIBOBJS)])])
|
||||
#
|
||||
# CS_MAKEFILE_OUTPUT(FILENAME)
|
||||
# Instruct config.status to write the makefile text cache to the given
|
||||
# filename. This is a cover for CS_TEXT_CACHE_OUTPUT().
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_MAKEFILE_APPEND],
|
||||
[CS_TEXT_CACHE_APPEND([cs_makefile_text], [$1])])
|
||||
AC_DEFUN([CS_MAKEFILE_PREPEND],
|
||||
[CS_TEXT_CACHE_PREPEND([cs_makefile_text], [$1])])
|
||||
AC_DEFUN([CS_MAKEFILE_PROPERTY],
|
||||
[CS_MAKEFILE_APPEND([$1 m4_ifval([$3], [+=], [=]) $2
|
||||
])])
|
||||
AC_DEFUN([CS_MAKEFILE_OUTPUT],[CS_TEXT_CACHE_OUTPUT([cs_makefile_text], [$1])])
|
||||
93
mk/autoconf/mkdir.m4
Normal file
93
mk/autoconf/mkdir.m4
Normal file
@@ -0,0 +1,93 @@
|
||||
# mkdir.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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_CHECK_MKDIR
|
||||
# Determine how to create a directory and a directory tree. Sets the
|
||||
# shell variable MKDIR to the command which creates a directory, and
|
||||
# MKDIRS to the command which creates a directory tree. Invokes
|
||||
# AC_SUBST() for MKDIR and MKDIRS.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
# We need to know the exact commands, so that we can emit them, thus the
|
||||
# AS_MKDIR_P function is not what we want to use here since it does not
|
||||
# provide access to the commands (and might not even discover suitable
|
||||
# commands). First try "mkdir -p", then try the older "mkdirs".
|
||||
# Finally, if the mkdir command failed to recognize -p, then it might
|
||||
# have created a directory named "-p", so clean up that bogus directory.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_CHECK_MKDIR],
|
||||
[AC_CACHE_CHECK([how to create a directory], [cs_cv_shell_mkdir],
|
||||
[cs_cv_shell_mkdir='mkdir'])
|
||||
AC_SUBST([MKDIR], [$cs_cv_shell_mkdir])
|
||||
|
||||
AC_CACHE_CHECK([how to create a directory tree], [cs_cv_shell_mkdir_p],
|
||||
[if $cs_cv_shell_mkdir -p . 2>/dev/null; then
|
||||
cs_cv_shell_mkdir_p='mkdir -p'
|
||||
elif mkdirs . 2>/dev/null; then
|
||||
cs_cv_shell_mkdir_p='mkdirs'
|
||||
fi
|
||||
test -d ./-p && rmdir ./-p])
|
||||
AS_VAR_SET_IF([cs_cv_shell_mkdir_p],
|
||||
[AC_SUBST([MKDIRS], [$cs_cv_shell_mkdir_p])],
|
||||
[CS_MSG_ERROR([do not know how to create a directory tree])])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Replacement for AS_MKDIR_P() from m4sugar/m4sh.m4 which fixes two problems
|
||||
# which are present in Autoconf 2.57 and probably all earlier 2.5x versions.
|
||||
# This bug, along with a patch, was submitted to the Autoconf GNATS database by
|
||||
# Eric Sunshine as #227 on 17-Dec-2002. The bogus "-p" directory bug was fixed
|
||||
# for Autoconf 2.58 on 26-Sep-2003. The "mkdirs" optimization was not accepted
|
||||
# (since it is unnecessary; it's only an optimization).
|
||||
#
|
||||
# 1) Removes bogus "-p" directory which the stock AS_MKDIR_P() leaves laying
|
||||
# around in the working directory if the mkdir command does not recognize
|
||||
# the -p option.
|
||||
# 2) Takes advantage of the older "mkdirs" program if it exists and if "mkdir
|
||||
# -p" does not work.
|
||||
#------------------------------------------------------------------------------
|
||||
m4_defun([_AS_MKDIR_P_PREPARE],
|
||||
[if mkdir -p . 2>/dev/null; then
|
||||
as_mkdir_p='mkdir -p'
|
||||
elif mkdirs . 2>/dev/null; then
|
||||
as_mkdir_p='mkdirs'
|
||||
else
|
||||
as_mkdir_p=''
|
||||
fi
|
||||
test -d ./-p && rmdir ./-p
|
||||
])# _AS_MKDIR_P_PREPARE
|
||||
|
||||
m4_define([AS_MKDIR_P],
|
||||
[AS_REQUIRE([_$0_PREPARE])dnl
|
||||
{ if test -n "$as_mkdir_p"; then
|
||||
$as_mkdir_p $1
|
||||
else
|
||||
as_dir=$1
|
||||
as_dirs=
|
||||
while test ! -d "$as_dir"; do
|
||||
as_dirs="$as_dir $as_dirs"
|
||||
as_dir=`AS_DIRNAME("$as_dir")`
|
||||
done
|
||||
test ! -n "$as_dirs" || mkdir $as_dirs
|
||||
fi || AS_ERROR([cannot create directory $1]); }
|
||||
])# AS_MKDIR_P
|
||||
68
mk/autoconf/packageinfo.m4
Normal file
68
mk/autoconf/packageinfo.m4
Normal file
@@ -0,0 +1,68 @@
|
||||
#==============================================================================
|
||||
# packageinfo.m4
|
||||
# Macros for setting general info on the package, such as name and version
|
||||
# numbers and propagate them to the generated make and Jam property files.
|
||||
#
|
||||
# Copyright (C)2003 by Matthias Braun <matze@braunis.de>
|
||||
# Copyright (C)2003,2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_PACKAGEINFO([LONGNAME], [COPYRIGHT, [HOMEPAGE])
|
||||
# Set additional information for the package. Note that the version
|
||||
# number of your application should only contain numbers, because on
|
||||
# Windows you can only set numerical values in some of the file
|
||||
# properties (such as versioninfo .rc files).
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PACKAGEINFO],
|
||||
[PACKAGE_LONGNAME="[$1]"
|
||||
PACKAGE_COPYRIGHT="[$2]"
|
||||
PACKAGE_HOMEPAGE="[$3]"
|
||||
])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_EMIT_PACKAGEINFO([EMITTER])
|
||||
# Emit extended package information using the provided EMITTER. EMITTER
|
||||
# is a macro name, such as CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY,
|
||||
# which performs the actual task of emitting the KEY/VALUE tuple. If
|
||||
# EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. For backward
|
||||
# compatibility, if EMITTER is the literal value "jam", then
|
||||
# CS_JAMCONFIG_PROPERTY is used; if it is "make", then
|
||||
# CS_MAKEFILE_PROPERTY is used; however use of these literal names is
|
||||
# highly discouraged.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_EMIT_PACKAGEINFO],
|
||||
[_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_NAME], [$PACKAGE_NAME])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION], [$PACKAGE_VERSION])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_STRING], [$PACKAGE_STRING])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_BUGREPORT], [$PACKAGE_BUGREPORT])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_LONGNAME], [$PACKAGE_LONGNAME])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_HOMEPAGE], [$PACKAGE_HOMEPAGE])
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_COPYRIGHT], [$PACKAGE_COPYRIGHT])
|
||||
for cs_veritem in m4_translit(AC_PACKAGE_VERSION, [.], [ ]); do
|
||||
_CS_EMIT_PACKAGEINFO([$1], [PACKAGE_VERSION_LIST], [$cs_veritem], [+])
|
||||
done
|
||||
])
|
||||
|
||||
AC_DEFUN([_CS_EMIT_PACKAGEINFO],
|
||||
[m4_case([$1],
|
||||
[make], [CS_MAKEFILE_PROPERTY([$2], [$3], [$4])],
|
||||
[jam], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])],
|
||||
[], [CS_JAMCONFIG_PROPERTY([$2], [$3], [$4])],
|
||||
[$1([$2], [$3], [$4])])])
|
||||
37
mk/autoconf/path.m4
Normal file
37
mk/autoconf/path.m4
Normal file
@@ -0,0 +1,37 @@
|
||||
# path.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2004 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_PATH_NORMALIZE(STRING)
|
||||
# Normalize a pathname at run-time by transliterating Windows/DOS
|
||||
# backslashes to forward slashes. Also collapses whitespace.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_PATH_NORMALIZE],
|
||||
[`echo "x$1" | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`])
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_RUN_PATH_NORMALIZE(COMMAND)
|
||||
# Normalize the pathname emitted by COMMAND by transliterating
|
||||
# Windows/DOS backslashes to forward slashes. Also collapses whitespace.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_RUN_PATH_NORMALIZE],
|
||||
[`AC_RUN_LOG([$1]) | tr '\\\\' '/' | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`])
|
||||
207
mk/autoconf/progver.m4
Normal file
207
mk/autoconf/progver.m4
Normal file
@@ -0,0 +1,207 @@
|
||||
###############################################################################
|
||||
# progver.m4
|
||||
# Written by Norman Kramer <norman@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
###############################################################################
|
||||
#
|
||||
# From the input pattern we create regular expressions we send through sed
|
||||
# to extract the version information from the standard input to sed.
|
||||
# Then we extract from the resulting version string subparts.
|
||||
# The same happens with the supplied version string. It too is split into its
|
||||
# subparts according to the pattern.
|
||||
# Then the subparts from the gathered version string and the supplied one are
|
||||
# compared.
|
||||
#
|
||||
# How does the pattern look like ?
|
||||
# It is a sequence of 9s and _s and separators.
|
||||
# 9 denotes a non empty sequence of digits.
|
||||
# _ denotes a non empty sequence of characters from the class [a-zA-Z].
|
||||
# | everything behind is optional
|
||||
# Everything else is treated as a separator.
|
||||
# Consecutive 9s and _s are compressed to contain only one of each type.
|
||||
# For instance "99_.9.__abc9_" will become "9_.9._abc9_".
|
||||
#
|
||||
# How we find the parts we compare ?
|
||||
# From this transformed string we yield the parts we will later compare.
|
||||
# We break up the string as follows:
|
||||
# Any sequence of separators represent one breakup. Additional breakups are
|
||||
# placed behind every 9 and _ .
|
||||
# So the example from above will give:
|
||||
#
|
||||
# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===breakup==> "9" "_" "9" "_" "9" "_"
|
||||
#
|
||||
# How we create the regular expressions ?
|
||||
# We take the compressed pattern and quote every separator.
|
||||
# The we replace the 9s with [0-9][0-9]*
|
||||
# and the _s with [a-zA-Z][a-zA-Z]* .
|
||||
# The above example will become:
|
||||
#
|
||||
# "99_.9.__abc9_" ===compress==> "9_.9._abc9_" ===rexify==>
|
||||
# [0-9][0-9]*[a-zA-Z][a-zA-Z]*\.[0-9][0-9]*\.[a-zA-Z][a-zA-Z]*\a\b\c[0-9][0-9]*[a-zA-Z][a-zA-Z]*
|
||||
#
|
||||
# Voila.
|
||||
#
|
||||
# To yield the subparts from the string we additionally enclose the
|
||||
# 9s and _s with \( and \).
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# ****************************************************************
|
||||
# ** helper definitions **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_RUNTH], [m4_pushdef([i], [$1])m4_if($1,0,,[CS_VCHK_RUNTH(m4_decr($1), [$2])][$2])m4_popdef([i])])
|
||||
m4_define([CS_VCHK_PREFIX], [])
|
||||
m4_define([CS_VCHK_SUFFIX], [])
|
||||
m4_define([CS_VCHK_GROUPPREFIX], [\(])
|
||||
m4_define([CS_VCHK_GROUPSUFFIX], [\)])
|
||||
m4_define([CS_VCHK_CHAR], [[[[a-zA-Z]]]])
|
||||
m4_define([CS_VCHK_DIGIT], [[[0-9]]])
|
||||
m4_define([CS_VCHK_SEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]])
|
||||
m4_define([CS_VCHK_OPTSEQUENCE], [CS_VCHK_PREFIX[]CS_VCHK_SINGLE[]*CS_VCHK_SUFFIX[]])
|
||||
m4_define([CS_VCHK_REXSEQ], [m4_bpatsubst($1, [$2], [[]CS_VCHK_SEQUENCE[]])])
|
||||
m4_define([CS_VCHK_GROUPINGON], [m4_pushdef([CS_VCHK_PREFIX], [CS_VCHK_GROUPPREFIX])m4_pushdef([CS_VCHK_SUFFIX], [CS_VCHK_GROUPSUFFIX])])
|
||||
m4_define([CS_VCHK_GROUPINGOFF], [m4_popdef([CS_VCHK_SUFFIX])m4_popdef([CS_VCHK_PREFIX])])
|
||||
m4_define([CS_VCHK_OPTON], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_OPTSEQUENCE])])
|
||||
m4_define([CS_VCHK_OPTOFF], [m4_popdef([CS_VCHK_SEQUENCE])])
|
||||
m4_define([CS_VCHK_RMOPT], [CS_VCHK_RMCHAR([$1], m4_index([$1], [|]))])
|
||||
m4_define([CS_VCHK_RMCHAR], [m4_if($2,-1,[$1],m4_substr([$1], 0, $2)[]m4_substr([$1], m4_incr($2)))])
|
||||
m4_define([CS_VCHK_RMALL], [m4_translit([$1], [|], [])])
|
||||
m4_define([CS_VCHK_CUTOFF], [m4_if(m4_index($1,[|]),-1, [$1], [m4_substr($1, 0, m4_index($1,[|]))])])
|
||||
m4_define([CS_VCHK_CYCLEOPT], [
|
||||
m4_if($2,-1,, [m4_pushdef([i], CS_VCHK_CUTOFF([$1])) m4_pushdef([j], CS_VCHK_DUMMY_TAIL([$1])) CS_VCHK_CYCLEOPT( CS_VCHK_RMOPT([$1]), m4_index($1, [|]), [$3])$3 m4_popdef([i]) m4_popdef([j])])
|
||||
])
|
||||
m4_define([CS_VCHK_TAIL], [m4_if(m4_index($1,[|]),-1, [], [m4_substr($1, m4_incr(m4_index($1,[|])))])])
|
||||
m4_define([CS_VCHK_DUMMY_COMPRESS], [m4_bpatsubst(m4_bpatsubst([$1], [__*], [A]), [99*], [0])])
|
||||
m4_define([CS_VCHK_DUMMY_TAIL], [CS_VCHK_DUMMY_COMPRESS(m4_translit(CS_VCHK_TAIL([$1]), [|], []))])
|
||||
|
||||
# ****************************************************************
|
||||
# ** FlagsOn / FlagsOff **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_FLAGSON],
|
||||
[m4_if($#, 0, [],
|
||||
$1, [], [],
|
||||
[$1], [group], [CS_VCHK_GROUPINGON[]],
|
||||
[$1], [opt], [CS_VCHK_OPTON[]])dnl
|
||||
m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSON(m4_shift($@))])])
|
||||
|
||||
m4_define([CS_VCHK_FLAGSOFF],
|
||||
[m4_if($#, 0, [],
|
||||
$1, [], [],
|
||||
$1, [group], [CS_VCHK_GROUPINGOFF[]],
|
||||
[$1], [opt], [CS_VCHK_OPTOFF[]])dnl
|
||||
m4_if($#, 0, [], $1, [], [], [CS_VCHK_FLAGSOFF(m4_shift($@))])])
|
||||
|
||||
# ****************************************************************
|
||||
# ** rexify / sedify **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_REXIFY],
|
||||
[m4_pushdef([CS_VCHK_SINGLE], [$1])dnl
|
||||
CS_VCHK_FLAGSON(m4_shift(m4_shift(m4_shift($@))))dnl
|
||||
CS_VCHK_REXSEQ([$3], [$2])dnl
|
||||
CS_VCHK_FLAGSOFF(m4_shift(m4_shift(m4_shift($@))))dnl
|
||||
m4_popdef([CS_VCHK_SINGLE])])
|
||||
|
||||
m4_define([CS_VCHK_QUOTESEP], [m4_bpatsubst($1, [[^9_]], [\\\&])])
|
||||
|
||||
m4_define([CS_VCHK_REXCHAR], [CS_VCHK_REXIFY([CS_VCHK_CHAR], [__*], $@)])
|
||||
m4_define([CS_VCHK_REXDIGIT], [CS_VCHK_REXIFY([CS_VCHK_DIGIT], [99*], $@)])
|
||||
m4_define([CS_VCHK_SEDIFY], [CS_VCHK_REXDIGIT([CS_VCHK_REXCHAR([CS_VCHK_QUOTESEP([$1])], m4_shift($@))], m4_shift($@))])
|
||||
m4_define([CS_VCHK_SEDEXPRALL], [/CS_VCHK_SEDIFY([$1])/!d;s/.*\(CS_VCHK_SEDIFY([$1])\).*/\1/;q])
|
||||
m4_define([CS_VCHK_SEDEXPRNTH], [/CS_VCHK_SEDIFY([$1])/!d;s/.*CS_VCHK_SEDIFY([$1],[group]).*/\$2/])
|
||||
|
||||
# ****************************************************************
|
||||
# ** Pattern splitting **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_SPLITSEP], [CS_VCHK_REXIFY([s], [[^9_][^9_]*], $@)])
|
||||
m4_define([CS_VCHK_SPLITDIGIT], [CS_VCHK_REXIFY([d], [99*], $@)])
|
||||
m4_define([CS_VCHK_SPLITCHAR], [CS_VCHK_REXIFY([c], [__*], $@)])
|
||||
|
||||
# ****************************************************************
|
||||
# ** return a list of 's' 'd' 'c' 'e' chars denoting the kind **
|
||||
# ** pattern parts: separator, digit, char, end **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_PATTERNLIST], [m4_pushdef([CS_VCHK_SEQUENCE], [CS_VCHK_SINGLE ])dnl
|
||||
m4_translit(CS_VCHK_SPLITDIGIT([CS_VCHK_SPLITCHAR([CS_VCHK_SPLITSEP([$1])])]), [ ], m4_if([$2],[],[ ],[$2]))e[]dnl
|
||||
m4_popdef([CS_VCHK_SEQUENCE])])
|
||||
|
||||
# ****************************************************************
|
||||
# ** Build the shell commands we emit to the configure script. **
|
||||
# ****************************************************************
|
||||
m4_define([CS_VCHK_PATCOUNT], [m4_len(m4_bpatsubst(CS_VCHK_PATTERNLIST([$1]), [[^dc]]))])
|
||||
|
||||
# ****************************************************************************************
|
||||
# ** CS_VCHK_EXTRACTVERSION(EXTRACT_CALL, MIN_VERSION, PATTERN, PRGPREFIX, COMPARISION) **
|
||||
# ****************************************************************************************
|
||||
m4_define([CS_VCHK_EXTRACTVERSION],
|
||||
[cs_prog_$4_is_version=
|
||||
cs_prog_$4_min_version=
|
||||
cs_prog_$4_is_suffix=
|
||||
cs_prog_$4_min_suffix=
|
||||
cs_prog_$4_is_suffix_done=
|
||||
cs_prog_$4_min_suffix_done=
|
||||
CS_VCHK_CYCLEOPT([$3], [],
|
||||
[test -z $cs_prog_$4_is_version && cs_prog_$4_is_version=`$1 | sed 'CS_VCHK_SEDEXPRALL([i])'`
|
||||
test -n "$cs_prog_$4_is_version" && test -z $cs_prog_$4_is_suffix_done && { cs_prog_$4_is_suffix_done=yes ; cs_prog_$4_is_suffix=j ; }
|
||||
])
|
||||
CS_VCHK_CYCLEOPT([$3], ,
|
||||
[test -z $cs_prog_$4_min_version && cs_prog_$4_min_version=`echo $2 | sed 'CS_VCHK_SEDEXPRALL([i])'`
|
||||
test -n "$cs_prog_$4_min_version" && test -z $cs_prog_$4_min_suffix_done && { cs_prog_$4_min_suffix_done=yes ; cs_prog_$4_min_suffix=j ; }
|
||||
])
|
||||
CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])],
|
||||
[cs_prog_$4_is_ver_[]i=`echo ${cs_prog_$4_is_version}${cs_prog_$4_is_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'`
|
||||
])
|
||||
CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])],
|
||||
[cs_prog_$4_min_ver_[]i=`echo $cs_prog_$4_min_version${cs_prog_$4_min_suffix} | sed 'CS_VCHK_SEDEXPRNTH([CS_VCHK_RMALL([$3])], [i])'`
|
||||
])
|
||||
cs_cv_prog_$4_version_ok=''
|
||||
CS_VCHK_RUNTH([CS_VCHK_PATCOUNT([$3])],
|
||||
[test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_is_ver_[]i" "$5" "$cs_prog_$4_min_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=no ; }
|
||||
test -z "$cs_cv_prog_$4_version_ok" && { expr "$cs_prog_$4_min_ver_[]i" "$5" "$cs_prog_$4_is_ver_[]i" >/dev/null || cs_cv_prog_$4_version_ok=yes ; }
|
||||
])
|
||||
AS_IF([test -z "$cs_cv_prog_$4_version_ok"], [cs_cv_prog_$4_version_ok=yes])
|
||||
cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok"
|
||||
AS_IF([test -n "$cs_prog_$4_is_version"],
|
||||
[cs_cv_prog_$4_version_ok_annotated="$cs_cv_prog_$4_version_ok_annotated (version $cs_prog_$4_is_version)"])
|
||||
])
|
||||
|
||||
##############################################################################
|
||||
# CS_CHECK_PROG_VERSION(PROG, EXTRACT_CALL, VERSION, PATTERN,
|
||||
# [ACTION-IF-OKAY], [ACTION-IF-NOT-OKAY], [CMP])
|
||||
# Check the version of a program PROG.
|
||||
# Version information is emitted by EXTRACT_CALL (for instance "bison -V").
|
||||
# The discovered program version is compared against VERSION.
|
||||
# The pattern of the version string matches PATTERN
|
||||
# The extracted version and the supplied version are compared with the CMP
|
||||
# operator. i.e. EXTRACTED_VERSION CMP SUPPLIED_VERSION
|
||||
# CMP defaults to >= if not specified.
|
||||
# ACTION-IF-OKAY is invoked if comparision yields true, otherwise
|
||||
# ACTION-IF-NOT-OKAY is invoked.
|
||||
#
|
||||
# PATTERN literals: 9 .. marks a non empty sequence of digits
|
||||
# _ .. marks a non empty sequence of characters from [a-zA-Z]
|
||||
# | .. everything behind is optional
|
||||
# .. everything else is taken as separator - it is better
|
||||
# to not try stuff like space, slash or comma.
|
||||
#
|
||||
# The test results in cs_cv_prog_PROG_version_ok being either yes or no.
|
||||
##############################################################################
|
||||
AC_DEFUN([CS_CHECK_PROG_VERSION],
|
||||
[AC_CACHE_CHECK([if $1 version m4_default([$7],[>=]) $3],
|
||||
[AS_TR_SH([cs_cv_prog_$1_version_ok_annotated])],
|
||||
[CS_VCHK_EXTRACTVERSION([$2], [$3], [$4], AS_TR_SH([$1]),
|
||||
m4_default([$7],[>=]))])
|
||||
AS_IF([test "$AS_TR_SH([cs_cv_prog_$1_version_ok])" = yes], [$5], [$6])])
|
||||
46
mk/autoconf/qualify.m4
Normal file
46
mk/autoconf/qualify.m4
Normal file
@@ -0,0 +1,46 @@
|
||||
# qualify.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)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_SYMBOL_QUALIFIER(MESSAGE, CACHE-VAR, QUALIFIERS, [SYMBOL], [LANG],
|
||||
# [ACTION-IF-ACCEPTED], [ACTION-IF-NOT-ACCEPTED])
|
||||
# Test if a symbol can be qualified by one of the elements of the
|
||||
# comma-separated list of QUALIFIERS. Examples of qualifiers include
|
||||
# __attribute__((deprecated)), __declspec(dllimport), etc. MESSAGE is the
|
||||
# "checking" message. CACHE-VAR is the variable which receives the
|
||||
# qualifier which succeeded, or the the literal "no" if none were
|
||||
# accepted. SYMBOL is the symbol to which the qualifier should be
|
||||
# applied. If omitted, then SYMBOL defaults to "void f();". LANG is the
|
||||
# language of the test, typically "C" or "C++". It defaults to "C" if
|
||||
# omitted. ACTION-IF-ACCEPTED is invoked after CACHE-VAR is set if one of
|
||||
# the qualifiers is accepted, else ACTION-IF-NOT-ACCEPTED is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_SYMBOL_QUALIFIER],
|
||||
[AC_CACHE_CHECK([$1], [$2],
|
||||
[$2='no'
|
||||
m4_foreach([cs_symbol_qualifier], [$3],
|
||||
[AS_IF([test "$$2" = no],
|
||||
[CS_BUILD_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[cs_symbol_qualifier m4_default([$4],[void f()]);],
|
||||
[])],
|
||||
[], [$5], [$2='cs_symbol_qualifier'], [$2='no'])])])])
|
||||
AS_IF([test $$2 != no], [$6], [$7])])
|
||||
49
mk/autoconf/split.m4
Normal file
49
mk/autoconf/split.m4
Normal file
@@ -0,0 +1,49 @@
|
||||
# split.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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_SPLIT(LINE, [OUTPUT-VARIABLES], [DELIMITER], [FILLER])
|
||||
# Split LINE into individual tokens. Tokens are delimited by DELIMITER,
|
||||
# which is the space character if omitted. OUTPUT-VARIABLES is a
|
||||
# comma-delimited list of shell variables which should receive the
|
||||
# extracted tokens. If there are too few tokens to fill the output
|
||||
# variables, then the excess variables will be assigned the empty string.
|
||||
# If there are too few output variables, then the excess tokens will be
|
||||
# ignored. If OUTPUT-VARIABLES is omitted, then the split tokens will be
|
||||
# assigned to the shell meta-variables $1, $2, $3, etc. When
|
||||
# OUTPUT-VARIABLES is omitted, FILLER is assigned to meta-variables in
|
||||
# cases where DELIMITER delimits a zero-length token. FILLER defaults
|
||||
# to "filler". For example, if DELIMITER is "+" and OUTPUT-VARIABLES is
|
||||
# omitted, given the line "one++three", $1 will be "one", $2 will be
|
||||
# "filler", and $3 will be "three".
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_SPLIT],
|
||||
[m4_define([cs_split_filler], m4_default([$4],[filler]))
|
||||
set cs_split_filler `echo "$1" | awk 'BEGIN { FS="m4_default([$3],[ ])" }
|
||||
{ for (i=1; i <= NF; ++i)
|
||||
{ if ($i == "") print "cs_split_filler"; else print $i } }'`
|
||||
shift
|
||||
m4_map([_CS_SPLIT], [$2])])
|
||||
|
||||
AC_DEFUN([_CS_SPLIT],
|
||||
[AS_IF([test $[@%:@] -eq 0], [$1=''],
|
||||
[AS_IF([test "$[1]" = cs_split_filler], [$1=''], [$1=$[1]])
|
||||
shift])])
|
||||
78
mk/autoconf/textcache.m4
Normal file
78
mk/autoconf/textcache.m4
Normal file
@@ -0,0 +1,78 @@
|
||||
# textcache.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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])
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Text cache facility. These macros provide a way to incrementally store
|
||||
# arbitrary text in a shell variable, and to write the saved text to a file.
|
||||
#
|
||||
# CS_TEXT_CACHE_APPEND(VARIABLE, TEXT)
|
||||
# Append text to the contents of the named shell variable. If the text
|
||||
# contains references to shell variables (such as $foo), then those
|
||||
# references will be expanded. If expansion is not desired, then protect
|
||||
# the text with AS_ESCAPE().
|
||||
#
|
||||
# CS_TEXT_CACHE_PREPEND(VARIABLE, TEXT)
|
||||
# Prepend text to the contents of the named shell variable. If the text
|
||||
# contains references to shell variables (such as $foo), then those
|
||||
# references will be expanded. If expansion is not desired, then protect
|
||||
# the text with AS_ESCAPE().
|
||||
#
|
||||
# CS_TEXT_CACHE_OUTPUT(VARIABLE, FILENAME)
|
||||
# Instruct config.status to write the contents of the named shell
|
||||
# variable to the given filename. If the file resides in a directory,
|
||||
# the directory will be created, if necessary. If the output file
|
||||
# already exists, and if the cached text is identical to the contents of
|
||||
# the existing file, then the existing file is left alone, thus its time
|
||||
# stamp remains unmolested. This heuristic may help to minimize rebuilds
|
||||
# when the file is listed as a dependency in a makefile.
|
||||
#
|
||||
# *NOTE*
|
||||
# There is a bug in Autoconf 2.57 and probably all earlier 2.5x versions
|
||||
# which results in errors if AC_CONFIG_COMMANDS is invoked for a `tag'
|
||||
# which represents a file in a directory which does not yet exist.
|
||||
# Unfortunately, even invoking AS_MKDIR_P in the `cmd' portion of
|
||||
# AC_CONFIG_COMMANDS does not solve the problem because the generated
|
||||
# configure script attempts to access information about the directory
|
||||
# before AS_MKDIR_P has a chance to create it. This forces us to invoke
|
||||
# AS_MKDIR_P in the third argument to AC_CONFIG_COMMANDS (the
|
||||
# `init-cmds') rather than the second (the `cmds'). This is undesirable
|
||||
# because it means that the directory will be created anytime
|
||||
# config.status is invoked (even for a simple --help), rather than being
|
||||
# created only when requested to output the text cache. This bug was
|
||||
# submitted to the Autoconf GNATS database by Eric Sunshine as #228 on
|
||||
# 27-Dec-2002. It was fixed for Autoconf 2.58 on 26-Sep-2003. The
|
||||
# official fix makes the assumption that `tag' always represents a file
|
||||
# (as opposed to some generic target), and creates the file's directory
|
||||
# is not present.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_TEXT_CACHE_APPEND], [$1="${$1}$2"])
|
||||
AC_DEFUN([CS_TEXT_CACHE_PREPEND], [$1="$2${$1}"])
|
||||
AC_DEFUN([CS_TEXT_CACHE_OUTPUT],
|
||||
[AC_CONFIG_COMMANDS([$2],
|
||||
[echo $ECHO_N "$$1$ECHO_C" > $tmp/tcache
|
||||
AS_IF([diff $2 $tmp/tcache >/dev/null 2>&1],
|
||||
[AC_MSG_NOTICE([$2 is unchanged])],
|
||||
[rm -f $2
|
||||
cp $tmp/tcache $2])
|
||||
rm -f $tmp/tcache],
|
||||
[$1='$$1'
|
||||
cs_dir=`AS_DIRNAME([$2])`
|
||||
AS_ESCAPE(AS_MKDIR_P([$cs_dir]), [$`\])])])
|
||||
27
mk/autoconf/trim.m4
Normal file
27
mk/autoconf/trim.m4
Normal file
@@ -0,0 +1,27 @@
|
||||
# trim.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)2003 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_TRIM(STRING)
|
||||
# Strip leading and trailing spaces from STRING and collapse internal
|
||||
# runs of multiple spaces to a single space.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_TRIM], [`echo x$1 | sed 's/^x//;s/ */ /g;s/^ //;s/ $//'`])
|
||||
151
mk/autoconf/warnings.m4
Normal file
151
mk/autoconf/warnings.m4
Normal file
@@ -0,0 +1,151 @@
|
||||
# warnings.m4 -*- Autoconf -*-
|
||||
#==============================================================================
|
||||
# Copyright (C)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_COMPILER_WARNINGS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to enable compilation warnings. If LANGUAGE is not provided,
|
||||
# then `C' is assumed (other options include `C++'). If CACHE-VAR is not
|
||||
# provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_enable_warnings". If an option for enabling
|
||||
# warnings (such as `-Wall') is discovered, then it is assigned to
|
||||
# CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string is
|
||||
# assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
#
|
||||
# On some platforms, it is more appropriate to use -Wmost rather than
|
||||
# -Wall even if the compiler understands both, thus we attempt -Wmost
|
||||
# before -Wall.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_WARNINGS],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to enable m4_default([$1],[C]) compilation warnings],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_enable_warnings])],
|
||||
[CS_CREATE_TUPLE([-Wmost]) CS_CREATE_TUPLE([-Wall])],
|
||||
[$1], [$3], [$4])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_COMPILER_ERRORS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to promote compilation diganostics from warning to error
|
||||
# status. If LANGUAGE is not provided, then `C' is assumed (other options
|
||||
# include `C++'). If CACHE-VAR is not provided, then it defaults to the
|
||||
# name "cs_cv_prog_compiler_enable_errors". If an option for performing
|
||||
# this promotion (such as `-Werror') is discovered, then it is assigned
|
||||
# to CACHE-VAR and ACTION-IF-FOUND is invoked; otherwise the empty string
|
||||
# is assigned to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_ERRORS],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to treat m4_default([$1],[C]) warnings as errors],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_enable_errors])],
|
||||
[CS_CREATE_TUPLE([-Werror])], [$1], [$3], [$4])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_COMPILER_IGNORE_UNUSED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to instruct compiler to ignore unused variables and
|
||||
# arguments. This option may be useful for code generated by tools, such
|
||||
# as Swig, Bison, and Flex, over which the client has no control, yet
|
||||
# wishes to compile without excessive diagnostic spew. If LANGUAGE is
|
||||
# not provided, then `C' is assumed (other options include `C++'). If
|
||||
# CACHE-VAR is not provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_ignore_unused". If an option (such as
|
||||
# `-Wno-unused') is discovered, then it is assigned to CACHE-VAR and
|
||||
# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to
|
||||
# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_IGNORE_UNUSED],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to suppress m4_default([$1],[C]) unused variable warnings],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_ignore_unused])],
|
||||
[CS_CREATE_TUPLE([-Wno-unused])], [$1], [$3], [$4])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_COMPILER_IGNORE_UNINITIALIZED([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to instruct compiler to ignore uninitialized variables. This
|
||||
# option may be useful for code generated by tools, such as Swig, Bison,
|
||||
# and Flex, over which the client has no control, yet wishes to compile
|
||||
# without excessive diagnostic spew. If LANGUAGE is not provided, then
|
||||
# `C' is assumed (other options include `C++'). If CACHE-VAR is not
|
||||
# provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_ignore_uninitialized". If an option (such as
|
||||
# `-Wno-uninitialized') is discovered, then it is assigned to CACHE-VAR
|
||||
# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned
|
||||
# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_IGNORE_UNINITIALIZED],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to suppress m4_default([$1],[C]) uninitialized warnings],
|
||||
[m4_default([$2],
|
||||
[cs_cv_prog_compiler_ignore_uninitialized_variables])],
|
||||
[CS_CREATE_TUPLE([-Wno-uninitialized])], [$1], [$3], [$4])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_COMPILER_IGNORE_PRAGMAS([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to instruct compiler to ignore unrecognized #pragma
|
||||
# directives. This option may be useful for code which contains
|
||||
# unprotected #pragmas which are not understood by all compilers. If
|
||||
# LANGUAGE is not provided, then `C' is assumed (other options include
|
||||
# `C++'). If CACHE-VAR is not provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_ignore_unknown_pragmas". If an option (such as
|
||||
# `-Wno-unknown-pragmas') is discovered, then it is assigned to CACHE-VAR
|
||||
# and ACTION-IF-FOUND is invoked; otherwise the empty string is assigned
|
||||
# to CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_IGNORE_PRAGMAS],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to suppress m4_default([$1],[C]) unknown [#pragma] warnings],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_ignore_unknown_pragmas])],
|
||||
[CS_CREATE_TUPLE([-Wno-unknown-pragmas])], [$1], [$3], [$4])])
|
||||
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# CS_COMPILER_IGNORE_LONG_DOUBLE([LANGUAGE], [CACHE-VAR], [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
# Check how to instruct compiler to suppress warnings about `long double'
|
||||
# usage. This option may be useful for code generated by tools, such as
|
||||
# Swig, Bison, and Flex, over which the client has no control, yet wishes
|
||||
# to compile without excessive diagnostic spew. If LANGUAGE is not
|
||||
# provided, then `C' is assumed (other options include `C++'). If
|
||||
# CACHE-VAR is not provided, then it defaults to the name
|
||||
# "cs_cv_prog_compiler_ignore_long_double". If an option (such as
|
||||
# `-Wno-long-double') is discovered, then it is assigned to CACHE-VAR and
|
||||
# ACTION-IF-FOUND is invoked; otherwise the empty string is assigned to
|
||||
# CACHE-VAR and ACTION-IF-NOT-FOUND is invoked.
|
||||
#------------------------------------------------------------------------------
|
||||
AC_DEFUN([CS_COMPILER_IGNORE_LONG_DOUBLE],
|
||||
[CS_CHECK_BUILD_FLAGS(
|
||||
[how to suppress m4_default([$1],[C]) `long double' warnings],
|
||||
[m4_default([$2],[cs_cv_prog_compiler_ignore_long_double])],
|
||||
[CS_CREATE_TUPLE([-Wno-long-double])], [$1], [$3], [$4])])
|
||||
151
mk/jam/application.jam
Normal file
151
mk/jam/application.jam
Normal file
@@ -0,0 +1,151 @@
|
||||
#============================================================================
|
||||
# Rules for compiling applications
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# Use a more sensible and typical mode for executables than Jam's default.
|
||||
if "$(EXEMODE)" = "711" { EXEMODE = "+x" ; }
|
||||
|
||||
## Application appname : sources [ : options ]
|
||||
## Build an application out of sourcefiles. All sourcefiles will be passed
|
||||
## to the Objects rule which tries to compile them into object-files. You
|
||||
## can create rules for your own filetypes with the UserObject rule. Header
|
||||
## files will just be ignored. They are only used for MSVC projectfile
|
||||
## generation.
|
||||
## Possible options are "noinstall" if you don't want a default install
|
||||
## target to be created and "console" if you're building a console
|
||||
## application (an application without any graphical output which is
|
||||
## intended to be used on commandline)
|
||||
## Some notes: You should not add the .exe extension to the appname - jam
|
||||
## will do that on win32.
|
||||
## Options:
|
||||
## console: Create a console application
|
||||
## noinstall: Do not set up a default installation targets.
|
||||
## independent: The target will not be made a dependency of the apps and
|
||||
## all target.
|
||||
## nohelp: Do not invoke Help for this target.
|
||||
## notest: Do not set up unit-testing support for this target.
|
||||
## nomanifest: (Win32/MSVC) Don't generate manifest for application.
|
||||
rule Application
|
||||
{
|
||||
# check options
|
||||
CheckOptions noinstall console independent nohelp notest nomanifest : $(3) : $(<) ;
|
||||
|
||||
local target = [ ConstructApplicationTarget $(<) : $(3) ] ;
|
||||
local sources = [ DoSourceGrist $(>) ] ;
|
||||
local objects = [ CompileObjects $(sources) ] ;
|
||||
|
||||
$(<)_TYPE = application ;
|
||||
$(<)_OBJECTS = $(objects) ;
|
||||
$(<)_SOURCES = $(sources) ;
|
||||
$(<)_TARGET = $(target) ;
|
||||
|
||||
# create target clean rule
|
||||
Always $(<)clean ;
|
||||
NotFile $(<)clean ;
|
||||
Clean $(<)clean : $(objects) ; # create target clean rule
|
||||
|
||||
# so 'jam foo' works when it's really foo.exe (Windows) or foo.app (MacOS/X)
|
||||
if $(target) != $(<)
|
||||
{
|
||||
Depends $(<) : $(target) ;
|
||||
NotFile $(<) ;
|
||||
}
|
||||
|
||||
# make dependency on apps target
|
||||
if ! [ IsElem independent : $(3) ]
|
||||
{
|
||||
Depends apps : $(<) ;
|
||||
}
|
||||
|
||||
# construct Install target
|
||||
if ! [ IsElem noinstall : $(3) ]
|
||||
{
|
||||
local install_opts ;
|
||||
if [ IsElem console : $(3) ]
|
||||
{
|
||||
install_opts += console ;
|
||||
}
|
||||
SystemInstallApplication $(target) : : $(install_opts) ;
|
||||
}
|
||||
|
||||
# Link
|
||||
MakeLocate $(target) : $(LOCATE.TARGETS) ;
|
||||
SystemLinkApplication $(<) : $(objects) : $(3) ;
|
||||
|
||||
CFlags $(<) : $(APPLICATION.CFLAGS) ;
|
||||
LFlags $(<) : $(LINKLIBS) $(APPLICATION.LFLAGS) ;
|
||||
|
||||
if ! [ IsElem nohelp : $(3) ]
|
||||
{
|
||||
local desc = [ Description $(<) ] ;
|
||||
if ! $(desc) { desc = "$(<) application" ; }
|
||||
Help $(<) : "Build the $(desc)" ;
|
||||
}
|
||||
|
||||
if ! [ IsElem notest : $(options) ]
|
||||
{
|
||||
# @@@ Disabled for now; see docs/todo_jam.txt
|
||||
#UnitTest $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
## ShellScript scriptname : rule [ : options ]
|
||||
## Build a shell script by invoking `rule', the script creation rule, which
|
||||
## is passed `scriptname' and `options'.
|
||||
## Options:
|
||||
## noinstall: Do not set up a default installation target.
|
||||
## nohelp: Do not invoke Help for this target.
|
||||
rule ShellScript
|
||||
{
|
||||
CheckOptions noinstall nohelp : $(3) : $(<) ;
|
||||
|
||||
Always $(<)clean ;
|
||||
NotFile $(<)clean ;
|
||||
Clean clean : $(<) ;
|
||||
Clean $(<)clean : $(<) ;
|
||||
Depends apps : $(<) ;
|
||||
MakeLocate $(<) : $(LOCATE.TARGETS) ;
|
||||
|
||||
if ! [ IsElem noinstall : $(3) ]
|
||||
{
|
||||
Depends install_bin : [ DoInstall $(<) : $(bindir) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
$(2) $(<) : $(3) ;
|
||||
|
||||
MODE on $(<) = $(EXEMODE) ;
|
||||
SUBDIR on $(<) = $(SUBDIR) ;
|
||||
Chmod $(<) ;
|
||||
|
||||
if ! [ IsElem nohelp : $(3) ]
|
||||
{
|
||||
local desc = [ Description $(<) ] ;
|
||||
if ! $(desc) { desc = "$(<) script" ; }
|
||||
Help $(<) : "Build the $(desc)" ;
|
||||
}
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private part
|
||||
|
||||
# Construct pseudo target apps which is used instead of the pseudo target exe
|
||||
# in Jambase
|
||||
Depends exe : apps ;
|
||||
NotFile apps ;
|
||||
Help apps : "Build all applications" ;
|
||||
50
mk/jam/assembler.jam
Normal file
50
mk/jam/assembler.jam
Normal file
@@ -0,0 +1,50 @@
|
||||
#============================================================================
|
||||
# Rules for handling assembler files
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if $(CMD.NASM)
|
||||
{
|
||||
|
||||
rule NasmRule
|
||||
{
|
||||
local object = [ DoObjectGrist [ PrefixSuffix $(>)_ : $(<) : $(SUFOBJ) ] ] ;
|
||||
Nasm $(object) : $(<) ;
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType NasmRule : .asm ;
|
||||
|
||||
rule Nasm
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
NASM.FLAGS on $(<) += $(NASM.FLAGS) ;
|
||||
# NASM doesn't scan for headers in current dir of the files, so add the dir of
|
||||
# the file to the -I flags
|
||||
local includeflags = [ FIncludes $(SEARCH_SOURCE)/$(<:D) $(SUBDIRHDRS) $(HDRS) ] ;
|
||||
# NASM requires that -I paths have a trailing slash.
|
||||
INCLUDEFLAGS on $(<) = $(includeflags)$(SLASH) ;
|
||||
}
|
||||
|
||||
NASM.HDRPATTERN = "^[ ]*%[ ]*include[ ]*[<\"]([^\">]*)[\">].*$" ;
|
||||
RegisterHeaderRule HeaderRule : $(NASM.HDRPATTERN) : .asm .ash ;
|
||||
|
||||
actions Nasm
|
||||
{
|
||||
$(CMD.NASM) $(NASM.FLAGS) $(INCLUDEFLAGS) -o $(<) $(>)
|
||||
}
|
||||
}
|
||||
165
mk/jam/bisonflex.jam
Normal file
165
mk/jam/bisonflex.jam
Normal file
@@ -0,0 +1,165 @@
|
||||
#============================================================================
|
||||
# Rules for flex and bison
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if $(CMD.FLEX)
|
||||
{
|
||||
# Some versions of Flex-generated files want to include <unistd.h> which is
|
||||
# not normally available on Windows, so we need to protect it. We also
|
||||
# filter out CVS `Header' keywords in order to prevent CVS from thinking that
|
||||
# the file has changed simply because the Header information is different.
|
||||
FLEX.SED_SCRIPT =
|
||||
"'s/\\([ ]*#[ ]*include[ ][ ]*<unistd.h>\\)/#ifndef WIN32\\
|
||||
\\1\\
|
||||
#endif/;/\$Header:/d'" ;
|
||||
|
||||
# Compilers such as MSVC do not like #line directives. Since the generated
|
||||
# file might get stored in CVS and used by MSVC users (even if generated on
|
||||
# Unix, for instance), we want to suppress #line directives in all cases.
|
||||
FLEX.FLAGS += -L ;
|
||||
|
||||
rule FlexRule
|
||||
{
|
||||
local object ;
|
||||
local cfile = [ DoObjectGrist $(<:S=.c) ] ;
|
||||
|
||||
MakeLocate $(cfile) : $(LOCATE_TARGET) ;
|
||||
SEARCH on $(cfile) = $(LOCATE_TARGET) ;
|
||||
|
||||
Flex $(cfile) : $(<) ;
|
||||
object = [ CompileObjects $(cfile) : $(>) ] ;
|
||||
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType FlexRule : .l ;
|
||||
|
||||
rule Flex++Rule
|
||||
{
|
||||
local object ;
|
||||
local cppfile = [ DoObjectGrist $(<:S=.cpp) ] ;
|
||||
|
||||
MakeLocate $(cppfile) : $(LOCATE_TARGET) ;
|
||||
SEARCH on $(cppfile) = $(LOCATE_TARGET) ;
|
||||
|
||||
Flex $(cppfile) : $(<) ;
|
||||
object = [ CompileObjects $(cppfile) : $(>) ] ;
|
||||
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType Flex++Rule : .ll ;
|
||||
|
||||
rule Flex
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
FLEX.FLAGS on $(<) += $(FLEX.FLAGS) ;
|
||||
}
|
||||
|
||||
# Use -t and output redirection to avoid flex choosing undesirable names for
|
||||
# its output files. Also apply FLEX.SED_SCRIPT.
|
||||
actions Flex
|
||||
{
|
||||
$(CMD.FLEX) -t $(FLEX.FLAGS) $(>) | $(SED) $(FLEX.SED_SCRIPT) > $(<)
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.BISON)
|
||||
{
|
||||
rule BisonRule
|
||||
{
|
||||
local object ;
|
||||
local cfile = [ DoObjectGrist $(<:S=.c) ] ;
|
||||
local headerfile = [ DoObjectGrist $(<:S=.h) ] ;
|
||||
|
||||
# Jam's header file scannning doesn't use grist so we have to workaround
|
||||
# this here.
|
||||
Includes $(headerfile:G=$(SOURCE_GRIST:E)!$(SUBVARIANT:J=!)) : $(headerfile) ;
|
||||
|
||||
MakeLocate $(cfile) $(headerfile) : $(LOCATE_TARGET) ;
|
||||
|
||||
BISON.FLAGS on $(cfile) =
|
||||
[ on [ DoSourceGrist $(<:S=.c) ] GetVar BISON.FLAGS ] ;
|
||||
Bison $(cfile) : $(<) ;
|
||||
# Work around for jam warning about independant target when we put both
|
||||
# headerfile and cppfile in the bison line...
|
||||
Includes $(cppfile) : $(headerfile) ;
|
||||
object = [ CompileObjects $(cfile) : $(>) ] ;
|
||||
SEARCH on $(cfile) = $(LOCATE_TARGET) ;
|
||||
SEARCH on $(headerfile) = $(LOCATE_TARGET) ;
|
||||
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType BisonRule : .y ;
|
||||
|
||||
rule Bison++Rule
|
||||
{
|
||||
local object ;
|
||||
local cppfile = [ DoObjectGrist $(<:S=.cpp) ] ;
|
||||
local headerfile = [ DoObjectGrist $(<:S=.hpp) ] ;
|
||||
|
||||
# Jam's header file scannning doesn't use grist so we have to workaround
|
||||
# this here.
|
||||
Includes $(headerfile:G=$(SOURCE_GRIST:E)!$(SUBVARIANT:J=!)) : $(headerfile) ;
|
||||
|
||||
MakeLocate $(cppfile) : $(LOCATE_TARGET) ;
|
||||
MakeLocate $(headerfile) : $(LOCATE_TARGET) ;
|
||||
|
||||
BISON.FLAGS on $(cppfile) =
|
||||
[ on [ DoSourceGrist $(<:S=.cpp) ] GetVar BISON.FLAGS ] ;
|
||||
Bison $(cppfile) : $(<) ;
|
||||
# Work around for jam warning about independant target when we put both
|
||||
# headerfile and cppfile in the bison line...
|
||||
Includes $(cppfile) : $(headerfile) ;
|
||||
object = [ CompileObjects $(cppfile) : $(>) ] ;
|
||||
SEARCH on $(cppfile) = $(LOCATE_TARGET) ;
|
||||
SEARCH on $(headerfile) = $(LOCATE_TARGET) ;
|
||||
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType Bison++Rule : .yy ;
|
||||
|
||||
rule Bison
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
BISON.FLAGS on $(<) += $(BISON.FLAGS) ;
|
||||
}
|
||||
rule BisonFlags
|
||||
{
|
||||
local target ;
|
||||
|
||||
if $(<:S) = .yy
|
||||
{
|
||||
target = [ DoSourceGrist $(<:S=.cpp) $(<:S=.hpp) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
target = [ DoSourceGrist $(<:S=.c) $(<:S=.h) ] ;
|
||||
}
|
||||
BISON.FLAGS on $(target) += $(>) ;
|
||||
}
|
||||
|
||||
# Compilers such as MSVC do not like #line directives. Since the generated
|
||||
# file might get stored in CVS and used by MSVC users (even if generated on
|
||||
# Unix, for instance), we want to suppress #line directives in all cases.
|
||||
BISON.FLAGS += --no-lines ;
|
||||
|
||||
actions Bison
|
||||
{
|
||||
$(CMD.BISON) -d $(BISON.FLAGS) -o $(<[1]) $(>)
|
||||
}
|
||||
}
|
||||
82
mk/jam/build.jam
Normal file
82
mk/jam/build.jam
Normal file
@@ -0,0 +1,82 @@
|
||||
#============================================================================
|
||||
# Main rules file - Includes all important rulefiles in correct order
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# Enable if you want debug messages.
|
||||
JAM_DEBUG ?= 1 ;
|
||||
|
||||
jamrulesdir = $(TOP)/mk/jam ;
|
||||
|
||||
# Utility and compatibility rules used by all other scripts.
|
||||
include $(jamrulesdir)/jamcompatibility.jam ;
|
||||
include $(jamrulesdir)/subdir.jam ;
|
||||
include $(jamrulesdir)/property.jam ;
|
||||
|
||||
# This needs to be included before _and_ after all other includes (except the
|
||||
# super low-level utility files above) since it optionally overrides built-in
|
||||
# rules to glean information about targets being defined.
|
||||
include $(jamrulesdir)/dump.jam ;
|
||||
|
||||
include $(jamrulesdir)/options.jam ;
|
||||
include $(jamrulesdir)/variant.jam ;
|
||||
include $(jamrulesdir)/resource.jam ;
|
||||
|
||||
include $(jamrulesdir)/helper.jam ;
|
||||
include $(jamrulesdir)/help.jam ;
|
||||
include $(jamrulesdir)/groups.jam ;
|
||||
include $(jamrulesdir)/install.jam ;
|
||||
include $(jamrulesdir)/clean.jam ;
|
||||
|
||||
include $(jamrulesdir)/objects.jam ;
|
||||
include $(jamrulesdir)/compiler.jam ;
|
||||
include $(jamrulesdir)/objectivec.jam ;
|
||||
include $(jamrulesdir)/assembler.jam ;
|
||||
include $(jamrulesdir)/bisonflex.jam ;
|
||||
include $(jamrulesdir)/swig.jam ;
|
||||
|
||||
include $(jamrulesdir)/flags.jam ;
|
||||
include $(jamrulesdir)/library.jam ;
|
||||
include $(jamrulesdir)/static.jam ;
|
||||
include $(jamrulesdir)/application.jam ;
|
||||
include $(jamrulesdir)/plugin.jam ;
|
||||
include $(jamrulesdir)/docs.jam ;
|
||||
include $(jamrulesdir)/unittest.jam ;
|
||||
|
||||
# Include OS specific rules
|
||||
switch $(TARGET.OS)
|
||||
{
|
||||
case WIN32 :
|
||||
include $(jamrulesdir)/win32.jam ;
|
||||
case MACOS_X :
|
||||
include $(jamrulesdir)/macosx.jam ;
|
||||
case UNIX :
|
||||
include $(jamrulesdir)/unix.jam ;
|
||||
case * :
|
||||
echo "WARNING: TARGET.OS not defined. Using unix" ;
|
||||
include $(jamrulesdir)/unix.jam ;
|
||||
}
|
||||
|
||||
# This needs to be included after all others because it overrides some of the
|
||||
# earlier defined rules when enabled. It even overrides Win32 rules, so it
|
||||
# needs to be after platform-specific includes, as well.
|
||||
include $(jamrulesdir)/msvcgen.jam ;
|
||||
|
||||
# This needs to included be before _and_ after all other includes since it
|
||||
# optionally overrides rules defined earlier.
|
||||
include $(jamrulesdir)/dump.jam ;
|
||||
37
mk/jam/clean.jam
Normal file
37
mk/jam/clean.jam
Normal file
@@ -0,0 +1,37 @@
|
||||
#============================================================================
|
||||
# Rules for cleaning build detritus.
|
||||
# Copyright (C)2003 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# CleanDir <tag> : <dir> ...
|
||||
# Forcibly delete a set of directories, even if they are not empty.
|
||||
# Tag is one of the standard targets used with the "Clean" rule, such as
|
||||
# "clean" or "distclean".
|
||||
rule CleanDir
|
||||
{
|
||||
Always $(<) ;
|
||||
NotFile $(<) ;
|
||||
NoCare $(>) ;
|
||||
}
|
||||
|
||||
actions piecemeal together existing CleanDir
|
||||
{
|
||||
$(DELTREE) $(>)
|
||||
}
|
||||
|
||||
Help clean : "Remove all built targets from project" ;
|
||||
76
mk/jam/compiler.jam
Normal file
76
mk/jam/compiler.jam
Normal file
@@ -0,0 +1,76 @@
|
||||
#============================================================================
|
||||
# Rules for C and C++ files
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if $(CMD.CC)
|
||||
{
|
||||
|
||||
rule CcRule
|
||||
{
|
||||
local object =
|
||||
[ DoObjectGrist [ PrefixSuffix $(>)_ : $(<) : $(SUFOBJ) ] ] ;
|
||||
Cc $(object) : $(<) ;
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType CcRule : .c ;
|
||||
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .c ;
|
||||
|
||||
rule Cc
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
|
||||
CCFLAGS on $(<) += $(CCFLAGS) $(SUBDIRCCFLAGS) ;
|
||||
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
|
||||
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
|
||||
}
|
||||
|
||||
actions Cc
|
||||
{
|
||||
$(CMD.CC) -c -o $(<) $(CCHDRS) $(CCFLAGS) $(CCDEFS) $(>)
|
||||
}
|
||||
} # end if $(CMD.CC)
|
||||
|
||||
if $(CMD.C++)
|
||||
{
|
||||
|
||||
rule C++Rule
|
||||
{
|
||||
local object =
|
||||
[ DoObjectGrist [ PrefixSuffix $(>)_ : $(<) : $(SUFOBJ) ] ] ;
|
||||
C++ $(object) : $(<) ;
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType C++Rule : .cpp .cc .c++ ;
|
||||
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .cpp .cc .c++ ;
|
||||
|
||||
rule C++
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
|
||||
C++FLAGS on $(<) += $(C++FLAGS) $(SUBDIRC++FLAGS) ;
|
||||
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
|
||||
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
|
||||
}
|
||||
|
||||
actions C++
|
||||
{
|
||||
$(CMD.C++) -c -o $(<) $(CCHDRS) $(C++FLAGS) $(CCDEFS) $(>)
|
||||
}
|
||||
} # end if $(CMD:C++)
|
||||
|
||||
688
mk/jam/docs.jam
Normal file
688
mk/jam/docs.jam
Normal file
@@ -0,0 +1,688 @@
|
||||
#============================================================================
|
||||
# Rules for creating Documentation
|
||||
# Copyright (C)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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# Do-nothing implementations which avoid Jam error messages if client Jamfiles
|
||||
# attempt to invoke documantation-generation rules despite lack of availability
|
||||
# of appropriate tools. This simplifies client Jamfiles since the client does
|
||||
# not need to check for the presence of the various tools. These rules will be
|
||||
# re-defined later if the necessary tools are available.
|
||||
rule Texi2Info { }
|
||||
rule Texi2HTML { }
|
||||
rule Texi2DVI { }
|
||||
rule Texi2PS { }
|
||||
rule Texi2PDF { }
|
||||
rule Doxygen { }
|
||||
rule RepairNodes { }
|
||||
|
||||
if $(PERL)
|
||||
{
|
||||
PATH.TEXI2HTML.HOME ?= [ ConcatDirs $(TOP) docs support ] ;
|
||||
PATH.TEXI2HTML ?= [ ConcatDirs $(PATH.TEXI2HTML.HOME) texi2html.pl ] ;
|
||||
CMD.TEXI2HTML ?= "$(PERL) $(PATH.TEXI2HTML)" ;
|
||||
}
|
||||
|
||||
if $(CMD.MAKEINFO)
|
||||
{
|
||||
## Texi2Info targetname : texifiles : outputformat [ : subdir : [ outfile :
|
||||
## [ options ]]]
|
||||
## Invoke the makeinfo utility to convert Texinfo source (typically) to Info
|
||||
## format when the pseudo target 'targetname' is invoked. 'texifiles' is a
|
||||
## list of Texinfo files to be converted. The first element of 'texifiles'
|
||||
## should be the top-level Texinfo document which includes the remaining
|
||||
## files. It is okay for 'texifiles' to mention only a single Texinfo source
|
||||
## if the entire document is contained in the one file. 'outputformat' is
|
||||
## one of "info", "html", "xml", or "docbook". If not specified, it
|
||||
## defaults to "info". The optional 'subdir' is a subdirectory of
|
||||
## $(LOCATE.DOCS) into which the generated files should be placed. The
|
||||
## optional 'outfile' is the name of the output file. Some output formats
|
||||
## may generate multiple output files (such as "outfile.info",
|
||||
## "outfile-1.info", "outfile-2.info", etc.). If 'outfile' is omitted, then
|
||||
## the output filename is derived from the first element of 'texifiles' with
|
||||
## the extension changed to reflect 'outputformat' (one of .info, .html,
|
||||
## .xml, or .docbook). 'options' is a set of command-line flags passed
|
||||
## directly to makeinfo. Returns the gristed output file name.
|
||||
rule Texi2Info
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local format = $(3) ;
|
||||
local subdir = $(4) ;
|
||||
local outfile = $(5) ;
|
||||
local options = $(6) ;
|
||||
|
||||
if ! $(format) { format = info ; }
|
||||
|
||||
local fmtoptions ;
|
||||
switch $(format)
|
||||
{
|
||||
case info : fmtoptions = ;
|
||||
case html : fmtoptions = --html ;
|
||||
case xml : fmtoptions = --xml ;
|
||||
case docbook : fmtoptions = --docbook ;
|
||||
}
|
||||
|
||||
return [ _Texinfo $(target) : $(texifiles) : $(format) : $(outfile) :
|
||||
RunMakeInfo : $(fmtoptions) $(options) : $(subdir) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.TEXI2HTML)
|
||||
{
|
||||
## Texi2HTML targetname : texifiles [ : subdir : [ outfile : [ options ]]]
|
||||
## Invoke the texi2html utility to convert Texinfo source to HTML format
|
||||
## when the pseudo target 'targetname' is invoked. 'texifiles' is a list of
|
||||
## Texinfo files to be converted. The first element of 'texifiles' should
|
||||
## be the top-level Texinfo document which includes the remaining files. It
|
||||
## is okay for 'texifiles' to mention only a single Texinfo source if the
|
||||
## entire document is contained in the one file. The optional 'subdir' is a
|
||||
## subdirectory of $(LOCATE.DOCS) into which the generated files should be
|
||||
## placed. The optional 'outfile' is the name of the root output file
|
||||
## (typically "index.html"). If the input files contain multiple Texinfo
|
||||
## @nodes, then texi2html may generate multiple output files (depending upon
|
||||
## local texi2html configuration) based upon the section numbering, and
|
||||
## 'outfile' will reference the other generated files. If 'outfile' is
|
||||
## omitted, then the output filename is derived from the first element of
|
||||
## 'texifiles' with the extension changed to .html. 'options' is a set of
|
||||
## command-line flags passed directly to texi2html. Returns the gristed
|
||||
## output file name.
|
||||
rule Texi2HTML
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local options = $(5) ;
|
||||
return [ _Texinfo $(target) : $(texifiles) : html : $(outfile) :
|
||||
RunTexi2HTML : $(options) : $(subdir) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.TEXI2DVI)
|
||||
{
|
||||
## Texi2DVI targetname : texifiles [ : subdir [ : outfile [ : options ]]]
|
||||
## Invoke the texi2dvi utility to convert Texinfo source to DVI format when
|
||||
## the pseudo target 'targetname' is invoked. 'texifiles' is a list of
|
||||
## Texinfo files to be converted. The first element of 'texifiles' should
|
||||
## be the top-level Texinfo document which includes the remaining files. It
|
||||
## is okay for 'texifiles' to mention only a single Texinfo source if the
|
||||
## entire document is contained in the one file. The optional 'subdir' is a
|
||||
## subdirectory of $(LOCATE.DOCS) into which the generated file should be
|
||||
## placed. The optional 'outfile' is the name of the output file. If
|
||||
## 'outfile' is omitted, then the output filename is derived from the first
|
||||
## element of 'texifiles' with the extension changed to .dvi. 'options' is a
|
||||
## set of command-line flags passed directly to texi2dvi. Returns the
|
||||
## gristed output file name.
|
||||
rule Texi2DVI
|
||||
{
|
||||
return [ _Texi2DVI $(1) : $(2) : $(3) : $(4) : $(5) : dvi ] ;
|
||||
}
|
||||
|
||||
if $(CMD.DVIPS)
|
||||
{
|
||||
## Texi2PS targetname : texifile [ : subdir [ : outfile [ : psoptions
|
||||
## [ : dvioptions ]]]]
|
||||
## Invoke the texi2dvi and dvips utilities to convert Texinfo source to
|
||||
## PostScript format when the pseudo target 'targetname' is invoked.
|
||||
## 'texifiles' is a list of Texinfo files to be converted. The first
|
||||
## element of 'texifiles' should be the top-level Texinfo document which
|
||||
## includes the remaining files. It is okay for 'texifiles' to mention only
|
||||
## a single Texinfo source if the entire document is contained in the one
|
||||
## file. The optional 'subdir' is a subdirectory of $(LOCATE.DOCS) into
|
||||
## which the generated file should be placed. The optional 'outfile' is the
|
||||
## name of the output file. If 'outfile' is omitted, then the output
|
||||
## filename is derived from the first element of 'texifiles' with the
|
||||
## extension changed to .ps. 'psoptions' is a set of command-line flags
|
||||
## passed directly to dvips. 'dvioptions' is a set of command-line flags
|
||||
## passed directly to texi2dvi. Returns the gristed output file name.
|
||||
rule Texi2PS
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local psoptions = $(5) ;
|
||||
local dvioptions = $(6) ;
|
||||
return [ _Dvi $(target) : $(texifiles) : ps : $(outfile:S=.ps) : RunDVIPS :
|
||||
$(psoptions) : $(dvioptions) : $(subdir) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.DVIPDF)
|
||||
{
|
||||
## Texi2PDF targetname : texifiles [ : subdir [ : outfile [ : pdfoptions
|
||||
## [ : dvioptions ]]]]
|
||||
## Invoke the texi2dvi and dvipdf utilities to convert Texinfo source to PDF
|
||||
## format when the pseudo target 'targetname' is invoked. 'texifiles' is a
|
||||
## list of Texinfo files to be converted. The first element of 'texifiles'
|
||||
## should be the top-level Texinfo document which includes the remaining
|
||||
## files. It is okay for 'texifiles' to mention only a single Texinfo source
|
||||
## if the entire document is contained in the one file. The optional
|
||||
## 'subdir' is a subdirectory of $(LOCATE.DOCS) into which the generated
|
||||
## file should be placed. The optional 'outfile' is the name of the output
|
||||
## file. If 'outfile' is omitted, then the output filename is derived from
|
||||
## the first element of 'texifiles' with the extension changed to .pdf.
|
||||
## 'pdfoptions' is a set of command-line flags passed directly to
|
||||
## dvipdf. 'dvioptions' is a set of command-line flags passed directly to
|
||||
## texi2dvi. Returns the gristed output file name.
|
||||
rule Texi2PDF
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local pdfoptions = $(5) ;
|
||||
local dvioptions = $(6) ;
|
||||
|
||||
local pdffile = [ _Dvi $(target) : $(texifiles) : pdf : $(outfile:S=.pdf) :
|
||||
RunDVIPDF : $(pdfoptions) : $(dvioptions) : $(subdir) ] ;
|
||||
CONVERTER on $(pdffile) = $(CMD.DVIPDF) ;
|
||||
return pdffile ;
|
||||
}
|
||||
}
|
||||
else if $(CMD.TEXI2PDF)
|
||||
{
|
||||
## Texi2PDF targetname : texifiles [ : subdir [ : outfile [ : options ]]]
|
||||
## Invoke the texi2pdf utility to convert Texinfo source to PDF format when
|
||||
## the pseudo target 'targetname' is invoked. 'texifiles' is a list of
|
||||
## Texinfo files to be converted. The first element of 'texifiles' should
|
||||
## be the top-level Texinfo document which includes the remaining files. It
|
||||
## is okay for 'texifiles' to mention only a single Texinfo source if the
|
||||
## entire document is contained in the one file. The optional 'subdir' is a
|
||||
## subdirectory of $(LOCATE.DOCS) into which the generated file should be
|
||||
## placed. The optional 'outfile' is the name of the output file. If
|
||||
## 'outfile' is omitted, then the output filename is derived from the first
|
||||
## element of 'texifiles' with the extension changed to .pdf. 'options' is a
|
||||
## set of command-line flags passed directly to texi2pdf. Returns the
|
||||
## gristed output file name.
|
||||
rule Texi2PDF
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local options = $(5) ;
|
||||
local pdffile = [ _Texinfo $(target) : $(texifiles) : pdf : $(outfile) :
|
||||
RunTexi2DVI : -I $(SUBDIR) $(options) : $(subdir) ] ;
|
||||
CONVERTER on $(pdffile) = $(CMD.TEXI2PDF) ;
|
||||
OPTIONS on $(pdffile) += $(FLAGS.TEXI2PDF) ;
|
||||
return pdffile ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if $(PERL)
|
||||
{
|
||||
PATH.NODEFIX ?= [ ConcatDirs $(TOP) docs support nodefix.pl ] ;
|
||||
CMD.NODEFIX ?= $(PERL) $(PATH.NODEFIX) ;
|
||||
|
||||
## RepairNodes targetname : texifile [ : srcdir ]
|
||||
## When 'targetname' is invoked, perform in-place repair of @node and @menu
|
||||
## directives in 'texifile' so that they correctly reflect the documentation
|
||||
## hierarchy defined by @chapter, @section, @subsection, etc. directives.
|
||||
## 'srcdir' is the directory containing 'texifile' as well as any files
|
||||
## included via @include{} or @import{} directives. If 'srcdir' is omitted,
|
||||
## then $(SUBDIR) is assumed.
|
||||
rule RepairNodes
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifile = $(2) ;
|
||||
local srcdir = $(3) ;
|
||||
if ! $(srcdir) { srcdir = $(SUBDIR) ; }
|
||||
|
||||
SEARCH on $(texifile) = $(srcdir) ;
|
||||
TEXINFO.INCDIR on $(target) = $(srcdir) ;
|
||||
Depends $(target) : $(texifile) ;
|
||||
NotFile $(target) ;
|
||||
Always $(target) ;
|
||||
}
|
||||
|
||||
actions RepairNodes
|
||||
{
|
||||
$(CMD.NODEFIX) --include-dir="$(TEXINFO.INCDIR)" "$(>)" ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.DOXYGEN)
|
||||
{
|
||||
|
||||
actions WriteCppWrapper
|
||||
{
|
||||
echo "$(DOXYCPP_COMMAND)" > "$(1)"
|
||||
}
|
||||
|
||||
rule GenerateDoxygenCppWrapper
|
||||
{
|
||||
local target = $(1) ;
|
||||
local cxxcpp = $(2) ;
|
||||
|
||||
local outfile cmdpath command ;
|
||||
if $(TARGET.OS) = WIN32
|
||||
{
|
||||
# On Win32, MSYS is not used but the "native" process running, so we can't
|
||||
# launch the preprocessor with sh.
|
||||
outfile = "cpp.cmd" ;
|
||||
local p = [ SplitToList $(LOCATE.DOCS) : "/" ] $(outfile) ;
|
||||
cmdpath = $(p:J=\\\\) ;
|
||||
command = "$(cxxcpp)" %1 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
outfile = "cpp.sh" ;
|
||||
local p = $(LOCATE.DOCS) $(outfile) ;
|
||||
cmdpath = $(p:J=/) ;
|
||||
command = "$(cxxcpp)" \\$1 ;
|
||||
}
|
||||
MakeLocate $(outfile) : $(LOCATE.DOCS) ;
|
||||
DOXYCPP_COMMAND on $(outfile) = $(command) ;
|
||||
WriteCppWrapper $(outfile) ;
|
||||
MODE on $(outfile) = "+x" ;
|
||||
Chmod $(outfile) ;
|
||||
|
||||
Always $(outfile) ;
|
||||
Depends $(target) : $(outfile) ;
|
||||
Clean $(target)clean : $(outfile) ;
|
||||
|
||||
return $(cmdpath) ;
|
||||
}
|
||||
|
||||
## Doxygen targetname : doxyprofile-and-resources [ : subdir [ : outfile
|
||||
## [ : options ]]]
|
||||
## Invoke the Doxygen utility to generate API documentation based upon
|
||||
## 'doxyprofile' when the pseudo target 'targetname' is invoked. The first
|
||||
## element of 'doxyprofile-and-resources' is the Doxygen configuration file
|
||||
## which controls the API generation. The remaining optional elements are
|
||||
## additional resources which should be copied verbatim to the output
|
||||
## directory. Typical additional resources include CSS and related image
|
||||
## files. It is assumed that the source files mentioned by
|
||||
## 'doxyprofile-and-resources' reside in $(SUBDIR). The optional 'subdir'
|
||||
## is a subdirectory of $(LOCATE.DOCS) into which the generated files should
|
||||
## be placed. The optional 'outfile' is the name of the root output file
|
||||
## (typically "index.html"). This file will reference any other files
|
||||
## generated by Doxygen. If 'outfile' is omitted, then the output filename
|
||||
## defaults to "index.html". 'options' is a set of command-line flags
|
||||
## passed directly to Doxygen. Returns the gristed output file name.
|
||||
rule Doxygen
|
||||
{
|
||||
local target = $(1) ;
|
||||
local infiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local optioins = $(5) ;
|
||||
local doxyfile = $(infiles[1]) ;
|
||||
local resources = $(infiles[2-]) ;
|
||||
local outdir = [ FDirName $(LOCATE.DOCS) $(subdir) ] ;
|
||||
local grist = "$(SOURCE_GRIST)!$(target)" ;
|
||||
|
||||
if ! $(outfile)
|
||||
{
|
||||
outfile = index.html ;
|
||||
}
|
||||
outfile = $(outfile:G=$(grist)) ;
|
||||
|
||||
local r ;
|
||||
for r in $(resources)
|
||||
{
|
||||
local src = $(r:G=$(grist)!src) ;
|
||||
local dst = $(r:G=$(grist)!dst) ;
|
||||
SEARCH on $(src) = $(SUBDIR) ;
|
||||
MakeLocate $(dst) : $(outdir) ;
|
||||
Copy $(dst) : $(src) ;
|
||||
Depends $(dst) : $(src) ;
|
||||
Depends $(outfile) : $(dst) ;
|
||||
Clean $(target)clean : $(dst) ;
|
||||
}
|
||||
|
||||
local doxycpp ;
|
||||
if $(CMD.C++CPP)
|
||||
{
|
||||
doxycpp = [ GenerateDoxygenCppWrapper $(outfile) :
|
||||
$(CMD.C++CPP) [ FDefines DOXYGEN_RUN ] ] ;
|
||||
}
|
||||
|
||||
local have_dot = "NO" ;
|
||||
local dot_path ;
|
||||
if $(CMD.DOT)
|
||||
{
|
||||
local dotpath = [ Reverse [ SplitToList $(CMD.DOT) : / ] ] ;
|
||||
if $(dotpath[1]) != "dot"
|
||||
{
|
||||
Echo "doxygen expects the dot binary to be named 'dot' exactly" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
dot_path = [ Reverse $(dotpath[2-]) ] ;
|
||||
dot_path = $(dot_path:J=/) ;
|
||||
have_dot = "YES" ;
|
||||
}
|
||||
}
|
||||
|
||||
SEARCH on $(doxyfile) = $(SUBDIR) ;
|
||||
OPTIONS on $(target) = $(options) ;
|
||||
DOXYCPP on $(target) = $(doxycpp) ;
|
||||
HAVE_DOT on $(target) = $(have_dot) ;
|
||||
DOT_PATH on $(target) = $(dot_path) ;
|
||||
MakeLocate $(outfile) : $(outdir) ;
|
||||
Depends $(outfile) : $(doxyfile) ;
|
||||
Depends $(target) : $(outfile) ;
|
||||
RunDoxygen $(target) : $(doxyfile) ;
|
||||
NotFile $(target) ;
|
||||
Always $(target) ;
|
||||
Clean $(target)clean : $(outfile) ;
|
||||
if $(subdir)
|
||||
{
|
||||
CleanDir $(target)clean : $(outdir) ;
|
||||
}
|
||||
Depends cleandoc : $(target)clean ;
|
||||
return outfile ;
|
||||
}
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Private helper rules and actions.
|
||||
|
||||
## _Texinfo targetname : texifiles : format : [ outfile ] : converter
|
||||
## [ : options [ : subdir ]]
|
||||
## The workhorse of the various Texinfo conversion rules. This rule sets up
|
||||
## a pseudo-target 'targetname' which takes care of copying image files to
|
||||
## the output directory if needed by the output format, gristing intput and
|
||||
## output files, invoking the specified low-level conversion rule, and
|
||||
## cleaning up temporary files upon completion. 'texifiles' is a list of
|
||||
## Texinfo files to be converted. The first element of 'texifiles' should
|
||||
## be the top-level Texinfo document which @includes the remaining files. It
|
||||
## is okay for 'texifiles' to mention only a single Texinfo source if the
|
||||
## entire document is contained in the one file. 'format' is one of "info",
|
||||
## "html", "xml", "docbook", "dvi", "ps", or "pdf", and is used in the
|
||||
## formulation of the grist, and as the extension of 'outfile' if omitted.
|
||||
## The format also determines which type of image files (if any) should be
|
||||
## copied to the output directory, and whether the copied images should be
|
||||
## cleaned up upon completion. 'outfile' is the name of the root output
|
||||
## file. If 'outfile' is omitted, then the output filename is derived from
|
||||
## the first element of 'texifiles' with the extension changed to reflect
|
||||
## 'format'. 'converter' is the Jam rule which will perform the actual
|
||||
## conversion. It is passed 'outfile' as $(<), and the first element of
|
||||
## 'texifiles' as $(>). The optional 'subdir' is a subdirectory of
|
||||
## $(LOCATE.DOCS) into which the generated files should be placed.
|
||||
## 'options' is a set of command-line flags to be passed directly to the
|
||||
## underlying conversion tool. Returns the gristed output file name. The
|
||||
## following variables may be accessed from within the 'converter' action:
|
||||
## $(SRCDIR) - Value of $(SUBDIR) when this rule was invoked.
|
||||
## $(OUTDIR) - Directory into which output files should be emitted.
|
||||
## $(OUTLOG) - Name of a log file within $(OUTDIR) into which 'converter'
|
||||
## may direct diagnostic output of conversion tool if needed.
|
||||
## $(FORMAT) - Value of 'format'.
|
||||
## $(OPTIONS) - Value of 'options'.
|
||||
rule _Texinfo
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local format = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local converter = $(5) ;
|
||||
local options = $(6) ;
|
||||
local subdir = $(7) ;
|
||||
local outdir = [ FDirName $(LOCATE.DOCS) $(subdir) ] ;
|
||||
local grist = "$(SOURCE_GRIST)!$(target)!$(format)" ;
|
||||
local outlog ;
|
||||
|
||||
local texifile = $(texifiles[1]:G=$(grist)) ;
|
||||
local texideps = $(texifiles[2-]) ;
|
||||
|
||||
if ! $(outfile)
|
||||
{
|
||||
outfile = $(texifile:BS=.$(format)) ;
|
||||
}
|
||||
outfile = $(outfile:G=$(grist)) ;
|
||||
outlog = $(outfile:G=:R=$(outdir):S=$(outfile:S)log) ;
|
||||
|
||||
local inftypes = .txt ;
|
||||
local xmltypes = .jpg .png .gif ;
|
||||
local dvitypes = .eps .pdf ;
|
||||
local pstypes = .eps ;
|
||||
local pdftypes = .eps .pdf ;
|
||||
local imagetypes copyimages ;
|
||||
switch $(format)
|
||||
{
|
||||
case info : imagetypes = $(inftypes) ; copyimages = no ;
|
||||
case html : imagetypes = $(xmltypes) ; copyimages = yes ;
|
||||
case xml : imagetypes = $(xmltypes) ; copyimages = yes ;
|
||||
case docbook : imagetypes = $(xmltypes) ; copyimages = yes ;
|
||||
case dvi : imagetypes = $(dvitypes) ; copyimages = yes ;
|
||||
case ps : imagetypes = $(pstypes) ; copyimages = no ;
|
||||
case pdf : imagetypes = $(pdftypes) ; copyimages = no ;
|
||||
case * : Error "Texinfo: unrecognized output format" $(format) ;
|
||||
}
|
||||
|
||||
local images ;
|
||||
if $(imagetypes) { images = [ Recurse : $(imagetypes) ] ; }
|
||||
|
||||
local image ;
|
||||
for image in $(images)
|
||||
{
|
||||
local imagegrist = "$(grist)!$(image:D)" ;
|
||||
local src = $(image:BSG=$(imagegrist)) ;
|
||||
local srcdir = [ ConcatDirs $(SUBDIR) $(image:D) ] ;
|
||||
SEARCH on $(src) = $(srcdir) ;
|
||||
if $(copyimages) = no
|
||||
{
|
||||
Includes $(texifile) : $(src) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
local dst = $(image:BSG=$(imagegrist)built) ;
|
||||
local dstdir = [ ConcatDirs $(outdir) $(image:D) ] ;
|
||||
MakeLocate $(dst) : $(dstdir) ;
|
||||
Copy $(dst) : $(src) ;
|
||||
Depends $(dst) : $(src) ;
|
||||
Depends $(outfile) : $(dst) ;
|
||||
Clean $(target)clean : $(dst) ;
|
||||
}
|
||||
}
|
||||
|
||||
SRCDIR on $(outfile) = $(SUBDIR) ;
|
||||
OUTDIR on $(outfile) = $(outdir) ;
|
||||
OUTLOG on $(outfile) = $(outlog) ;
|
||||
FORMAT on $(outfile) = $(format) ;
|
||||
OPTIONS on $(outfile) = $(options) ;
|
||||
|
||||
SEARCH on $(texifile) = $(SUBDIR) ;
|
||||
SEARCH on $(texideps) = $(SUBDIR) ;
|
||||
Includes $(texifile) : $(texideps) ;
|
||||
MakeLocate $(outfile) : $(outdir) ;
|
||||
Depends $(outfile) : $(texifile) ;
|
||||
Depends $(target) : $(outfile) ;
|
||||
$(converter) $(outfile) : $(texifile) ;
|
||||
NotFile $(target) ;
|
||||
Clean $(target)clean : $(outfile) ;
|
||||
if $(subdir)
|
||||
{
|
||||
CleanDir $(target)clean : $(outdir) ;
|
||||
}
|
||||
Depends cleandoc : $(target)clean ;
|
||||
|
||||
return $(outfile) ;
|
||||
}
|
||||
|
||||
## _Texi2DVI targetname : texifiles [ : subdir [ : outfile [ : options
|
||||
## [ : format ]]]]
|
||||
## A thin wrapper around the _Texinfo rule which invokes TeX-wrapping tools
|
||||
## such as texi2dvi and texi2pdf. The action for this rule captures the
|
||||
## output of TeX into a log file and tells the user to consult the log file
|
||||
## if TeX fails. It also monitors the log file for TeX `hbox' warnings, and
|
||||
## informs the user to consult the log if any are discovered. The log file
|
||||
## is removed silently if no problems are detected. Returns the gristed
|
||||
## output DVI file name. In addition to the variables exported by the
|
||||
## _Texinfo rule, the following variables may be accessed from within the
|
||||
## action:
|
||||
## $(CONVERTER) - The actual command-line tool wrapping TeX.
|
||||
rule _Texi2DVI
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local subdir = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local options = $(5) ;
|
||||
local format = $(6) ;
|
||||
local dvifile = [ _Texinfo $(target) : $(texifiles) : $(format) :
|
||||
$(outfile) : RunTexi2DVI : -I $(SUBDIR) $(options) : $(subdir) ] ;
|
||||
CONVERTER on $(dvifile) = $(CMD.TEXI2DVI) ;
|
||||
OPTIONS on $(dvifile) += $(FLAGS.TEXI2DVI) ;
|
||||
return $(dvifile) ;
|
||||
}
|
||||
|
||||
## _Dvi targetname : texifiles : format : outfile : converter [ : options
|
||||
## [ : dvioptions [ : subdir ]]]
|
||||
## A wrapper around the _Texi2DVI rule which also runs a secondary
|
||||
## conversion rule/action on the generated DVI file. Examples of secondary
|
||||
## conversions include dvips, dvipdf, etc. The arguments 'targetname',
|
||||
## 'format', 'outfile', and 'subdir' have the same meaning as for the
|
||||
## _Texinfo and _Texi2DVI rules. 'converter' is the rule/action which
|
||||
## converts the generated DVI file to the final output format. 'options' is
|
||||
## a set of command-line flags to be passed directly to the underlying
|
||||
## secondary conversion tool. 'dvioptions' are the command-line options
|
||||
## passed to _Texi2DVI. As with the _Texi2DVI rule, this rule captures the
|
||||
## output of the secondary conversion tool to a log file and instructs the
|
||||
## user to consult it when a problem is detected. Returns the gristed
|
||||
## output file name.
|
||||
rule _Dvi
|
||||
{
|
||||
local target = $(1) ;
|
||||
local texifiles = $(2) ;
|
||||
local format = $(3) ;
|
||||
local outfile = $(4) ;
|
||||
local converter = $(5) ;
|
||||
local options = $(6) ;
|
||||
local dvioptions = $(7) ;
|
||||
local subdir = $(8) ;
|
||||
|
||||
local dvifile = [ _Texi2DVI _$(target)_dvi : $(texifiles) : $(subdir) :
|
||||
$(outfile:S=.dvi) : $(dvioptions) : $(format) ] ;
|
||||
|
||||
if ! $(outfile)
|
||||
{
|
||||
outfile = $(dvifile:BS=.$(format)) ;
|
||||
}
|
||||
local outdir = [ FDirName $(LOCATE.DOCS) $(subdir) ] ;
|
||||
local outlog = $(outfile:G=:R=$(outdir):S=$(outfile:S)log) ;
|
||||
|
||||
SRCDIR on $(outfile) = $(SUBDIR) ;
|
||||
OUTLOG on $(outfile) = $(outlog) ;
|
||||
FORMAT on $(outfile) = $(format) ;
|
||||
OPTIONS on $(outfile) = $(psoptions) ;
|
||||
|
||||
MakeLocate $(outfile) : $(outdir) ;
|
||||
Depends $(outfile) : $(dvifile) ;
|
||||
Depends $(target) : $(outfile) ;
|
||||
$(converter) $(outfile) : $(dvifile) ;
|
||||
RmTemps $(outfile) : $(dvifile) ;
|
||||
Clean $(target)clean : $(outfile) $(dvifile) ;
|
||||
NotFile $(target) ;
|
||||
NotFile $(target)clean ;
|
||||
if $(subdir)
|
||||
{
|
||||
CleanDir $(target)clean : $(outdir) ;
|
||||
}
|
||||
|
||||
return $(outfile) ;
|
||||
}
|
||||
|
||||
# Unfortunately, `makeinfo' 4.3, which ships with MSYS, does not respect the
|
||||
# search path (-I) for @image{} directives, so we need to `cd' into the source
|
||||
# directory to work around this shortcoming. With modern versions of
|
||||
# `makeinfo', we could instead just use `-I$(SRCDIR)' instead of the pwd/cd
|
||||
# goop.
|
||||
actions RunMakeInfo
|
||||
{
|
||||
dir=`pwd` ; \
|
||||
cd $(>:D) ; \
|
||||
$(CMD.MAKEINFO) $(OPTIONS) $(FLAGS.MAKEINFO) --output="${dir}/$(<)" $(>:B)
|
||||
}
|
||||
|
||||
actions RunTexi2HTML
|
||||
{
|
||||
T2H_HOME="$(PATH.TEXI2HTML.HOME)" \
|
||||
$(CMD.TEXI2HTML) $(OPTIONS) $(FLAGS.TEXI2HTML) -subdir="$(OUTDIR)" \
|
||||
-top-file="$(<:BS)" "$(>)"
|
||||
}
|
||||
|
||||
actions RunTexi2DVI
|
||||
{
|
||||
$(CONVERTER) $(OPTIONS) --batch --output=$(<) $(>) > $(OUTLOG) 2>&1
|
||||
if test $? -ne 0; then
|
||||
echo "*** ERROR: $(CONVERTER) reported one or more errors."
|
||||
echo "*** ERROR: See $(OUTLOG) for details."
|
||||
false
|
||||
fi
|
||||
if test $? -eq 0; then
|
||||
grep hbox $(OUTLOG) >/dev/null 2>&1
|
||||
if test $? -eq 0; then
|
||||
echo "*** WARNING: $(CONVERTER) reported 'hbox' warnings." && \
|
||||
echo "*** WARNING: See $(OUTLOG) for details."
|
||||
else
|
||||
$(RM) $(OUTLOG)
|
||||
fi
|
||||
true
|
||||
else
|
||||
false
|
||||
fi
|
||||
}
|
||||
|
||||
actions RunDVIPS
|
||||
{
|
||||
TEXPICTS="$(SRCDIR)" \
|
||||
$(CMD.DVIPS) $(OPTIONS) -o $(<) $(>) > $(OUTLOG) 2>&1
|
||||
if test $? -ne 0; then
|
||||
echo "*** ERROR: $(CMD.DVIPS) reported one or more errors."
|
||||
echo "*** ERROR: See $(OUTLOG) for details."
|
||||
false
|
||||
else
|
||||
$(RM) $(OUTLOG)
|
||||
true
|
||||
fi
|
||||
}
|
||||
|
||||
actions RunDVIPDF
|
||||
{
|
||||
TEXPICTS="$(SRCDIR)" \
|
||||
$(CMD.DVIPDF) $(OPTIONS) $(>) $(<) > $(OUTLOG) 2>&1
|
||||
if test $? -ne 0; then
|
||||
echo "*** ERROR: $(CMD.DVIPDF) reported one or more errors."
|
||||
echo "*** ERROR: See $(OUTLOG) for details."
|
||||
false
|
||||
else
|
||||
$(RM) $(OUTLOG)
|
||||
true
|
||||
fi
|
||||
}
|
||||
|
||||
actions RunDoxygen
|
||||
{
|
||||
TOP=$(TOP) DOXYCPP=$(DOXYCPP) HAVE_DOT=$(HAVE_DOT) DOT_PATH=$(DOT_PATH) $(CMD.DOXYGEN) $(OPTIONS) $(FLAGS.DOXYGEN) $(>)
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# Additional clean rules.
|
||||
|
||||
CleanDir cleandoc : $(LOCATE.DOCS) ;
|
||||
Depends clean : cleandoc ;
|
||||
Help cleandoc : "Remove built documentation files" ;
|
||||
|
||||
Always docclean ;
|
||||
NotFile docclean ;
|
||||
Depends docclean : cleandoc ;
|
||||
128
mk/jam/dump.jam
Normal file
128
mk/jam/dump.jam
Normal file
@@ -0,0 +1,128 @@
|
||||
#==============================================================================
|
||||
# Utility functions for collecting information about the Jam environment.
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# When the target "dumptargets" is invoked, dump the top-level, user-visible
|
||||
# build targets as a whitespace-delimited list to the file named by the Jam
|
||||
# variable DUMPTARGETS_FILE. Example:
|
||||
#
|
||||
# jam -sDUMPTARGETS_FILE=targets.txt dumptargets
|
||||
#
|
||||
# This output might be useful, for instance, when composing documentation (via
|
||||
# some automated mechanism) which lists the targets visible to the user.
|
||||
#
|
||||
# IMPLEMENTATION NOTES
|
||||
#
|
||||
# The emitted target names are collected from several locations:
|
||||
#
|
||||
# - All single-word arguments to NotFile composed of ._- and alphanumerics.
|
||||
#
|
||||
# - Targets defined by the Application rule. Unlike other rules (Plugin,
|
||||
# Library, etc.) which compose a top-level pseudo-target using NotFile
|
||||
# (which is thus caught by the above case), on Unix, the Application rule
|
||||
# does not invoke NotFile since the top-level target has the same name as
|
||||
# the generated executable.
|
||||
#
|
||||
# - Targets defined by the ShellScript rule, since the emitted shell scripts
|
||||
# have the same name as the top-level target.
|
||||
#
|
||||
# Collection occurs in two phases. This file must be included by build.jam
|
||||
# before any other utility *.jam files are included, and it must also be
|
||||
# included after all other utility *.jam files are included. In the first
|
||||
# phase, the NotFile rule is re-defined so that we can catch pseudo-targets
|
||||
# created by the other utility *.jam files (we must re-define NotFile before
|
||||
# they are included), as well as any NotFile pseudo-targets created by Jamfiles
|
||||
# throughout the project. In the second phase, the Application and ShellScript
|
||||
# rules are re-defined (we must do so after application.jam has defined the
|
||||
# implementations which we override). These overrides allow us to catch
|
||||
# application and shell-script targets which project-wide Jamfiles define.
|
||||
#------------------------------------------------------------------------------
|
||||
if $(DUMPTARGETS_FILE)
|
||||
{
|
||||
# Jam does not support arithmetic, so we fake it with Roman numerals.
|
||||
DUMPTARGETS_PASS ?= "" ;
|
||||
DUMPTARGETS_PASS = "$(DUMPTARGETS_PASS)I" ;
|
||||
|
||||
switch $(DUMPTARGETS_PASS)
|
||||
{
|
||||
case I :
|
||||
|
||||
actions InitPseudoTargets
|
||||
{
|
||||
$(RM) $(<)
|
||||
}
|
||||
|
||||
rule DumpPseudoTargets
|
||||
{
|
||||
NotFile $(<) ;
|
||||
Always $(<) ;
|
||||
Depends $(<) : $(>) ;
|
||||
Always $(>) ;
|
||||
InitPseudoTargets $(>) ;
|
||||
}
|
||||
|
||||
DumpPseudoTargets dumptargets : "$(DUMPTARGETS_FILE)" ;
|
||||
|
||||
actions together piecemeal EmitPseudoTarget
|
||||
{
|
||||
echo "$(>)" >> $(<)
|
||||
}
|
||||
|
||||
rule PossiblePseudoTarget
|
||||
{
|
||||
# NoCare and Includes are not actually required; they are used here merely to
|
||||
# avoid Jam's "using independent target" warning. Note, however, that Jam
|
||||
# 2.4 and BoostJam try building the target despite the fact that we NoCare
|
||||
# about it. (Presumably this is because the targets have updating actions,
|
||||
# and those actions override the NoCare.) Consequently, we have to put up
|
||||
# with the "using independent target" warnings for these older Jam versions.
|
||||
NoCare $(<) ;
|
||||
if $(JAMVERSION) != 2.4 { Includes dumptargets : $(<) ; }
|
||||
|
||||
local i ;
|
||||
for i in $(<)
|
||||
{
|
||||
local s = [ Match ^([A-Za-z0-9_.-]+)$ : $(i) ] ;
|
||||
if $(s)
|
||||
{
|
||||
EmitPseudoTarget "$(DUMPTARGETS_FILE)" : $(i) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rule NotFile
|
||||
{
|
||||
PossiblePseudoTarget $(<) ;
|
||||
}
|
||||
|
||||
case II :
|
||||
|
||||
rule Application
|
||||
{
|
||||
PossiblePseudoTarget $(<) $(<)clean ;
|
||||
}
|
||||
|
||||
rule ShellScript
|
||||
{
|
||||
PossiblePseudoTarget $(<) $(<)clean ;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
172
mk/jam/flags.jam
Normal file
172
mk/jam/flags.jam
Normal file
@@ -0,0 +1,172 @@
|
||||
#============================================================================
|
||||
# Rules for specifying compiler and linker flags
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
## LinkWith target : libs
|
||||
## Link an application with libraries. The specified libraries should have
|
||||
## build rules in the same project. For external libraries use the
|
||||
## ExternalLibs rule. Specify the library names without any extensions or
|
||||
## the leading "lib".
|
||||
rule LinkWith
|
||||
{
|
||||
local rawlibs = [ ResolveLibs $(>) ] ;
|
||||
|
||||
if ( $($(<)_TYPE) = library ) && ( "$($(<)_SHARED)" = "" )
|
||||
{
|
||||
# LibDepends for shared libs invokes LinkWith, so prevent recursion
|
||||
LibDepends $(<) : $(rawlibs) ;
|
||||
}
|
||||
|
||||
local i libs ;
|
||||
for i in $(rawlibs)
|
||||
{
|
||||
libs += [ ConstructLibraryLinkTarget $(i) : $($(i)_SHARED) ] ;
|
||||
}
|
||||
|
||||
Depends $($(<)_TARGET) : $(libs) ;
|
||||
NEEDLIBS on $($(<)_TARGET) += $(libs) ;
|
||||
$(<).NEEDLIBS += $(rawlibs) ;
|
||||
|
||||
LFlags $(<) : $($($(rawlibs).EXTERNALLIBS).LFLAGS) ;
|
||||
}
|
||||
|
||||
## CFlags target : flags [ : options ]
|
||||
## Sets cflags on all sourcefiles of a library, plugin or application target
|
||||
## This rule affects c++ and c compiler flags.
|
||||
rule CFlags
|
||||
{
|
||||
CheckOptions nostatic : $(3) : $(<) ;
|
||||
|
||||
CCFLAGS on $($(<)_OBJECTS) += $(>) ;
|
||||
C++FLAGS on $($(<)_OBJECTS) += $(>) ;
|
||||
|
||||
UnitTestCFlags $(<) : $(>) : $(3) ;
|
||||
}
|
||||
|
||||
## MergeLFlags flags1 : flags2
|
||||
## Merge two arrays of linker flags. Removes duplicate entries, however,
|
||||
## ensures that the correct relative right-to-left order of both flag arrays
|
||||
## is kept.
|
||||
rule MergeLFlags
|
||||
{
|
||||
local result = ;
|
||||
local libs2 = $(2) ;
|
||||
for l in $(1)
|
||||
{
|
||||
if [ IsElem $(l) : $(libs2) ]
|
||||
{
|
||||
# If a flag from set 1 is in set 2, add all flags from start of set 2
|
||||
# to the occurance of the flag to result.
|
||||
while "$(libs2[1])" != "" && $(libs2[1]) != $(l)
|
||||
{
|
||||
result += $(libs2[1]) ;
|
||||
libs2 = $(libs2[2-]) ;
|
||||
}
|
||||
result += $(libs2[1]) ;
|
||||
libs2 = $(libs2[2-]) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
# Just add the flag.
|
||||
result += $(l) ;
|
||||
}
|
||||
}
|
||||
result += $(libs2) ;
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## LFlags target : flags [ : options ]
|
||||
## Sets linker flags for a library, plugin or application target
|
||||
rule LFlags
|
||||
{
|
||||
CheckOptions nostatic : $(3) : $(<) ;
|
||||
|
||||
NotFile $(>) ;
|
||||
NEEDLIBS on $($(<)_TARGET) += $(>) ;
|
||||
$(<).LFLAGS += $(>) ;
|
||||
|
||||
UnitTestLFlags $(<) : $(>) : $(3) ;
|
||||
}
|
||||
|
||||
## ExternalLibs target : identifiers
|
||||
## Specify a dependency between 'target' and the external libraries
|
||||
## indicated by 'identifiers'. If 'target' is an application or plugin,
|
||||
## then it is linked against the indicated external libraries. If 'target'
|
||||
## is a library, then its dependency upon 'identifiers' is noted, and
|
||||
## applications or plugins which link against 'target' will also be linked
|
||||
## against the libraries indicated by 'identifiers'. 'identifiers' is a
|
||||
## list of base names of a set of variables which provide build tool
|
||||
## information about each external library. In particular, assuming that
|
||||
## `ident' is one element of `identifiers', the value of $(ident).CFLAGS
|
||||
## should provide compiler flags needed for the external library indicated
|
||||
## by 'ident'; and $(ident).LFLAGS should provide linker flags for the
|
||||
## library.
|
||||
rule ExternalLibs
|
||||
{
|
||||
local extlib ;
|
||||
for extlib in $(>)
|
||||
{
|
||||
CFlags $(<) : $($(extlib).CFLAGS) ;
|
||||
LFlags $(<) : $($(extlib).LFLAGS) ;
|
||||
|
||||
$(<).EXTERNALLIBS += $(extlib) ;
|
||||
}
|
||||
}
|
||||
|
||||
## ExtraObjects target : objectfiles [ : options ]
|
||||
## Link additional object files with a target.
|
||||
## Options:
|
||||
## inheritcflags: The mentioned object files will inherit compiler flags
|
||||
## assigned to target's normal object files (in addition to any flags
|
||||
## already set manually).
|
||||
rule ExtraObjects
|
||||
{
|
||||
CheckOptions inheritcflags : $(3) : $(<) ;
|
||||
if [ IsElem inheritcflags : $(3) ]
|
||||
{
|
||||
$(<)_OBJECTS += $(>) ;
|
||||
}
|
||||
EXTRAOBJECTS on $($(<)_TARGET) += $(>) ;
|
||||
Depends $($(<)_TARGET) : $(>) ;
|
||||
Clean $(<)clean : $(>) ;
|
||||
Clean clean : $(>) ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private part
|
||||
|
||||
## ResolveLibs libs
|
||||
## Given a list of libraries, augment the list by adding other libraries
|
||||
## upon which the given libraries depend. Dependencies between libraries
|
||||
## are specified via LibDepends (or LinkWith when the target is a library).
|
||||
## The returned list is ordered such that it is suitable for Unix linkers
|
||||
## which are sensitive to the order of libraries in the invocation
|
||||
## statement.
|
||||
rule ResolveLibs
|
||||
{
|
||||
local i libs ;
|
||||
for i in $(<)
|
||||
{
|
||||
libs += $(i) $($(i)_depends) ;
|
||||
}
|
||||
# We must eliminate the duplicates in reverse order in order to ensure that
|
||||
# we do not destroy the overall library ordering since Unix linkers are
|
||||
# order-sensitive.
|
||||
return [ Reverse [ RemoveDups [ Reverse $(libs) ] ] ] ;
|
||||
}
|
||||
61
mk/jam/groups.jam
Normal file
61
mk/jam/groups.jam
Normal file
@@ -0,0 +1,61 @@
|
||||
#============================================================================
|
||||
# Rules for building compile groups
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
COMPILE_GROUPS = ;
|
||||
|
||||
## CompileGroups target : groups
|
||||
## Adds a target to a list of compile groups. A compile group is a virtual
|
||||
## target which combines several targets. This is useful for things like a
|
||||
## creating a target which compiles all image loaders, all renderers, etc.
|
||||
rule CompileGroups
|
||||
{
|
||||
local _i ;
|
||||
|
||||
for _i in $(>)
|
||||
{
|
||||
Depends $(_i) : $(<) ;
|
||||
Depends $(_i)clean : $(<)clean ;
|
||||
|
||||
if ! [ IsElem $(_i) : $(COMPILE_GROUPS) ]
|
||||
{
|
||||
NotFile $(_i) ;
|
||||
Echo "Warning: $(_i) not registered via RegisterCompileGroups" ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
## RegisterCompileGroups
|
||||
## Registers compile groups. You must specify all compile groups here before
|
||||
## can use them.
|
||||
rule RegisterCompileGroups
|
||||
{
|
||||
NotFile $(<) ;
|
||||
COMPILE_GROUPS += $(<) ;
|
||||
|
||||
local i ;
|
||||
for i in $(<)
|
||||
{
|
||||
local desc = [ Description $(i) ] ;
|
||||
if $(desc)
|
||||
{
|
||||
Help $(i) : "Build the $(desc)" ;
|
||||
}
|
||||
}
|
||||
}
|
||||
85
mk/jam/help.jam
Normal file
85
mk/jam/help.jam
Normal file
@@ -0,0 +1,85 @@
|
||||
#============================================================================
|
||||
# Rules for collecting and emitting descriptions about targets
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
## Description target [ : description ]
|
||||
## Provides access to the description of 'target'. The description may be
|
||||
## used by other rules, such as those which generate project files, or which
|
||||
## present informative messages to the user regarding 'target'. If invoked
|
||||
## with two arguments, then it sets the description of 'target'. If invoked
|
||||
## with one argument, then it returns the description of 'target'. You
|
||||
## should invoke this rule to set the description before invoking other
|
||||
## rules which might need access to target's description, such as the
|
||||
## Application, Library, and Plugin rules. As a convenience, several generic
|
||||
## rules, such as Application, Library, and Plugin will automatically invoke
|
||||
## the Help rule for 'target' using the provided 'description'.
|
||||
rule Description
|
||||
{
|
||||
local desc = $(>) ;
|
||||
if $(desc)
|
||||
{
|
||||
$(<)_description = $(desc) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
desc = $($(<)_description) ;
|
||||
}
|
||||
return $(desc) ;
|
||||
}
|
||||
|
||||
|
||||
## Help target : description
|
||||
## Specify the 'description' to emit for 'target' when the user invokes "jam
|
||||
## help".
|
||||
rule Help
|
||||
{
|
||||
local target = $(<) ;
|
||||
local desc = $(>) ;
|
||||
|
||||
if ! $(target) { target = "" ; }
|
||||
if ! $(desc) { desc = "" ; }
|
||||
|
||||
# target width:20, description width:54
|
||||
local target_pad = " " ;
|
||||
local target_pat = "...................." ;
|
||||
local desc_pad = " " ;
|
||||
local desc_pat = "......................................................" ;
|
||||
|
||||
local m = Match ; # Indirect invocation allows variables in pattern regex.
|
||||
local target_str = [ $(m) "($(target_pat)).*" : "$(target)$(target_pad)" ] ;
|
||||
local desc_str = [ $(m) "($(desc_pat)).*" : "$(desc)$(desc_pad)" ] ;
|
||||
local help = "jam $(target_str) $(desc_str)" ;
|
||||
|
||||
target = $(target:G=help) ;
|
||||
Depends help : $(target) ;
|
||||
NotFile $(help) ;
|
||||
PrintHelp $(target) : $(help) ;
|
||||
Always $(target) ;
|
||||
NotFile $(target) ;
|
||||
}
|
||||
|
||||
actions quietly PrintHelp
|
||||
{
|
||||
echo "$(>)"
|
||||
}
|
||||
|
||||
NotFile help ;
|
||||
Always help ;
|
||||
Help all : "Build the entire project" ;
|
||||
594
mk/jam/helper.jam
Normal file
594
mk/jam/helper.jam
Normal file
@@ -0,0 +1,594 @@
|
||||
#============================================================================
|
||||
# Helper rules
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
SED ?= sed ;
|
||||
DEEPCOPY ?= "cp -R" ;
|
||||
DELTREE ?= "rm -rf" ;
|
||||
|
||||
# The -f option to `cp' is not supported on older platforms.
|
||||
# The convolution of the conditional arises because CP is defined in Jambase as
|
||||
# two tokens rather than a single string, so we must check the tokens
|
||||
# individually; yet we also check it as a simple string for future robustness.
|
||||
if $(CP) = "cp -f" || $(CP[1]) = "cp" && $(CP[2]) = "-f"
|
||||
{
|
||||
CP = cp ;
|
||||
}
|
||||
|
||||
## IncludeDir [ dir [ : target [ : options ]]]
|
||||
## Specify the location of a directory containing header files for a target,
|
||||
## or for the whole project if no target is given. "dir" is a list of
|
||||
## components composing the path. This rule will automatically generate the
|
||||
## -I compiler flags and makes sure the dependency scanner is able to locate
|
||||
## your header files. "dir" is assumed to be relative to the current
|
||||
## subdirectory specified with the SubDir rule unless the "literal"
|
||||
## option is given, in which case "dir" is used literally. If "dir" is
|
||||
## omitted, then the current subdirectory specified with SubDir is used as
|
||||
## the header directory. An omitted "dir" and the "literal" option are
|
||||
## mutually exclusive. You may invoke this rule multiple times to specify
|
||||
## any number of header file directories.
|
||||
## Options:
|
||||
## literal: "dir" is to be used literally without any interpretation.
|
||||
## transient: "dir" is to be used at build-time only; and should not be
|
||||
## recorded in any generated resources, such as project files.
|
||||
##
|
||||
## Implementation: The directory is simply added to the HDRS variable which
|
||||
## is respected by all Jam rules.
|
||||
rule IncludeDir
|
||||
{
|
||||
local dir = $(1) ;
|
||||
local target = $(2) ;
|
||||
local options = $(3) ;
|
||||
|
||||
CheckOptions literal transient : $(options) : $(dir) ;
|
||||
if ! $(dir)
|
||||
{
|
||||
dir = $(SUBDIR) ;
|
||||
}
|
||||
else if ! [ IsElem literal : $(options) ]
|
||||
{
|
||||
dir = $(SUBDIR) $(dir) ;
|
||||
}
|
||||
dir = [ ConcatDirs $(dir) ] ;
|
||||
|
||||
if $(target)
|
||||
{
|
||||
local o ;
|
||||
for o in $($(target)_OBJECTS)
|
||||
{
|
||||
CCHDRS on $(o) += [ FIncludes $(dir) ] ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HDRS += $(dir) ;
|
||||
}
|
||||
}
|
||||
|
||||
## Wildcard [ dir : ] patterns
|
||||
## Create a list of files in a directory which match the pattern. You can
|
||||
## optionally specify a subdirectory. The files will be returned with
|
||||
## stripped pathnames. The difference from GLOB is that this rule respects
|
||||
## subdirectories which may have been entered with the SubDir rule.
|
||||
rule Wildcard
|
||||
{
|
||||
local files dir sdir wildcards ;
|
||||
|
||||
# Is a directory given?
|
||||
if $(>)
|
||||
{
|
||||
dir = $(<)/ ;
|
||||
sdir = [ ConcatDirs $(<) ] ;
|
||||
wildcards = $(>) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
dir = "" ;
|
||||
sdir = "" ;
|
||||
wildcards = $(<) ;
|
||||
}
|
||||
|
||||
files = [ GLOB [ ConcatDirs $(SUBDIR) $(dir) ] : $(wildcards) ] ;
|
||||
|
||||
return $(files:BSR=$(sdir)) ;
|
||||
}
|
||||
|
||||
## Recurse [ rule ] : types [ : prefix ]
|
||||
## Recursively scan current directory, $(SUBDIR), for files matching 'types'
|
||||
## and invoke 'rule' for each file which matches one of the 'types'.
|
||||
## 'types' is a list of file extensions (with the leading dot). 'rule' will
|
||||
## be invoked with two arguments: (1) the basename of the file including the
|
||||
## extension, (2) a list of the path components from the current directory
|
||||
## to the file's directory. When 'rule' is invoked, it will see a $(SUBDIR)
|
||||
## value of the directory containing the file (as if the rule had been
|
||||
## invoked from within the file's directory). 'prefix' is an optional list
|
||||
## of path components which will be prepended to rule's second argument.
|
||||
## Returns the list of visited files. It is legal to omit 'rule', if you
|
||||
## are interested only in obtaining the list of files matching 'types'.
|
||||
rule Recurse
|
||||
{
|
||||
local innerrule = $(1) ;
|
||||
local types = $(2) ;
|
||||
local prefix = $(3) ;
|
||||
local files = [ GLOB $(SUBDIR) : * ] ;
|
||||
local visited ;
|
||||
|
||||
local i ;
|
||||
for i in $(files)
|
||||
{
|
||||
if [ IsElem $(i:S) : $(types) ]
|
||||
{
|
||||
visited += [ FDirName $(prefix) $(i:BS) ] ;
|
||||
if $(innerrule)
|
||||
{
|
||||
$(innerrule) $(i:BS) : $(prefix) ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ! [ IsElem $(i:BS) : $(DOT) $(DOTDOT) ]
|
||||
{
|
||||
local SUBDIR = $(i) ; # Called rules see this new temporary value.
|
||||
visited += [ Recurse $(innerrule) : $(types) : $(prefix) $(i:BS) ] ;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $(visited) ;
|
||||
}
|
||||
|
||||
## ResponseFile file : [ items [ : options [ : directory [ : delim ]]]]
|
||||
## Jam places a fairly restrictive limit on the length of the command string
|
||||
## emitted by an 'actions' block. If the limit is exceeded, Jam rudely
|
||||
## aborts. This problem is easily triggered when actions are invoked
|
||||
## 'together' but not 'piecemeal'; especially when the command arguments
|
||||
## involve many lengthy pathnames. To work around this type of problem,
|
||||
## some tools allow the client to furnish a file containing information
|
||||
## which would otherwise be specified via the command-line. This is often
|
||||
## called a "response file". The ResponseFile rule can be used to create a
|
||||
## response file named 'file' in 'directory' containing 'items', one per
|
||||
## line. As a convenience, if 'directory' is not specified, and if the
|
||||
## MakeLocate rule has not already been invoked for 'file' or LOCATE has not
|
||||
## been set for 'file', then the file is placed in $(LOCATE_TARGET). If
|
||||
## there is a possibility that the same 'file' name might be used in other
|
||||
## contexts, be sure to grist it appropriately to avoid conflicts. This
|
||||
## rule assumes that 'items' contains bound entries unless the "notfile"
|
||||
## option is specified, in which case the NotFile rule is automatically
|
||||
## invoked for each item. This rule may be invoked multiple times for the
|
||||
## same 'file' in order to populate the file incrementally. As an internal
|
||||
## optimization to keep performance relatively sane, ResponseFile
|
||||
## temporarily inserts 'delim' between 'items' when emitting them, and then
|
||||
## substitutes newline for 'delim' just before writing the items to
|
||||
## 'file'. 'delim' must be a one-character string. If not specified, "@" is
|
||||
## used. If "@" is likely to appear in 'items', then choose a different
|
||||
## character for 'delim'; one which is known to not appear in 'items'. The
|
||||
## rule returns 'file' to make it convenient to daisy-chain with invocations
|
||||
## of other rules, such as RmTemps, Depends, or Always.
|
||||
## Options:
|
||||
## notfile: Invoke NotFile for each item automatically; otherwise, assume
|
||||
## that each item is a bound file.
|
||||
rule ResponseFile
|
||||
{
|
||||
local file = $(1) ;
|
||||
local items = $(2) ;
|
||||
local options = $(3) ;
|
||||
local dir = $(4) ;
|
||||
local delim = $(5) ;
|
||||
|
||||
CheckOptions notfile : $(options) : $(file) ;
|
||||
|
||||
if ! $(delim) { delim = "@" ; }
|
||||
DELIM on $(file) = $(delim) ;
|
||||
|
||||
local firsttime = no ;
|
||||
if ! [ IsElem $(file) : $(RESPONSE_FILE_REGISTRY) ]
|
||||
{
|
||||
firsttime = yes ;
|
||||
RESPONSE_FILE_REGISTRY += $(file) ;
|
||||
}
|
||||
|
||||
if ! $(items) && $(firsttime) = yes
|
||||
{
|
||||
items = "" ; # Force file creation even if list is empty.
|
||||
options += notfile ;
|
||||
}
|
||||
|
||||
if [ IsElem notfile : $(options) ] && $(items)
|
||||
{
|
||||
NotFile $(items) ;
|
||||
}
|
||||
|
||||
if $(dir)
|
||||
{
|
||||
MakeLocate $(file) : $(dir) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
local target_dir = [ on $(file) GetVar LOCATE ] ;
|
||||
if ! $(target_dir)
|
||||
{
|
||||
MakeLocate $(file) : $(LOCATE_TARGET) ;
|
||||
}
|
||||
}
|
||||
|
||||
local i ;
|
||||
for i in $(items)
|
||||
{
|
||||
if $(firsttime) = yes
|
||||
{
|
||||
ResponseFile1 $(file) : $(i) ;
|
||||
firsttime = no ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ResponseFile2 $(file) : $(i) ;
|
||||
}
|
||||
}
|
||||
|
||||
return $(file) ;
|
||||
}
|
||||
|
||||
actions ResponseFile1
|
||||
{
|
||||
echo '$(>)' > $(<)
|
||||
}
|
||||
|
||||
actions piecemeal together quietly ResponseFile2
|
||||
{
|
||||
echo '$(>)$(DELIM)' | $(SED) 's/$(DELIM) /$(DELIM)/g' | tr '$(DELIM)' '
|
||||
' >> $(<)
|
||||
}
|
||||
|
||||
## Sort list
|
||||
## Given a list of items, returns a list containing the items sorted
|
||||
## alphabetically.
|
||||
rule Sort
|
||||
{
|
||||
local i sorted ;
|
||||
for i in $(<)
|
||||
{
|
||||
local inserted = no ;
|
||||
local j accum ;
|
||||
for j in $(sorted)
|
||||
{
|
||||
if $(inserted) != yes && $(i:L) < $(j:L)
|
||||
{
|
||||
accum += $(i) ;
|
||||
inserted = yes ;
|
||||
}
|
||||
accum += $(j) ;
|
||||
}
|
||||
if $(inserted) != yes
|
||||
{
|
||||
accum += $(i) ;
|
||||
}
|
||||
sorted = $(accum) ;
|
||||
}
|
||||
return $(sorted) ;
|
||||
}
|
||||
|
||||
## StripCommon list1 : list2
|
||||
## Strips from the beginning of list1 the items which it has in common with
|
||||
## the beginning of list2 and returns what remains of list1.
|
||||
rule StripCommon
|
||||
{
|
||||
local l = $(<) ;
|
||||
local r = $(>) ;
|
||||
FStripCommon l : r ;
|
||||
return $(l) ;
|
||||
}
|
||||
|
||||
## MasterHeader header [ : files [ : pre-boilerplate [ : post-boilerplate
|
||||
## [ : options ]]]]
|
||||
## Given a list of 'files', construct a 'header' file which #includes those
|
||||
## files. If 'header' does not already have a suffix, ".h" will be
|
||||
## appended. The generated header will be emitted to $(LOCATE_TARGET), and
|
||||
## will be protected against multiple-inclusion via the standard
|
||||
## #ifndef __HEADER_H__ / #define / #endif mechanism. If provided,
|
||||
## 'pre-boilerplate' will be inserted verbatim immediately after the opening
|
||||
## multiple-inclusion protection, but before the first #include. Likewise,
|
||||
## 'post-boilerplate' will be inserted verbatim after the last #include, but
|
||||
## before the closing multiple-inclusion protection. If the boilerplate
|
||||
## arguments are lists, the items will be emitted one per line. 'files'
|
||||
## is sorted before the #include statements are generated, unless the
|
||||
## "nosort" option is given. For convenience, the gristed 'header' is
|
||||
## returned. Also sets up the following pseudo-targets:
|
||||
##
|
||||
## masterheaders: Synthesize all requested master headers.
|
||||
## cleanmasterheaders: Delete synthesized files.
|
||||
## freezemasterheaders: Copy synthesized files to back into the source
|
||||
## tree at $(SUBDIR).
|
||||
##
|
||||
## Options:
|
||||
## nosort: Do not sort 'files'.
|
||||
rule MasterHeader
|
||||
{
|
||||
local header = [ FAppendSuffix $(1) : .h ] ;
|
||||
local files = $(2) ;
|
||||
local boilerpre = $(3) ;
|
||||
local boilerpost = $(4) ;
|
||||
local options = $(5) ;
|
||||
local target = $(header:G=masterheader) ;
|
||||
local protect = "__$(header:US=)_H__" ;
|
||||
|
||||
CheckOptions nosort : $(options) : $(header) ;
|
||||
if ! [ IsElem nosort : $(options) ]
|
||||
{
|
||||
files = [ Sort $(files) ] ;
|
||||
}
|
||||
|
||||
Always $(target) ;
|
||||
ResponseFile $(target) :
|
||||
"/* $(header) -- Generated automatically; do not edit. */"
|
||||
"#ifndef $(protect)"
|
||||
"#define $(protect)"
|
||||
$(boilerpre)
|
||||
"#include \"$(files)\""
|
||||
$(boilerpost)
|
||||
"#endif /* $(protect) */"
|
||||
: notfile ;
|
||||
Depends masterheaders : $(target) ;
|
||||
Clean cleanmasterheaders : $(target) ;
|
||||
Clean clean : cleanmasterheaders ;
|
||||
|
||||
local frozen = $(target:G=frozenmasterheader) ;
|
||||
MakeLocate $(frozen) : $(SUBDIR) ;
|
||||
Depends $(frozen) : $(target) ;
|
||||
Copy $(frozen) : $(target) ;
|
||||
Depends freezemasterheaders : $(frozen) ;
|
||||
|
||||
if $(MASTER_HEADER_GLOBAL_TARGETS) != yes
|
||||
{
|
||||
MASTER_HEADER_GLOBAL_TARGETS = yes ;
|
||||
|
||||
Always masterheaders ;
|
||||
NotFile masterheaders ;
|
||||
Help masterheaders : "Generate master header files" ;
|
||||
|
||||
Always freezemasterheaders ;
|
||||
NotFile freezemasterheaders ;
|
||||
Help freezemasterheaders :
|
||||
"Copy generated master headers to source tree" ;
|
||||
}
|
||||
|
||||
return $(target) ;
|
||||
}
|
||||
|
||||
## DirectoryMasterHeaders dirs [ : pre-boilerplate [ : post-boilerplate
|
||||
## [ : options [ : rejects ]]]]
|
||||
## A convenience wrapper around MasterHeader which generates a set of master
|
||||
## header files for each directory in 'dirs', which are assumed to be
|
||||
## subdirectories of the current directory. For each item in 'dirs', the
|
||||
## subdirectory is recursively scanned for files, and MasterHeader is
|
||||
## invoked with the gleaned file list. The generated header for a directory
|
||||
## is emitted to the current directory; not within the subdirectory. The
|
||||
## optional 'rejects' is a list of header files which should not be emitted
|
||||
## to the synthesized master headers. 'pre-boilerplate',
|
||||
## 'post-boilerplate', and 'options' carry the same interpretation as for
|
||||
## MasterHeader.
|
||||
rule DirectoryMasterHeaders
|
||||
{
|
||||
local dirs = $(1) ;
|
||||
local boilerpre = $(2) ;
|
||||
local boilerpost = $(3) ;
|
||||
local options = $(4) ;
|
||||
local rejects = $(5) ;
|
||||
local masters ;
|
||||
local d ;
|
||||
for d in $(dirs)
|
||||
{
|
||||
local files ;
|
||||
{
|
||||
local SUBDIR = [ ConcatDirs $(SUBDIR) $(d) ] ; # Recurse from here...
|
||||
files = [ Recurse : .h : $(d) ] ;
|
||||
}
|
||||
if $(rejects)
|
||||
{
|
||||
files = [ Filter $(files) : $(rejects) ] ;
|
||||
}
|
||||
masters += [ MasterHeader $(d) : $(files) : $(boilerpre) : $(boilerpost) :
|
||||
$(options) ] ;
|
||||
}
|
||||
return $(masters) ;
|
||||
}
|
||||
|
||||
## Prefix list : prefix
|
||||
## Adds a prefix to a all elements in list.
|
||||
rule Prefix
|
||||
{
|
||||
return $(>)$(<) ;
|
||||
}
|
||||
|
||||
if $(JAMVERSION) >= 2.5
|
||||
{
|
||||
|
||||
## IsElem element : list
|
||||
## Returns "true" if the element is in the list. Otherwise nothing is
|
||||
## returned.
|
||||
rule IsElem
|
||||
{
|
||||
local i ;
|
||||
|
||||
for i in $(>)
|
||||
{
|
||||
if $(i) = $(<)
|
||||
{
|
||||
return "true" ;
|
||||
}
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
# Jam <2.4's return statement doesn't exit the function
|
||||
rule IsElem
|
||||
{
|
||||
local i result ;
|
||||
|
||||
for i in $(>)
|
||||
{
|
||||
if $(i) = $(<)
|
||||
{
|
||||
result = "true" ;
|
||||
$(>) = ;
|
||||
}
|
||||
}
|
||||
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
## Filter list : filter
|
||||
## Returns the list without the words contained in filter.
|
||||
rule Filter
|
||||
{
|
||||
local i result ;
|
||||
|
||||
for i in $(<)
|
||||
{
|
||||
if ! [ IsElem $(i) : $(>) ]
|
||||
{
|
||||
result += $(i) ;
|
||||
}
|
||||
}
|
||||
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## RemoveDups list
|
||||
## Removes duplicates in the list (this function tries to preserve the list
|
||||
## order)
|
||||
rule RemoveDups
|
||||
{
|
||||
local i result ;
|
||||
|
||||
for i in $(<)
|
||||
{
|
||||
if ! [ IsElem $(i) : $(result) ]
|
||||
{
|
||||
result += $(i) ;
|
||||
}
|
||||
}
|
||||
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## Reverse list
|
||||
## Reverse the order of items in the list.
|
||||
rule Reverse
|
||||
{
|
||||
local result ;
|
||||
|
||||
for i in $(<)
|
||||
{
|
||||
result = $(i) $(result) ;
|
||||
}
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## GetVar argument
|
||||
## Simply returns the value of the variable with name argument.
|
||||
## This is useful to query on target variables:
|
||||
## bla = [ on TARGET GetVar CFlags ] ;
|
||||
rule GetVar
|
||||
{
|
||||
return $($(<)) ;
|
||||
}
|
||||
|
||||
## ConcatDirs dirs
|
||||
## Concatenates a set of directories. This is a substitute for FDirName in
|
||||
## Jambase. It works also correctly for several rooted paths, where FDirName
|
||||
## fails.
|
||||
## The advantage over $(dir1)/$(dir2) is that this also works correctly if
|
||||
## $(dir1) or $(dir2) is not set.
|
||||
rule ConcatDirs
|
||||
{
|
||||
local i ;
|
||||
local result = $(<[1]) ;
|
||||
if ! $(result) { $result = "" ; }
|
||||
local dir1 dir2 ;
|
||||
|
||||
for i in $(<[2-])
|
||||
{
|
||||
# eleminate multiple slashes because jam is somewhat buggy here
|
||||
dir1 = [ MATCH (.*[^/]?) : $(result) ] ;
|
||||
dir2 = [ MATCH ([^/].*) : $(i) ] ;
|
||||
if ! $(dir1) { dir1 = "" ; }
|
||||
if $(dir1) != "" { dir1 = $(dir1)/ ; }
|
||||
if ! $(dir2) { dir2 = "" ; }
|
||||
result = $(dir1)$(dir2) ;
|
||||
}
|
||||
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## SplitToList var [ : separator ]
|
||||
## Splits the value of var into a list using space as the separator unless
|
||||
## an alterante separator is specified.
|
||||
## IMPLEMENTATION NOTE
|
||||
## When Jam sees an invocation of the `Match' function, it treats its first
|
||||
## argument as a literal regular expression, and does not do any variable
|
||||
## interpolation. This means that an expression, such as "(.*)$(sep)(.*)"
|
||||
## will not be interpreted as expected; it will instead be interpreted as an
|
||||
## invalid regex. To work around this limitation, we invoke `Match'
|
||||
## indirectly.
|
||||
rule SplitToList
|
||||
{
|
||||
local list = ;
|
||||
local matcher = Match ; # See IMPLEMENTATION NOTE above.
|
||||
local unsplit = $(<) ;
|
||||
local sep = $(2) ;
|
||||
if ! $(sep) { sep = " " ; }
|
||||
while $(unsplit) != ""
|
||||
{
|
||||
local split = [ $(matcher) "(.*)$(sep)(.*)" : $(unsplit) ] ;
|
||||
if $(split[1]) = ""
|
||||
{
|
||||
list += $(unsplit) ;
|
||||
unsplit = "" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
list += $(split[2]) ;
|
||||
unsplit = $(split[1]) ;
|
||||
}
|
||||
}
|
||||
|
||||
return [ Reverse $(list) ] ;
|
||||
}
|
||||
|
||||
## Copy target : source
|
||||
## Copy source to target.
|
||||
actions Copy
|
||||
{
|
||||
$(RM) $(<)
|
||||
$(CP) $(>) $(<)
|
||||
}
|
||||
|
||||
## Move target : source
|
||||
## Move (or rename) source to target.
|
||||
actions ignore Move
|
||||
{
|
||||
$(MV) $(>) $(<)
|
||||
}
|
||||
213
mk/jam/install.jam
Normal file
213
mk/jam/install.jam
Normal file
@@ -0,0 +1,213 @@
|
||||
#============================================================================
|
||||
# Rules for installation
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
INSTALL ?= "install" ;
|
||||
INSTALL_PROGRAM ?= $(INSTALL) ;
|
||||
INSTALL_DATA ?= "$(INSTALL) -m 644" ;
|
||||
|
||||
# set some paths
|
||||
appdatadir ?= [ ConcatDirs $(datadir) $(PACKAGE_NAME) ] ;
|
||||
appdocdir ?= [ ConcatDirs $(datadir) doc $(PACKAGE_NAME)-$(PACKAGE_VERSION) ] ;
|
||||
appconfdir ?= [ ConcatDirs $(sysconfdir) $(PACKAGE_NAME) ] ;
|
||||
appincdir ?= [ ConcatDirs $(includedir) $(PACKAGE_NAME) ] ;
|
||||
plugindir ?= [ ConcatDirs $(libdir) $(PACKAGE_NAME) ] ;
|
||||
|
||||
rule GristInstall
|
||||
{
|
||||
local i, files ;
|
||||
for i in $(<)
|
||||
{
|
||||
if $(i:G) { files += $(i) ; }
|
||||
else { files += $(i:G=$(SUBDIR)) ; }
|
||||
}
|
||||
return $(files) ;
|
||||
}
|
||||
|
||||
## InstallHeader headername [ : subdir ]
|
||||
## DoInstall a header file into the includedir directory. A subdirectory
|
||||
## relative to the includedir can be specified.
|
||||
rule InstallHeader
|
||||
{
|
||||
local files = [ GristInstall $(<) ] ;
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
Depends install_include : [ DoInstall $(files) : $(appincdir) $(2) ] ;
|
||||
}
|
||||
|
||||
## InstallData files [ : subdir ]
|
||||
## Installs data files
|
||||
rule InstallData
|
||||
{
|
||||
local files = [ GristInstall $(<) ] ;
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
Depends install_data : [ DoInstall $(files) : $(appdatadir) $(2) ] ;
|
||||
}
|
||||
|
||||
## InstallConfig files [ : subdir ]
|
||||
## Installs configuration files
|
||||
rule InstallConfig
|
||||
{
|
||||
local files = [ GristInstall $(<) ] ;
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
Depends install_config : [ DoInstall $(files) : $(appconfdir) $(2) ] ;
|
||||
}
|
||||
|
||||
## InstallDoc files [ : subdir ]
|
||||
## Installs documentation files
|
||||
rule InstallDoc
|
||||
{
|
||||
local files = [ GristInstall $(<) ] ;
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
Depends install_doc : [ DoInstall $(files) : $(appdocdir) $(2) ] ;
|
||||
}
|
||||
|
||||
## InstallMan files
|
||||
## Installs Unix manual files
|
||||
rule InstallMan
|
||||
{
|
||||
local files = [ GristInstall $(<) ] ;
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
|
||||
local i ;
|
||||
for i in $(files)
|
||||
{
|
||||
local dir = $(mandir) ;
|
||||
switch $(i:S)
|
||||
{
|
||||
case .1 : dir += man1 ;
|
||||
case .2 : dir += man2 ;
|
||||
case .3 : dir += man3 ;
|
||||
case .4 : dir += man4 ;
|
||||
case .5 : dir += man5 ;
|
||||
case .6 : dir += man6 ;
|
||||
case .7 : dir += man7 ;
|
||||
case .8 : dir += man8 ;
|
||||
case .9 : dir += man9 ;
|
||||
case * :
|
||||
echo "WARNING: manfile has no *.[0-9] ending." ;
|
||||
}
|
||||
Depends install_man : [ DoInstall $(i) : $(dir) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
## InstallProgram files [ : directories ]
|
||||
## Installs program files (executable or shell script). This is a
|
||||
## convenience wrapper for DoInstall when the resources to be installed is
|
||||
## of an invocable nature. It sets SEARCH on `files', and uses
|
||||
## $(INSTALL_PROGRAM) to perform the actual installation. Unlike
|
||||
## SystemInstallApplication, it does not assume that all such targets should
|
||||
## be installed into $(bindir); instead, you can provide `directories' to
|
||||
## specify the installation location. If `directories' is not given, then
|
||||
## $(bindir) is assumed. Also, unlike SystemInstallApplication, this rule
|
||||
## does not have any platform-specific knowledge (such as how to install a
|
||||
## Cocoa application wrapper on MacOS/X). Always use
|
||||
## SystemInstallApplication for installation of full-fledged applications. A
|
||||
## typical use for InstallProgram would be to install an already-existing
|
||||
## shell script. This differs from the ShellScript rule which both creates a
|
||||
## shell script from scratch at build time, and arranges for it to be
|
||||
## installed. Like DoInstall, this rule returns the names of the installed
|
||||
## targets, so it is convenient to use the results as the input for another
|
||||
## rule, such as Depends.
|
||||
rule InstallProgram
|
||||
{
|
||||
local files = [ GristInstall $(1) ] ;
|
||||
local dir = $(2) ;
|
||||
if ! $(dir) { dir = $(bindir) ; }
|
||||
SEARCH on $(files) = $(SUBDIR) ;
|
||||
return [ DoInstall $(files) : $(dir) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
## DoInstall sourcenames : directories [ : installapp : [ postinstallrules ]]
|
||||
## Creates a new install target for the given sources named by
|
||||
## `sourcenames'. `directories' is a list of directory components
|
||||
## indicating the installation directory for `sourcename'. `installapp' is
|
||||
## the actual program to run to install the sources. If not specified, then
|
||||
## $(INSTALL_DATA) is used. If the optional `postinstallrules' is provided,
|
||||
## it is a list of Jam rules to invoke on the installed target after it is
|
||||
## installed. Each rule is invoked with the installed target as the first
|
||||
## argument, and the source target as the second. An obvious instance where
|
||||
## `postinstallrules' proves useful is when the Ranlib rule should be
|
||||
## invoked on just-installed static library (.a) files. The DoInstall rule
|
||||
## returns the names of the installed targets, so it is convenient to use
|
||||
## the results as the input for another rule. For example:
|
||||
## Depends install : [ DoInstall $(docfiles) : $(installdocdir) ] ;
|
||||
## (Implementation Note: We did not name this rule Install, because Jambase
|
||||
## already defines an action named Install :-/)
|
||||
rule DoInstall
|
||||
{
|
||||
local targets target i dir gdir ;
|
||||
dir = [ ConcatDirs $(DESTDIR) $(2) ] ;
|
||||
|
||||
gdir = $(dir:G=dir) ;
|
||||
MkDir $(gdir) ;
|
||||
|
||||
for i in $(1)
|
||||
{
|
||||
target = $(i:BSR=$(dir):G=install) ;
|
||||
targets += $(target) ;
|
||||
Depends $(target) : $(gdir) $(i) ;
|
||||
Install1 $(target) : $(i) ;
|
||||
|
||||
if "$(3)"
|
||||
{
|
||||
INSTALL_APP on $(target) = $(3) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
INSTALL_APP on $(target) = $(INSTALL_DATA) ;
|
||||
}
|
||||
|
||||
if "$(4)"
|
||||
{
|
||||
local postrule ;
|
||||
for postrule in $(4)
|
||||
{
|
||||
$(postrule) $(target) : $(i) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Always $(targets) ;
|
||||
return $(targets) ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
INSTALLTARGETS = install_bin install_plugin install_lib install_include
|
||||
install_data install_config install_doc ;
|
||||
|
||||
Always install $(INSTALLTARGETS) ;
|
||||
NotFile install $(INSTALLTARGETS) ;
|
||||
Depends install : $(INSTALLTARGETS) ;
|
||||
|
||||
if ! $(PACKAGE_INSTALL_NAME) { PACKAGE_INSTALL_NAME = $(PACKAGE_LONGNAME) ; }
|
||||
if ! $(PACKAGE_INSTALL_NAME) { PACKAGE_INSTALL_NAME = $(PACKAGE_NAME) ; }
|
||||
if ! $(PACKAGE_INSTALL_NAME) { PACKAGE_INSTALL_NAME = "the project" ; }
|
||||
Help install : "Install $(PACKAGE_INSTALL_NAME)" ;
|
||||
|
||||
actions Install1
|
||||
{
|
||||
$(INSTALL_APP) $(INSTALLFLAGS) $(>) $(<)
|
||||
}
|
||||
|
||||
actions CopyDirs
|
||||
{
|
||||
$(DEEPCOPY) $(>) $(<)
|
||||
}
|
||||
349
mk/jam/jamcompatibility.jam
Normal file
349
mk/jam/jamcompatibility.jam
Normal file
@@ -0,0 +1,349 @@
|
||||
#============================================================================
|
||||
# Several hacks to make the build compatible with certain old/broken jam
|
||||
# versions
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# BoostJam is evil: It is compatible to Jam 2.4 but has a version number 3.1,
|
||||
# we try to detect BoostJam with the ARGV extension.
|
||||
if $(ARGV[0])
|
||||
{
|
||||
# BoostJam hacks.
|
||||
JAMVERSION = 2.4 ;
|
||||
rule FIncludes
|
||||
{
|
||||
return -I$(<) ;
|
||||
}
|
||||
rule FDefines
|
||||
{
|
||||
return -D$(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(JAMVERSION) < 2.4
|
||||
{
|
||||
EXIT "Error: This buildsystem requires jam version 2.4 or later." ;
|
||||
}
|
||||
|
||||
# All scripts invoked by the build system expect a Bourne or compatible shell.
|
||||
# Reject C-shell and its variants (such as tcsh). Unfortunately, this is a bit
|
||||
# of an ugly hack. It would be nicer to perform this logic at the very end of
|
||||
# this file as a last-minute assertion. Unfortunately, however, it seems that
|
||||
# references to $(SHELL) in any of the included files get bound at the point
|
||||
# of reference, thus we need to perform this filtering as early as possible.
|
||||
# Furthermore, on Windows, if the MSYS installation path contains a space (such
|
||||
# as "c:\Program Files\msys"), the space will cause `actions' to fail which
|
||||
# employ $(SHELL) indirectly through some other variable. Therefore, handle
|
||||
# this case as well.
|
||||
if [ Match (csh) : $(SHELL) ] || $(SHELL[2])
|
||||
{
|
||||
SHELL = "/bin/sh" ;
|
||||
}
|
||||
|
||||
# Jam 2.4's SubDir rule had some problems and misses the useful SUBDIRRULES
|
||||
# extension. So we override it here with a better version (from jam 2.5rc3).
|
||||
# Likewise, 2.4 is missing FReverse and FStrip, which are needed by SubDir and
|
||||
# other custom rules we define.
|
||||
if $(JAMVERSION) = 2.4
|
||||
{
|
||||
|
||||
rule FReverse
|
||||
{
|
||||
# FReverse a1 a2 a3 ... ;
|
||||
# return ... a3 a2 a1 ;
|
||||
|
||||
if $(1) { return [ FReverse $(1[2-]) ] $(1[1]) ; }
|
||||
}
|
||||
|
||||
rule FStripCommon
|
||||
{
|
||||
# FStripCommon v1 : v2 ;
|
||||
|
||||
# Strip common initial elements of variables v1 and v2.
|
||||
# Modifies the variable values themselves.
|
||||
|
||||
if $($(<)[1]) && $($(<)[1]) = $($(>)[1])
|
||||
{
|
||||
$(<) = $($(<)[2-]) ;
|
||||
$(>) = $($(>)[2-]) ;
|
||||
FStripCommon $(<) : $(>) ;
|
||||
}
|
||||
}
|
||||
|
||||
rule SubDir
|
||||
{
|
||||
#
|
||||
# SubDir TOP d1 d2 ... ;
|
||||
#
|
||||
# Support for a project tree spanning multiple directories.
|
||||
#
|
||||
# SubDir declares a Jamfile's location in a project tree, setting
|
||||
# Jambase variables (SEARCH_SOURCE, LOCATE_TARGET) so that source
|
||||
# files can be found.
|
||||
#
|
||||
# TOP is a user-select variable name for root of the tree, and
|
||||
# d1 d2 ... are the directory elements that lead from the root
|
||||
# of the tree to the directory of the Jamfile.
|
||||
#
|
||||
# TOP can be set externally, but normally the first SubDir call
|
||||
# computes TOP as the path up from the current directory; the
|
||||
# path contains one ../ for each of d1 d2 ...
|
||||
#
|
||||
# SubDir reads once the project-specific rules file Jamrules
|
||||
# in the TOP directory, if present. This can be overridden
|
||||
# with the variable TOPRULES.
|
||||
#
|
||||
# SubDir supports multiple, overlaid project trees: SubDir
|
||||
# invocations with different TOPs can appear in the same Jamfile.
|
||||
# The location established by the first SubDir call is used set
|
||||
# the TOPs for the subsequent SubDir calls.
|
||||
#
|
||||
# SubDir's public variables:
|
||||
#
|
||||
# $(TOP) = path from CWD to root.
|
||||
# $(SUBDIR) = path from CWD to the directory SubDir names.
|
||||
# $(SUBDIR_TOKENS) = path from $(TOP) to $(SUBDIR) as dir names
|
||||
# $(SEARCH_SOURCE) = $(SUBDIR)
|
||||
# $(LOCATE_SOURCE) = $(ALL_LOCATE_TARGET) $(SUBDIR)
|
||||
# $(LOCATE_TARGET) = $(ALL_LOCATE_TARGET) $(SUBDIR)
|
||||
# $(SOURCE_GRIST) = $(SUBDIR_TOKENS) with !'s
|
||||
#
|
||||
|
||||
local _top = $(<[1]) ;
|
||||
local _tokens = $(<[2-]) ;
|
||||
|
||||
#
|
||||
# First time through sets up relative root and includes Jamrules.
|
||||
#
|
||||
|
||||
if ! $(_top)
|
||||
{
|
||||
Exit SubDir syntax error ;
|
||||
}
|
||||
|
||||
if ! $($(_top)-SET)
|
||||
{
|
||||
$(_top)-SET = true ;
|
||||
|
||||
# First time we've seen this TOP.
|
||||
# We'll initialize a number of internal variables:
|
||||
#
|
||||
# $(TOP-UP) = directories from ROOT to a common point
|
||||
# $(TOP-DOWN) = directories from common point to TOP
|
||||
# $(TOP-ROOT) = root directory for UP/DOWN -- normally CWD
|
||||
# $(SUBDIR_UP) = current value of $(TOP-UP)
|
||||
# $(SUBDIR_DOWN) = current value of $(TOP-DOWN)
|
||||
# $(SUBDIR_ROOT) = current value of $(TOP-ROOT)
|
||||
#
|
||||
|
||||
if $($(_top))
|
||||
{
|
||||
# TOP externally set.
|
||||
# We'll ignore the relative (UP/DOWN) path that
|
||||
# got us here, and instead remember the hard ROOT.
|
||||
|
||||
$(_top)-UP = ;
|
||||
$(_top)-DOWN = ;
|
||||
$(_top)-ROOT = $($(_top)) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
# TOP not preset.
|
||||
|
||||
# Establishing a new TOP. In the simplest case,
|
||||
# (SUBDIR_UP/SUBDIR_DOWN/SUBDIR_ROOT unset), it's
|
||||
# merely a certain number of directories down from
|
||||
# the current directory, and FSubDirPath will set
|
||||
# TOP to a path consisting of ../ for each of the
|
||||
# elements of _tokens, because that represents how
|
||||
# far below TOP the current directory sits.
|
||||
#
|
||||
# In the more complicated case, the starting directory
|
||||
# isn't the directory of jam's invocation but an
|
||||
# location established by previous SubDir call. The
|
||||
# starting directory is SUBDIR_UP directories up from
|
||||
# SUBDIR_ROOT, and then SUBDIR_DOWN directories down
|
||||
# from that. If SUBDIR_ROOT is not set, that means
|
||||
# SUBDIR_DOWN and SUBDIR_UP represent the path from
|
||||
# the directory of jam's invocation.
|
||||
#
|
||||
# In the most complicated case, the _tokens also
|
||||
# represents directories down, because TOP is being
|
||||
# estalished in a directory other than TOP's root.
|
||||
# Hopefully, _tokens and SUBDIR_DOWN represent the
|
||||
# same final directory, relative to the new TOP and
|
||||
# the previous SubDIr's TOP. To find the new TOP,
|
||||
# we have to chop off any common directories from
|
||||
# then ends of _tokens and SUBDIR_DOWN. To do so,
|
||||
# we reverse each of them, call FStripCommon to
|
||||
# remove the initial common elements, and then
|
||||
# reverse them again. After this process, if
|
||||
# both _tokens and SUBDIR_DOWN have elements, it
|
||||
# means the directory names estalished by the two
|
||||
# SubDir calls don't match, and a warning is issued.
|
||||
# All hell will likely break loose at this point,
|
||||
# since the whole SubDir scheme relies on the SubDir
|
||||
# calls accurately naming the current directory.
|
||||
|
||||
# Strip common trailing elements of _tokens and SUBDIR_DOWN.
|
||||
|
||||
_tokens = [ FReverse $(_tokens) ] ;
|
||||
SUBDIR_DOWN = [ FReverse $(SUBDIR_DOWN) ] ;
|
||||
FStripCommon _tokens : SUBDIR_DOWN ;
|
||||
SUBDIR_DOWN = [ FReverse $(SUBDIR_DOWN) ] ;
|
||||
_tokens = [ FReverse $(_tokens) ] ;
|
||||
|
||||
if $(SUBDIR_DOWN) && $(_tokens)
|
||||
{
|
||||
Echo Warning: SubDir $(<) misplaced! ;
|
||||
}
|
||||
|
||||
# We'll remember the relative (UP/DOWN) path that
|
||||
# got us here, plus any hard ROOT starting point
|
||||
# for the UP/DOWN. If TOP is never set externally,
|
||||
# ROOT will always be "" (directory of jam's invocation).
|
||||
|
||||
$(_top)-UP = $(SUBDIR_UP) $(_tokens) ;
|
||||
$(_top)-DOWN = $(SUBDIR_DOWN) ;
|
||||
$(_top)-ROOT = $(SUBDIR_ROOT:E="") ;
|
||||
$(_top) = [ FSubDirPath $(_top) ] ;
|
||||
}
|
||||
|
||||
# Set subdir vars for the inclusion of the Jamrules,
|
||||
# just in case they have SubDir rules of their own.
|
||||
# Note that SUBDIR_DOWN is empty: it's all the way
|
||||
# up where the Jamrules live. These gets overrided
|
||||
# just after the inclusion.
|
||||
|
||||
SUBDIR_UP = $($(_top)-UP) ;
|
||||
SUBDIR_DOWN = ;
|
||||
SUBDIR_ROOT = $($(_top)-ROOT) ;
|
||||
|
||||
# Include $(TOPRULES) or $(TOP)/Jamrules.
|
||||
# Include $(TOPRULES) if set.
|
||||
# Otherwise include $(TOP)/Jamrules if present.
|
||||
|
||||
if $($(_top)RULES) {
|
||||
include $($(_top)RULES) ;
|
||||
} else {
|
||||
NoCare $(JAMRULES:R=$($(_top)):G=$(_top)) ;
|
||||
include $(JAMRULES:R=$($(_top)):G=$(_top)) ;
|
||||
}
|
||||
}
|
||||
|
||||
# Get path from $(TOP) to named directory.
|
||||
# Save dir tokens for other potential uses.
|
||||
|
||||
SUBDIR_UP = $($(_top)-UP) ;
|
||||
SUBDIR_DOWN = $($(_top)-DOWN) $(_tokens) ;
|
||||
SUBDIR_ROOT = $($(_top)-ROOT) ;
|
||||
SUBDIR_TOKENS = $(SUBDIR_DOWN) ;
|
||||
|
||||
SUBDIR = [ FSubDirPath $(<) ] ;
|
||||
|
||||
# Now set up SEARCH_SOURCE, LOCATE_TARGET, SOURCE_GRIST
|
||||
# These can be reset if needed. For example, if the source
|
||||
# directory should not hold object files, LOCATE_TARGET can
|
||||
# subsequently be redefined.
|
||||
|
||||
SEARCH_SOURCE = $(SUBDIR) ;
|
||||
LOCATE_SOURCE = $(ALL_LOCATE_TARGET) $(SUBDIR) ;
|
||||
LOCATE_TARGET = $(ALL_LOCATE_TARGET) $(SUBDIR) ;
|
||||
SOURCE_GRIST = [ FGrist $(SUBDIR_TOKENS) ] ;
|
||||
|
||||
# Reset per-directory ccflags, hdrs, etc,
|
||||
# listed in SUBDIRRESET.
|
||||
# Note use of variable expanded assignment var
|
||||
|
||||
SUBDIR$(SUBDIRRESET) = ;
|
||||
|
||||
# Invoke user-specific SubDir extensions,
|
||||
# rule names listed in SUBDIRRULES.
|
||||
# Note use of variable expanded rule invocation
|
||||
|
||||
$(SUBDIRRULES) $(<) ;
|
||||
}
|
||||
|
||||
rule FSubDirPath
|
||||
{
|
||||
# FSubDirPath TOP d1 ... ;
|
||||
|
||||
# Returns path to named directory.
|
||||
|
||||
# If jam is invoked in a subdirectory of the TOP, then we
|
||||
# need to prepend a ../ for every level we must climb up
|
||||
# (TOP-UP), and then append the directory names we must
|
||||
# climb down (TOP-DOWN), plus the named directories d1 ...
|
||||
# If TOP was set externally, or computed from another TOP
|
||||
# that was, we'll have to reroot the whole thing at TOP-ROOT.
|
||||
|
||||
local _r = [ FRelPath $($(<[1])-UP) : $($(<[1])-DOWN) $(<[2-]) ] ;
|
||||
|
||||
return $(_r:R=$($(<[1])-ROOT)) ;
|
||||
}
|
||||
|
||||
rule SubInclude
|
||||
{
|
||||
# SubInclude TOP d1 ... ;
|
||||
#
|
||||
# Include a subdirectory's Jamfile.
|
||||
|
||||
# We use SubDir to get there, in case the included Jamfile
|
||||
# either doesn't have its own SubDir (naughty) or is a subtree
|
||||
# with its own TOP.
|
||||
|
||||
if ! $($(<[1]))
|
||||
{
|
||||
Exit SubInclude $(<[1]) without prior SubDir $(<[1]) ;
|
||||
}
|
||||
|
||||
SubDir $(<) ;
|
||||
|
||||
include $(JAMFILE:D=$(SUBDIR)) ;
|
||||
}
|
||||
|
||||
rule SubRules
|
||||
{
|
||||
# SubRules TOP d1 ... : Other-TOP ;
|
||||
#
|
||||
# Read another tree's Jamrules, by giving it's path according
|
||||
# to this tree and it's own name.
|
||||
|
||||
if ! $($(<[1]))
|
||||
{
|
||||
Exit SubRules $(<[1]) without prior SubDir $(<[1]) ;
|
||||
}
|
||||
|
||||
SubDir $(<) ;
|
||||
SubDir $(>) ;
|
||||
}
|
||||
|
||||
## Now we try to fix up the already messed settings
|
||||
## XXX We can only hope that Jam 2.4 users don't try starting Jam from
|
||||
## subdirectories
|
||||
TOP-SET = true ;
|
||||
TOP-UP = ;
|
||||
TOP-DOWN = ;
|
||||
TOP-ROOT = $(TOP) ;
|
||||
SUBDIR_UP = $(TOP-UP) ;
|
||||
SUBDIR_DOWN = ;
|
||||
SUBDIR_ROOT = $(TOP-ROOT) ;
|
||||
|
||||
#SubDir TOP ;
|
||||
|
||||
} # end if $(JAMVERSION) = 2.4
|
||||
314
mk/jam/library.jam
Normal file
314
mk/jam/library.jam
Normal file
@@ -0,0 +1,314 @@
|
||||
#============================================================================
|
||||
# Rules for library creation
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
# Suppress ar's noisy report that it created the archive we asked it to create.
|
||||
if $(AR) && $(AR[2]) = ru { AR = $(AR[1]) ruc ; }
|
||||
|
||||
## Library libname : sources [ : options ]
|
||||
## Build a library out of sourcefiles. All sourcefiles will be passed
|
||||
## to the Objects rule which tries to compile them into object-files. You
|
||||
## can create rules for your own filetypes with the UserObject rule. Header
|
||||
## files will just be ignored. They are only used for MSVC projectfile
|
||||
## generation.
|
||||
## Available options are 'shared' if you want to build a shared library on
|
||||
## platforms which support that. You can specify the 'noinstall' option if
|
||||
## you don't want an install target generated.
|
||||
## Don't specify any extensions for the library name, also leave out the
|
||||
## leading "lib".
|
||||
## Options:
|
||||
## noinstall: Do not set up a default installation target.
|
||||
## independent: The target will not be made a dependency of the libs and
|
||||
## all targets.
|
||||
## shared: Create as a shared library on supported platforms.
|
||||
## nohelp: Do not invoke Help for this target.
|
||||
## notest: Do not set up unit-testing support for this target.
|
||||
## optional: Affects handling of the library in cs-config; it is only
|
||||
## reported as available when actually built.
|
||||
rule Library
|
||||
{
|
||||
local options = $(3) ;
|
||||
CheckOptions noinstall independent shared nohelp notest optional : $(options) : $(<) ;
|
||||
|
||||
local target = [ ConstructLibraryTarget $(<) : $(options) ] ;
|
||||
local sources = [ DoSourceGrist $(>) ] ;
|
||||
local objects ;
|
||||
local i ;
|
||||
for i in $(sources)
|
||||
{
|
||||
if $(i:S) = $(SUFOBJ)
|
||||
{
|
||||
objects += $(i) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
objects += [ CompileObjects $(i) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
$(<)_TYPE = library ;
|
||||
$(<)_OBJECTS = $(objects) ;
|
||||
$(<)_SOURCES = $(sources) ;
|
||||
$(<)_TARGET = $(target) ;
|
||||
|
||||
# create target clean rule
|
||||
Always $(<)clean ;
|
||||
NotFile $(<)clean ;
|
||||
Clean $(<)clean : $(objects) ; # create target clean rule
|
||||
|
||||
# so 'jam foo' works when it's really foo.exe (Windows) or foo.app (MacOS/X)
|
||||
if $(target) != $(<)
|
||||
{
|
||||
Depends $(<) : $(target) ;
|
||||
NotFile $(<) ;
|
||||
}
|
||||
|
||||
# library depends on its member objects
|
||||
if ! [ IsElem independent : $(options) ]
|
||||
{
|
||||
if $(KEEPOBJS)
|
||||
{
|
||||
Depends obj : $(objects) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Depends libs : $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! [ IsElem shared : $(options) ] ) || ( $(BUILD_SHARED_LIBS) != "yes" )
|
||||
{
|
||||
$(<)_SHARED = "" ;
|
||||
LibraryStatic $(<) : $(objects) : [ Filter $(options) : shared ] :
|
||||
$(target) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
$(<)_SHARED = "shared" ;
|
||||
LibraryShared $(<) : $(objects) : $(options) : $(target) ;
|
||||
}
|
||||
CFlags $(<) : $(LIBRARY.CFLAGS) ;
|
||||
LFlags $(<) : $(LIBRARY.LFLAGS) ;
|
||||
|
||||
if ! [ IsElem nohelp : $(options) ]
|
||||
{
|
||||
local desc = [ Description $(<) ] ;
|
||||
if ! $(desc) { desc = "$(<) library" ; }
|
||||
Help $(<) : "Build the $(desc)" ;
|
||||
}
|
||||
|
||||
if ! [ IsElem notest : $(options) ]
|
||||
{
|
||||
UnitTest $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
## LibDepends libname : dependant libraries
|
||||
## Make Library dependant on other libraries. This will tell the build
|
||||
## system that your library uses functions from other libraries in the
|
||||
## project. Note that a library shouldn't be linked with any external
|
||||
## library that should be done by the final application which uses the
|
||||
## library.
|
||||
rule LibDepends
|
||||
{
|
||||
$(<)_depends += $(>) ;
|
||||
|
||||
if "$($(<)_SHARED)"
|
||||
{
|
||||
LinkWith $(<) : $(>) ;
|
||||
}
|
||||
|
||||
UnitTestLibDepends $(<) : $(>) ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private part
|
||||
|
||||
# LibraryStatic libname : sources : options : decoratedtarget
|
||||
rule LibraryStatic
|
||||
{
|
||||
local objects = $(>) ;
|
||||
local options = $(3) ;
|
||||
local target = $(4) ;
|
||||
|
||||
# Set LOCATE for the library and its contents. The bound
|
||||
# value shows up as $(NEEDLIBS) on the Link actions.
|
||||
# For compatibility, we only do this if the library doesn't
|
||||
# already have a path.
|
||||
if ! $(target:D)
|
||||
{
|
||||
MakeLocate $(target) $(target)($(objects:BS)) : $(LOCATE.OBJECTS)/libs ;
|
||||
}
|
||||
|
||||
if $(NOARSCAN)
|
||||
{
|
||||
# If we can't scan the library to timestamp its contents,
|
||||
# we have to just make the library depend directly on the
|
||||
# on-disk object files.
|
||||
Depends $(target) : $(objects) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
# If we can scan the library, we make the library depend
|
||||
# on its members and each member depend on the on-disk
|
||||
# object file.
|
||||
Depends $(target) : $(target)($(objects:BS)) ;
|
||||
|
||||
local i ;
|
||||
for i in $(objects)
|
||||
{
|
||||
Depends $(target)($(i:BS)) : $(i) ;
|
||||
}
|
||||
}
|
||||
|
||||
# Generate install rules
|
||||
if ! [ IsElem noinstall : $(options) ]
|
||||
{
|
||||
if "$(RANLIB)"
|
||||
{
|
||||
Depends install_lib : [ DoInstall $(target) : $(libdir) : : Ranlib ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Depends install_lib : [ DoInstall $(target) : $(libdir) ] ;
|
||||
}
|
||||
|
||||
# Add to global library list
|
||||
if [ IsElem optional : $(options) ]
|
||||
{
|
||||
INSTALLEDLIBS_OPTIONAL += $(<) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
INSTALLEDLIBS += $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(CRELIB)
|
||||
{
|
||||
CreLib $(target) : $(objects[1]) ;
|
||||
}
|
||||
|
||||
Archive $(target) : $(objects) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
Depends clean : $(<)clean ;
|
||||
|
||||
if $(RANLIB)
|
||||
{
|
||||
Ranlib $(target) ;
|
||||
}
|
||||
|
||||
# If we can't scan the library, we have to leave the .o's around.
|
||||
if ! ( $(NOARSCAN) || $(NOARUPDATE) || $(KEEPOBJS) )
|
||||
{
|
||||
RmTemps $(target) : $(objects) ;
|
||||
}
|
||||
}
|
||||
|
||||
# LibraryStatic libname : sources : options : decoratedtarget
|
||||
rule LibraryShared
|
||||
{
|
||||
local objects = $(>) ;
|
||||
local options = $(3) ;
|
||||
local target = $(4) ;
|
||||
local linklib = [ ConstructSharedLibraryLinkLib $(<) : $(options) ] ;
|
||||
local deplibs ;
|
||||
|
||||
local i ;
|
||||
for i in $(LIBDEPENDS)
|
||||
{
|
||||
deplibs += [ ConstructLibraryLinkTarget $(i) : $(options) ] ;
|
||||
}
|
||||
|
||||
# Generate install rules
|
||||
if ! [ IsElem noinstall : $(options) ]
|
||||
{
|
||||
if $(TARGET.OS) != WIN32
|
||||
{
|
||||
Depends install_lib : [ DoInstall $(target) : $(libdir) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Depends install_lib : [ DoInstall $(target) : $(bindir) ] ;
|
||||
Depends install_lib : [ DoInstall $(linklib) : $(libdir) ] ;
|
||||
}
|
||||
|
||||
# Add to global library list
|
||||
if [ IsElem optional : $(options) ]
|
||||
{
|
||||
INSTALLEDLIBS_OPTIONAL += $(<) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
INSTALLEDLIBS += $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
Depends $(<) : $(linklib) ;
|
||||
if $(linklib) != $(target)
|
||||
{
|
||||
Depends $(linklib) : $(target) ;
|
||||
MakeLocate $(linklib) : $(LOCATE.OBJECTS)/libs ;
|
||||
SEARCH on $(linklib) = $(LOCATE.OBJECTS)/libs ;
|
||||
}
|
||||
Depends $(target) : $(objects) ;
|
||||
Clean $(<)clean : $(linklib) $(target) ;
|
||||
Depends clean : $(<)clean ;
|
||||
Depends $(target) : $(deplibs) ;
|
||||
|
||||
CFlags $(<) : [ FDefines CS_$(<:U)_LIB ] ;
|
||||
LFlags $(<) : $(LINKLIBS) ;
|
||||
|
||||
SystemLinkSharedLibrary $(target) : $(objects) $(deplibs) : $(linklib) ;
|
||||
}
|
||||
|
||||
rule ConstructLibraryTarget
|
||||
{
|
||||
if ( ! [ IsElem shared : $(>) ] ) || ( $(BUILD_SHARED_LIBS) != "yes" )
|
||||
{
|
||||
return [ ConstructStaticLibraryTarget $(<) : [ Filter $(>) : shared ] ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [ ConstructSharedLibraryTarget $(<) : $(>) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
rule ConstructLibraryLinkTarget
|
||||
{
|
||||
if ( ! [ IsElem shared : $(>) ] ) || ( $(BUILD_SHARED_LIBS) != "yes" )
|
||||
{
|
||||
return [ ConstructStaticLibraryTarget $(<) : [ Filter $(>) : shared ] ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [ ConstructSharedLibraryLinkLib $(<) : $(>) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
actions together Ranlib
|
||||
{
|
||||
$(RANLIB) $(<)
|
||||
}
|
||||
|
||||
# Construct pseudo target libs which is used instead of the pseudo target lib
|
||||
# in Jambase
|
||||
Depends lib : libs ;
|
||||
NotFile libs ;
|
||||
Help libs : "Build all link libraries" ;
|
||||
354
mk/jam/macosx.jam
Normal file
354
mk/jam/macosx.jam
Normal file
@@ -0,0 +1,354 @@
|
||||
#==============================================================================
|
||||
# Jam configuration and actions for MacOS/X
|
||||
# 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.
|
||||
#
|
||||
#==============================================================================
|
||||
SHELL ?= "/bin/sh" ;
|
||||
|
||||
MACOSX_ENVIRONMENT = "export MACOSX_DEPLOYMENT_TARGET=10.2" ;
|
||||
PLUGIN.LFLAGS += "-bundle" ;
|
||||
# We use the ugly -Wl form, which does not contain embedded whitespace (unlike
|
||||
# "-framework AppKit"), to help external projects which use the result of
|
||||
# "cs-config --libs" in conjunction with GNU libtool, since libtool likes to
|
||||
# re-arrange arguments, not realizing that "-framwork" and "AppKit" need to
|
||||
# stay together.
|
||||
LINKLIBS += "-Wl,-framework,AppKit" "-Wl,-framework,Foundation" ;
|
||||
|
||||
# Jambase in Jam 2.4 has a bug where it incorrectly defines RANLIB as "" for
|
||||
# MacOS/X, and this bogus value will override a RANLIB set via ?= in Jamconfig,
|
||||
# by a configure script, thus we must give RANLIB an appropriate value here if
|
||||
# we find that it has the bogus value. Jam 2.5 does not contain this bug.
|
||||
# Furthermore, MacOS/X Panther expects us to use the -s option with ranlib.
|
||||
if ! $(RANLIB) { RANLIB = "ranlib" ; }
|
||||
RANLIB += "-s" ;
|
||||
|
||||
# Experience seems to indicate that library scanning misbehaves on MacOS/X with
|
||||
# Jam 2.4, consequently we disable it.
|
||||
NOARSCAN = true ;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Public rules.
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
# ConstructApplicationTarget target : options
|
||||
# Constructs the application target name.
|
||||
rule ConstructApplicationTarget
|
||||
{
|
||||
return $(<) ;
|
||||
}
|
||||
|
||||
# ConstructStaticLibraryTarget target : options
|
||||
# Constructs the static library target name.
|
||||
rule ConstructStaticLibraryTarget
|
||||
{
|
||||
return lib$(<)$(SUFLIB) ;
|
||||
}
|
||||
|
||||
# ConstructSharedLibraryTarget target : options
|
||||
# Constructs the shared library target name.
|
||||
rule ConstructSharedLibraryTarget
|
||||
{
|
||||
return lib$(<).$(PACKAGE_VERSION).dylib ;
|
||||
}
|
||||
|
||||
# ConstructSharedLibraryLinkLib target : options
|
||||
# Constructs the name of a shared library against which some other target
|
||||
# links.
|
||||
rule ConstructSharedLibraryLinkLib
|
||||
{
|
||||
return lib$(<).$(PACKAGE_VERSION).dylib ;
|
||||
}
|
||||
|
||||
# ConstructPluginTarget target : options
|
||||
# Constructs the plugin target name.
|
||||
rule ConstructPluginTarget
|
||||
{
|
||||
return $(<).csbundle ;
|
||||
}
|
||||
|
||||
# SystemLinkApplication target : objects : options
|
||||
# Apply appropriate rule to link the application based upon the options.
|
||||
rule SystemLinkApplication
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
Depends $(target) : $(>) ;
|
||||
if [ IsElem console : $(3) ]
|
||||
{
|
||||
LinkApplicationConsole $(target) : $(>) ;
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateApplicationWrapper $(target) : $(>) ;
|
||||
CleanDir clean : [ Wrapper $(<) : app ] ;
|
||||
CleanDir $(<)clean : [ Wrapper $(<) : app ] ;
|
||||
}
|
||||
}
|
||||
|
||||
# SystemInstallApplication target : subdirs : options
|
||||
# Apply appropriate rule to install the application based upon the options.
|
||||
rule SystemInstallApplication
|
||||
{
|
||||
if [ IsElem console : $(3) ]
|
||||
{
|
||||
Depends install_bin :
|
||||
[ DoInstall $(<) : $(bindir) $(2) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
InstallApplicationGUI $(<) : $(bindir) $(2) ;
|
||||
}
|
||||
}
|
||||
|
||||
# SystemInstallPlugin target : subdirs : options
|
||||
# Apply appropriate rule to install the plugin based upon the options.
|
||||
rule SystemInstallPlugin
|
||||
{
|
||||
Depends install_plugin :
|
||||
[ DoInstall $(<) : $(plugindir) $(2) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
# SystemLinkPlugin target : objects : options
|
||||
# Link a plugin module and handle meta-data appropriately.
|
||||
rule SystemLinkPlugin
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
Depends $(target) : $(>) ;
|
||||
LinkPlugin $(target) : $(>) ;
|
||||
PluginMetaData $(<) : $($(<)_METAFILE) : $(3) ;
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
|
||||
# LinkPlugin plugin : objects
|
||||
# Link a plugin module from a set of object files.
|
||||
actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(MACOSX_ENVIRONMENT)
|
||||
$(CMD.LINK) -bundle -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
|
||||
# LinkApplicationConsole exe : objects
|
||||
# Link a console (non-GUI) appliation from a set of object files.
|
||||
actions LinkApplicationConsole bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(MACOSX_ENVIRONMENT)
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
|
||||
# CreateApplicationWrapper basename : objects
|
||||
# Create a complete, though minimal, application wrapper given a set of
|
||||
# object files. The rules ApplicationIconDefault and ApplicationIcon
|
||||
# control the icon associated with the application wrapper.
|
||||
rule CreateApplicationWrapper
|
||||
{
|
||||
WrapFile $(<) : $(<) : Contents MacOS : AppExe : $(>) ;
|
||||
WrapFile $(<) : PkgInfo : Contents : AppPkgInfo : $(>) ;
|
||||
WrapFile $(<) : version.plist : Contents : AppVersionPlist : $(>) ;
|
||||
WrapFile $(<) : Info.plist : Contents : AppInfoPlist : $(>) ;
|
||||
WrapFile $(<) : InfoPlist.strings : Contents Resources English.lproj :
|
||||
AppInfoPlistStrings : $(>) ;
|
||||
|
||||
local icon = [ ApplicationIcon macosx : $(<) ] ;
|
||||
if ! $(icon)
|
||||
{
|
||||
local apptype = gui ;
|
||||
if [ IsElem console : $(>) ] { apptype = console ; }
|
||||
icon = [ ApplicationIconDefault macosx : $(apptype) ] ;
|
||||
}
|
||||
if $(icon)
|
||||
{
|
||||
$(<)_APPICON = $(icon) ;
|
||||
AppIcon $(<) : $(icon) ;
|
||||
}
|
||||
}
|
||||
|
||||
# Wrapper basename : suffix [ : pathcomponents ]
|
||||
# Returns wrapper name in the directory specified by pathcomponents for
|
||||
# the given basename. If pathcomponents is omitted, LOCATE.TARGETS is
|
||||
# used.
|
||||
rule Wrapper
|
||||
{
|
||||
local dir ;
|
||||
if $(3) { dir = [ FDirName $(3) ] ; }
|
||||
else { dir = $(LOCATE.TARGETS) ; }
|
||||
return [ FDirName $(dir) $(1).$(2) ] ;
|
||||
}
|
||||
|
||||
# WrapFile basename : file : pathcomponents : rule [ : objects : [ suffix ] ]
|
||||
# Generate a file within a wrapper. pathcomponents is a list of names
|
||||
# which compose the relative path within the wrapper where file should be
|
||||
# placed. pathcomponents may be the empty list if the file should reside
|
||||
# at the top-level of the wrapper. rule is rule/action which should be
|
||||
# invoked to generate file. rule is invoked with arguments
|
||||
# <basename.suffix/pathcomponents/file>, <objects>, and <basename>.
|
||||
# objects is an optional list of files from which file should be built. It
|
||||
# may be omitted if file does not depend upon any other files. suffix is
|
||||
# the extension of the wrapper (not of file). If suffix is omitted, "app"
|
||||
# is assumed.
|
||||
#
|
||||
# Implementation note: If basename and file are the same, then we do not
|
||||
# grist file. (Obviously, we also do not want to set the file dependent
|
||||
# upon itself.) The reason we do not grist file in this case is that the
|
||||
# LinkWith, and LFlags rules associate the variables NEEDLIBS and
|
||||
# LINKLIBS with the ungristed name, therefore in order to get access to
|
||||
# these variables at AppExe action time, we must use the same (ungristed)
|
||||
# name. It is otherwise impossible to gain access to those variables.
|
||||
# This is an unfortunate hack which pollutes the otherwise general-purpose
|
||||
# WrapFile rule.
|
||||
rule WrapFile
|
||||
{
|
||||
local suffix ;
|
||||
if $(6) { suffix = $(6) ; } else { suffix = app ; }
|
||||
local target = $(2) ;
|
||||
if $(target) != $(1)
|
||||
{
|
||||
target = $(target:G=$(1)) ;
|
||||
Depends $(1) : $(target) ;
|
||||
}
|
||||
local dir = [ FDirName [ Wrapper $(1) : $(suffix) ] $(3) ] ;
|
||||
MakeLocate $(target) : $(dir) ;
|
||||
if $(5) { Depends $(target) : $(5) ; }
|
||||
BASENAME on $(target) = $(1) ;
|
||||
$(4) $(target) : $(5) : $(1) ;
|
||||
|
||||
Clean clean : [ FDirName $(dir) $(target) ] ;
|
||||
Clean $(1)clean : [ FDirName $(dir) $(target) ] ;
|
||||
}
|
||||
|
||||
# LinkApplication exe : objects
|
||||
actions AppExe bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(MACOSX_ENVIRONMENT)
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
|
||||
# AppPkgInfo file
|
||||
actions AppPkgInfo
|
||||
{
|
||||
echo 'APPL????' > $(<) ;
|
||||
}
|
||||
|
||||
# AppInfoPlistStrings file
|
||||
actions AppInfoPlistStrings
|
||||
{
|
||||
cat << EOT > $(<)
|
||||
CFBundleName = "$(BASENAME)";
|
||||
CFBundleShortVersionString = "$(PACKAGE_VERSION)";
|
||||
CFBundleGetInfoString = "$(BASENAME), $(PACKAGE_VERSION)";
|
||||
EOT
|
||||
}
|
||||
|
||||
# AppVersionPlist file
|
||||
actions AppVersionPlist
|
||||
{
|
||||
cat << EOT > $(<)
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(PACKAGE_VERSION)</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(PACKAGE_VERSION)</string>
|
||||
<key>ProjectName</key>
|
||||
<string>$(BASENAME)</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOT
|
||||
}
|
||||
|
||||
# AppInfoPlist filename : placeholder : basename
|
||||
# Implementation Note: $(BASENAME)_APPICON might be empty in the actions of
|
||||
# this rule, if the client did not specify a default icon or a
|
||||
# target-specific icon, in which case we need to omit both the
|
||||
# CFBundleIconFile key and value. To accomplish this, the key and value
|
||||
# are placed on a single line with no intervening whitespace. When Jam
|
||||
# interpolates a variable, if the variable is empty, it removes all
|
||||
# adjacent text (the key and value, in this case) which is just what we
|
||||
# desire.
|
||||
actions AppInfoPlist
|
||||
{
|
||||
cat << EOT > $(<)
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(BASENAME)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(BASENAME)</string>
|
||||
<key>CFBundleIconFile</key><string>$($(BASENAME)_APPICON)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(PACKAGE_VERSION)</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOT
|
||||
}
|
||||
|
||||
# AppIcon <basename> : <icon>
|
||||
# Copy an icon into the wrapper. It is assumed that some other agent has
|
||||
# already set SEARCH on the icon, if necessary.
|
||||
rule AppIcon
|
||||
{
|
||||
local icon = $(>:G=$(<)) ;
|
||||
Depends $(<) : $(icon) ;
|
||||
Depends $(icon) : $(>) ;
|
||||
MakeLocate $(icon) :
|
||||
[ FDirName [ Wrapper $(<) : app ] Contents Resources ] ;
|
||||
Copy $(icon) : $(>) ;
|
||||
Clean clean : $(icon) ;
|
||||
Clean $(<)clean : $(icon) ;
|
||||
}
|
||||
|
||||
# InstallApplicationGUI app : installdirs
|
||||
# Install a GUI application. Unlike applications on other platforms which
|
||||
# exist as a single executable file, on MacOS/X, an application is wrapped
|
||||
# in a directory hierarchy, thus a deep copy is needed (i.e. the typical
|
||||
# Install rule does not work).
|
||||
rule InstallApplicationGUI
|
||||
{
|
||||
local wrapper = $(<).app ;
|
||||
Depends $(wrapper) : $(<) ;
|
||||
SEARCH on $(wrapper) = $(LOCATE.TARGETS) ;
|
||||
|
||||
# Yuck! Internal knowledge of how DoInstall composes 'dir' and 'target'.
|
||||
local dir = [ ConcatDirs $(DESTDIR) $(2) ] ;
|
||||
local target = $(wrapper:BSR=$(dir):G=install) ;
|
||||
|
||||
InstallApplicationWrapperPrepare $(target) ;
|
||||
Depends install_bin :
|
||||
[ DoInstall $(wrapper) : $(2) : "$(DEEPCOPY)" ] ;
|
||||
}
|
||||
|
||||
actions InstallApplicationWrapperPrepare
|
||||
{
|
||||
$(DELTREE) $(<) ;
|
||||
}
|
||||
1548
mk/jam/msvcgen.jam
Normal file
1548
mk/jam/msvcgen.jam
Normal file
File diff suppressed because it is too large
Load Diff
80
mk/jam/objectivec.jam
Normal file
80
mk/jam/objectivec.jam
Normal file
@@ -0,0 +1,80 @@
|
||||
#============================================================================
|
||||
# Rules for compiling Objective-C and Objective-C++ files
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if $(CMD.OBJC)
|
||||
{
|
||||
|
||||
rule ObjCRule
|
||||
{
|
||||
local object = [ DoObjectGrist [ PrefixSuffix $(>)_ : $(<) : $(SUFOBJ) ] ] ;
|
||||
ObjC $(object) : $(<) ;
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType ObjCRule : .m ;
|
||||
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .m ;
|
||||
|
||||
rule ObjC
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
|
||||
CCFLAGS on $(<) += $(CCFLAGS) $(SUBDIRCCFLAGS) ;
|
||||
OBJCFLAGS on $(<) += $(OBJCFLAGS) ;
|
||||
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
|
||||
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
|
||||
}
|
||||
|
||||
actions ObjC
|
||||
{
|
||||
$(CMD.OBJC) -c -o $(<) $(CCHDRS) $(CCFLAGS) $(OBJCFLAGS) $(CCDEFS) $(>)
|
||||
}
|
||||
}
|
||||
|
||||
if $(CMD.OBJC++)
|
||||
{
|
||||
rule ObjC++Rule
|
||||
{
|
||||
local object = [ DoObjectGrist [ PrefixSuffix $(>)_ : $(<) : $(SUFOBJ) ] ] ;
|
||||
ObjC++ $(object) : $(<) ;
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType ObjC++Rule : .mm .M ;
|
||||
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .mm .M ;
|
||||
|
||||
rule ObjC++
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
|
||||
# Ugly hack: Apple's gcc4 does not accept -fvisibility-inlines-hidden in
|
||||
# Objective-C++ mode. Ideally, this issue should be resolved by the
|
||||
# configure script, but it does not currently distinguish between flags
|
||||
# intended for the C++ compiler and those intended for the Objective-C++
|
||||
# compiler.
|
||||
local rejects = -fvisibility-inlines-hidden ;
|
||||
C++FLAGS on $(<) += [ Filter $(C++FLAGS) $(SUBDIRC++FLAGS) : $(rejects) ] ;
|
||||
OBJC++FLAGS on $(<) += [ Filter $(OBJC++FLAGS) : $(rejects) ] ;
|
||||
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
|
||||
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
|
||||
}
|
||||
|
||||
actions ObjC++
|
||||
{
|
||||
$(CMD.OBJC++) -c -o $(<) $(CCHDRS) $(C++FLAGS) $(OBJC++FLAGS) $(CCDEFS) $(>)
|
||||
}
|
||||
}
|
||||
250
mk/jam/objects.jam
Normal file
250
mk/jam/objects.jam
Normal file
@@ -0,0 +1,250 @@
|
||||
#============================================================================
|
||||
# Rules for compiling a set of sources to object files
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
# These are slightly modified versions of the Object and Objects rules from
|
||||
# jam. The problem with the original rules in Jambase is the handling of
|
||||
# custom file types. The solution with the UserObject rule is monolithic, you
|
||||
# can only have 1 such rule. Thus we construct a more flexible toolkit here
|
||||
# which let's you register rules for certain filetypes.
|
||||
|
||||
## RegisterFileType Rulename : extensions
|
||||
## Register a rule which is used to compile a filetype into object
|
||||
## files. The registered rule is called with the name of the
|
||||
## sourcefile as argument and should return a list of objectfiles which are
|
||||
## created. You should set the grist of the object files by using the
|
||||
## DoObjectGrist function.
|
||||
rule RegisterFileType
|
||||
{
|
||||
local suffix ;
|
||||
for suffix in $(>)
|
||||
{
|
||||
FILETYPE_$(suffix) = $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
## RegisterHeaderRule rulename : regexpattern : extensions
|
||||
## Registers a rule and a regular expression which will be used for header
|
||||
## file scanning of the specified extensions.
|
||||
rule RegisterHeaderRule
|
||||
{
|
||||
local suffix ;
|
||||
for suffix in $(3)
|
||||
{
|
||||
HDRRULE_$(suffix) = $(<) ;
|
||||
HDRPATTERN_$(suffix) = $(>) ;
|
||||
}
|
||||
}
|
||||
|
||||
## CompileObjects sources [: objectfileprefix]
|
||||
## Compile a set of sourcefiles into objectfiles (extension: SUFOBJ,
|
||||
## usually .o). This rule takes care of setting the SEARCH and LOCATE
|
||||
## variables to the values of $(SEARCH_SOURCE) and $(LOCATE_TARGET).
|
||||
## The Application, Plugin and Library rules already use this rule
|
||||
## internally. You should only use this rule if you have to avoid the
|
||||
## Application, Plugin or Library rules.
|
||||
rule CompileObjects
|
||||
{
|
||||
local source ;
|
||||
local targets ;
|
||||
|
||||
# Search the source
|
||||
SEARCH on $(<) = $(SEARCH_SOURCE) ;
|
||||
|
||||
for source in $(<)
|
||||
{
|
||||
# compile the sourcefile to targetfile
|
||||
targets += [ CompileObject $(source) : $(>) ] ;
|
||||
}
|
||||
|
||||
# locate the targets
|
||||
MakeLocate $(targets) : $(LOCATE_TARGET) ;
|
||||
|
||||
return $(targets) ;
|
||||
}
|
||||
|
||||
## PrefixSuffix [prefix] : filename : suffix
|
||||
## Replaces the suffix of 'filename' with 'suffix' and prepends 'prefix' to
|
||||
## it.
|
||||
rule PrefixSuffix
|
||||
{
|
||||
local prefix = $(1) ;
|
||||
local name = $(2) ;
|
||||
local suffix = $(3) ;
|
||||
if ! $(prefix) { prefix = "" ; }
|
||||
return $(name:B=$(prefix)$(name:B):S=$(suffix)) ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private part
|
||||
|
||||
# helper rule: Compiles a source file to an object file. Does header file
|
||||
# scanning, sets LOCATE and SEARCH for source and target, grists the files
|
||||
# with the current subdir and searches for the correct registered rule.
|
||||
rule CompileObject
|
||||
{
|
||||
# handle #includes for source: Jam scans for headers with
|
||||
# the regexp pattern $(HDRSCAN) and then invokes $(HDRRULE)
|
||||
# with the scanned file as the target and the found headers
|
||||
# as the sources. HDRSEARCH is the value of SEARCH used for
|
||||
# the found header files. Finally, if jam must deal with
|
||||
# header files of the same name in different directories,
|
||||
# they can be distinguished with HDRGRIST.
|
||||
|
||||
# $(SEARCH_SOURCE:E) is where cc first looks for #include
|
||||
# "foo.h" files. If the source file is in a distant directory,
|
||||
# look there. Else, look in "" (the current directory).
|
||||
if $(HDRRULE_$(<:S))
|
||||
{
|
||||
HDRSEARCH on $(<) =
|
||||
$(SEARCH_SOURCE:E) $(SUBDIRHDRS) $(HDRS) $(STDHDRS) ;
|
||||
HDRGRIST on $(<) = $(HDRGRIST) ;
|
||||
HDRRULE on $(<) = $(HDRRULE_$(<:S)) ;
|
||||
HDRSCAN on $(<) = $(HDRPATTERN_$(<:S)) ;
|
||||
}
|
||||
|
||||
local targets ;
|
||||
# Invoke filetype specific rule
|
||||
if $(FILETYPE_$(<:S))
|
||||
{
|
||||
targets = [ $(FILETYPE_$(<:S)) $(<) : $(>) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo Warning: no rules for file type $(<:S) defined (at file $(<)). ;
|
||||
}
|
||||
|
||||
if $(targets)
|
||||
{
|
||||
# construct clean target
|
||||
Clean clean : $(targets) ;
|
||||
|
||||
# Save HDRS for -I$(HDRS) on compile.
|
||||
# We shouldn't need -I$(SEARCH_SOURCE) as cc can find headers
|
||||
# in the .c file's directory, but generated .c files (from
|
||||
# yacc, lex, etc) are located in $(LOCATE_TARGET), possibly
|
||||
# different from $(SEARCH_SOURCE).
|
||||
HDRS on $(<) = $(SEARCH_SOURCE) $(SUBDIRHDRS) $(HDRS) ;
|
||||
|
||||
# propagate target specific-defines
|
||||
DEFINES on $(<) += $(DEFINES) ;
|
||||
}
|
||||
|
||||
return $(targets) ;
|
||||
}
|
||||
|
||||
## HeaderRule source : headers
|
||||
## This rule is the default header rule used by the objects rules. You
|
||||
## might register custom rules with the RegisterHeaderRule rule.
|
||||
rule HeaderRule
|
||||
{
|
||||
# N.B. This rule is called during binding, potentially after
|
||||
# the fate of many targets has been determined, and must be
|
||||
# used with caution: don't add dependencies to unrelated
|
||||
# targets, and don't set variables on $(<).
|
||||
|
||||
# Tell Jam that anything depending on $(<) also depends on $(>),
|
||||
# set SEARCH so Jam can find the headers, but then say we don't
|
||||
# care if we can't actually find the headers (they may have been
|
||||
# within ifdefs),
|
||||
local s = $(>:G=$(HDRGRIST:E)) ;
|
||||
|
||||
Includes $(<) : $(s) ;
|
||||
SEARCH on $(s) = $(HDRSEARCH) ;
|
||||
NoCare $(s) ;
|
||||
|
||||
local i ;
|
||||
for i in $(s)
|
||||
{
|
||||
HDRGRIST on $(i) = $(HDRGRIST) ;
|
||||
HDRSEARCH on $(i) = $(HDRSEARCH) ;
|
||||
HDRRULE on $(i) = [ on $(<) GetVar HDRRULE ] ;
|
||||
HDRSCAN on $(i) = [ on $(<) GetVar HDRPATTERN ] ;
|
||||
}
|
||||
}
|
||||
|
||||
if $(JAMVERSION) < 2.5
|
||||
{
|
||||
## XXX XXX XXX a bug in jam 2.4 let's the version above fail. I'll let this
|
||||
## non-optimal version in here until jam 2.5 is out.
|
||||
|
||||
rule HeaderRule
|
||||
{
|
||||
local s = $(>:G=$(HDRGRIST:E)) ;
|
||||
|
||||
Includes $(<) : $(s) ;
|
||||
SEARCH on $(s) = $(HDRSEARCH) ;
|
||||
NoCare $(s) ;
|
||||
|
||||
local i ;
|
||||
for i in $(s)
|
||||
{
|
||||
if $(HDRRULE_$(i:S))
|
||||
{
|
||||
HDRGRIST on $(i) = $(HDRGRIST) ;
|
||||
HDRSEARCH on $(i) = $(HDRSEARCH) ;
|
||||
HDRRULE on $(i) = $(HDRRULE_$(i:S)) ;
|
||||
HDRSCAN on $(i) = $(HDRPATTERN_$(i:S)) ;
|
||||
}
|
||||
else if $(JAM_DEBUG)
|
||||
{
|
||||
#echo "No Header rule for $(i:S) file $(i) " ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} # end of if $(JAMVERSION) < 1.5
|
||||
|
||||
# Dummy rule: .o files are used as is.
|
||||
rule UseObjectFile
|
||||
{
|
||||
return $(<) ;
|
||||
}
|
||||
RegisterFileType UseObjectFile : .o ;
|
||||
|
||||
# Ignore header files.
|
||||
rule UseHeaderFile
|
||||
{
|
||||
return ;
|
||||
}
|
||||
RegisterFileType UseHeaderFile : .h .hpp ;
|
||||
RegisterHeaderRule HeaderRule : $(HDRPATTERN) : .h .hpp .inc ;
|
||||
|
||||
# Generates a grist suitable for output objects based on
|
||||
# SUBVARIANT and SUBDIR variable.
|
||||
rule DoObjectGrist
|
||||
{
|
||||
return $(<:G=$(SOURCE_GRIST:E)!$(SUBVARIANT:J=!)) ;
|
||||
}
|
||||
|
||||
# Generates a grist suitable for source files based on SUBDIR variable.
|
||||
# Doesn't change an existing grist.
|
||||
rule DoSourceGrist
|
||||
{
|
||||
local gristed ;
|
||||
for g in $(<)
|
||||
{
|
||||
local grist ;
|
||||
if $(g:G)
|
||||
{
|
||||
grist = $(g:G) ;
|
||||
}
|
||||
gristed += $(g:G=$(grist:E=$(SOURCE_GRIST:E))) ;
|
||||
}
|
||||
return $(gristed) ;
|
||||
}
|
||||
38
mk/jam/options.jam
Normal file
38
mk/jam/options.jam
Normal file
@@ -0,0 +1,38 @@
|
||||
#============================================================================
|
||||
# Rule for setting options at targets
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private rule - please specify the options in Application, Plugin or Library
|
||||
# rule and don't use this rule here directly.
|
||||
|
||||
## CheckOptions candidates : Options : target
|
||||
rule CheckOptions
|
||||
{
|
||||
local i ;
|
||||
|
||||
for i in $(>)
|
||||
{
|
||||
if ! [ IsElem $(i) : $(<) ]
|
||||
{
|
||||
echo "WARNING: Unknown option $(i) specified at $(3)." ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
166
mk/jam/plugin.jam
Normal file
166
mk/jam/plugin.jam
Normal file
@@ -0,0 +1,166 @@
|
||||
#============================================================================
|
||||
# Rules for plugin creation
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
SUFMETA ?= .csplugin ;
|
||||
GRISTMETA ?= pluginmeta ;
|
||||
|
||||
## Plugin pluginname : sources [ : options ]
|
||||
## Build a plugin out of sourcefiles. All sourcefiles will be passed
|
||||
## to the Objects rule which tries to compile them into object-files. You
|
||||
## can create rules for your own filetypes with the UserObject rule. Header
|
||||
## files will just be ignored. They are only used for MSVC projectfile
|
||||
## generator.
|
||||
## You can specify the noinstall option if you don't want that an install
|
||||
## target is created.
|
||||
## Options:
|
||||
## noinstall: Don't setup a default installation target.
|
||||
## independent: The target will not be made a dependency of the plugins
|
||||
## and all target.
|
||||
## nohelp: Do not invoke Help for this target.
|
||||
## notest: Do not set up unit-testing support for this target.
|
||||
rule Plugin
|
||||
{
|
||||
# check options
|
||||
CheckOptions noinstall independent nohelp notest : $(3) : $(<) ;
|
||||
|
||||
local metafile ;
|
||||
metafile = [ FAppendSuffix $(<) : $(SUFMETA) ] ;
|
||||
SEARCH on $(metafile) = $(SEARCH_SOURCE) ;
|
||||
|
||||
local target = [ ConstructPluginTarget $(<) : $(3) ] ;
|
||||
local sources = [ DoSourceGrist $(>) ] ;
|
||||
local objects = [ CompileObjects $(sources) ] ;
|
||||
|
||||
$(<)_TYPE = plugin ;
|
||||
$(<)_OBJECTS = $(objects) ;
|
||||
$(<)_SOURCES = $(sources) ;
|
||||
$(<)_TARGET = $(target) ;
|
||||
$(<)_METAFILE = $(metafile) ;
|
||||
|
||||
# create target clean rule
|
||||
Always $(<)clean ;
|
||||
NotFile $(<)clean ;
|
||||
Clean $(<)clean : $(objects) ; # create target clean rule
|
||||
|
||||
# Create a target for eventual static linking
|
||||
if ! $(NO_STATIC_LINKING)
|
||||
{
|
||||
SubVariant static ;
|
||||
local staticreginfoobject = [ BuildStaticRegFile $(<) : $(statictarget) ] ;
|
||||
|
||||
# Add objects to the list of candidates for potential inclusion in a
|
||||
# monolithic static library containing objects for all plugins (useful for
|
||||
# statically linking the plugins into an application if the client so
|
||||
# desires).
|
||||
local staticobjects = [ CompileObjects $(sources) : $(<) ] ;
|
||||
|
||||
local obj_remain = $(objects) ;
|
||||
local staticobj_remain = $(staticobjects) ;
|
||||
|
||||
while $(obj_remain)
|
||||
{
|
||||
local obj = $(obj_remain[1]) ;
|
||||
local staticobj = $(staticobj_remain[1]) ;
|
||||
|
||||
STATICPLUGINS.OBJECTS.$(staticobj) = $(obj) ;
|
||||
|
||||
obj_remain = $(obj_remain[2-]) ;
|
||||
staticobj_remain = $(staticobj_remain[2-]) ;
|
||||
}
|
||||
|
||||
MakeLocate $(staticobjects) : $(LOCATE_TARGET) ;
|
||||
STATICPLUGINS.OBJECTS.$(<) += $(staticreginfoobject) ;
|
||||
STATICPLUGINS.OBJECTS.$(<) += $(staticobjects) ;
|
||||
STATICPLUGINS.SUBTARGETS += $(<) ;
|
||||
|
||||
SubVariant ;
|
||||
}
|
||||
|
||||
# so 'jam foo' works when it's really foo.dll (Windows) or foo.csbundle
|
||||
# (MacOS/X)
|
||||
if $(target) != $(<)
|
||||
{
|
||||
Depends $(<) : $(target) ;
|
||||
NotFile $(<) ;
|
||||
}
|
||||
|
||||
if ! [ IsElem independent : $(3) ]
|
||||
{
|
||||
Depends plugins : $(<) ;
|
||||
}
|
||||
|
||||
# construct install target
|
||||
if ! [ IsElem noinstall : $(3) ]
|
||||
{
|
||||
SystemInstallPlugin $(target) ;
|
||||
}
|
||||
|
||||
# Link
|
||||
MakeLocate $(target) : $(LOCATE.TARGETS) ;
|
||||
SystemLinkPlugin $(<) : $(objects) : $(3) ;
|
||||
|
||||
CFlags $(<) : $(PLUGIN.CFLAGS) : nostatic ;
|
||||
LFlags $(<) : $(LINKLIBS) $(PLUGIN.LFLAGS) : nostatic ;
|
||||
|
||||
if ! [ IsElem nohelp : $(3) ]
|
||||
{
|
||||
local desc = [ Description $(<) ] ;
|
||||
if ! $(desc) { desc = "$(<) plugin" ; }
|
||||
Help $(<) : "Build the $(desc)" ;
|
||||
}
|
||||
|
||||
if ! [ IsElem notest : $(options) ]
|
||||
{
|
||||
# @@@ Disabled for now; see docs/todo_jam.txt
|
||||
#UnitTest $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# private rules
|
||||
|
||||
# PluginMetaData pluginname : metafile [ : options ]
|
||||
# Copy a plugin's meta file so that it resides alongside the generated
|
||||
# plugin module. This utility rule may be used by SystemLinkPlugin rules
|
||||
# which employ the default behavior of having a plugin's meta-data file
|
||||
# reside alongside the plugin executable (as opposed to bundling the
|
||||
# metadata directly into the plugin).
|
||||
# Options:
|
||||
# noinstall: Don't setup a default installation target.
|
||||
rule PluginMetaData
|
||||
{
|
||||
local target = $(>:G=$(GRISTMETA)) ;
|
||||
Depends $(<) : $(target) ;
|
||||
Depends $(target) : $(>) ;
|
||||
MakeLocate $(target) : $(LOCATE.TARGETS) ;
|
||||
Copy $(target) : $(>) ;
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
|
||||
if ! [ IsElem noinstall : $(3) ]
|
||||
{
|
||||
Depends install_plugin : [ DoInstall $(target) : $(plugindir) ] ;
|
||||
}
|
||||
}
|
||||
|
||||
# Construct pseudo target plugins
|
||||
Depends exe : plugins ;
|
||||
NotFile plugins ;
|
||||
Help plugins : "Build all plugin modules" ;
|
||||
58
mk/jam/property.jam
Normal file
58
mk/jam/property.jam
Normal file
@@ -0,0 +1,58 @@
|
||||
#==============================================================================
|
||||
# Generic property-bag mechanism.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
# Property bag : name
|
||||
# Returns the value of property 'name' in container 'bag' if present, else
|
||||
# returns a null value. 'bag' and 'name' should be simple identifiers
|
||||
# composed of alphanumeric characters and underscore, and with an alphabetic
|
||||
# or an underscore as the first character.
|
||||
rule Property
|
||||
{
|
||||
local p = [ _PropertyName $(<) : $(>) ] ;
|
||||
return $($(p)) ;
|
||||
}
|
||||
|
||||
# SetProperty bag : name [ : value ]
|
||||
# Add property 'name' to container 'bag'. If 'value' is not provided, sets
|
||||
# the property to "true".
|
||||
rule SetProperty
|
||||
{
|
||||
local p = [ _PropertyName $(<) : $(>) ] ;
|
||||
local v = $(3) ;
|
||||
if ! $(v) { v = "true" ; }
|
||||
$(p) = $(v) ;
|
||||
}
|
||||
|
||||
# ClearProperty bag : name
|
||||
# Remove property 'name' from container 'bag'.
|
||||
rule ClearProperty
|
||||
{
|
||||
local p = [ _PropertyName $(<) : $(>) ] ;
|
||||
$(p) = "" ;
|
||||
}
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Private utilitiy rules.
|
||||
#------------------------------------------------------------------------------
|
||||
rule _PropertyName
|
||||
{
|
||||
return "__property_$(<)_$(>)" ;
|
||||
}
|
||||
109
mk/jam/resource.jam
Normal file
109
mk/jam/resource.jam
Normal file
@@ -0,0 +1,109 @@
|
||||
#============================================================================
|
||||
# Rules for handling additional resources.
|
||||
# Platform-specific Jam files may override these if needed.
|
||||
#
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
## ApplicationIconDefault platform : type [ : icon [ : pathcomponents ]]
|
||||
## If invoked with three or more arguments, specifies the default icon for
|
||||
## applications of the specified type for the given platform, which may be
|
||||
## 'macosx', 'win32', or 'unix'. Type should be 'all', 'gui', or 'console'.
|
||||
## If pathcomponents is omitted, SEARCH_SOURCE is used. This setting can be
|
||||
## overriden for an individual application with the ApplicationIcon rule.
|
||||
## This rule must be invoked before invoking any Application rules if it is
|
||||
## to have any effect. If invoked with two arguments, returns the default
|
||||
## icon (if any) for the given platform and type.
|
||||
rule ApplicationIconDefault
|
||||
{
|
||||
local platform = $(1) ;
|
||||
local type = $(2) ;
|
||||
local icon = $(3) ;
|
||||
local iconpath = $(4) ;
|
||||
local key = default_$(platform)_$(type) ;
|
||||
|
||||
if $(icon)
|
||||
{
|
||||
SetProperty appicon : $(key) : $(icon) ;
|
||||
if $(iconpath)
|
||||
{
|
||||
SEARCH on $(icon) = [ ConcatDirs $(iconpath) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
SEARCH on $(icon) = $(SEARCH_SOURCE) ;
|
||||
}
|
||||
}
|
||||
|
||||
local result = [ Property appicon : $(key) ] ;
|
||||
if ! $(result) && $(type) != all
|
||||
{
|
||||
result = [ Property appicon : default_$(platform)_all ] ;
|
||||
}
|
||||
return $(result) ;
|
||||
}
|
||||
|
||||
## ApplicationIcon platform : basename [ : icon [ : pathcomponents ]]
|
||||
## If invoked with three or more arguments, specifies the icon for the
|
||||
## application given by basename for the indicated platform, which may be
|
||||
## 'macosx', 'win32', or 'unix'. If pathcomponents is omitted,
|
||||
## SEARCH_SOURCE is used. If this rule is not invoked, then the icon
|
||||
## specified via ApplicationIconDefault is used, if any. This rule must be
|
||||
## invoked before the Application rule to which this icon will apply. If
|
||||
## invoked with two arguments, returns the icon (if any) explicitly
|
||||
## registered for basename for the given platform.
|
||||
rule ApplicationIcon
|
||||
{
|
||||
local platform = $(1) ;
|
||||
local target = $(2) ;
|
||||
local icon = $(3) ;
|
||||
local iconpath = $(4) ;
|
||||
local key = app_$(platform)_$(target) ;
|
||||
|
||||
if $(icon)
|
||||
{
|
||||
SetProperty appicon : $(key) : $(icon) ;
|
||||
if $(iconpath)
|
||||
{
|
||||
SEARCH on $(icon) = [ ConcatDirs $(iconpath) ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
SEARCH on $(icon) = $(SEARCH_SOURCE) ;
|
||||
}
|
||||
|
||||
# An ugly but effective way to detect incorrect usage.
|
||||
if $($(target)_TARGET)
|
||||
{
|
||||
Echo "Warning: `ApplicationIcon:$(target):$(icon)' incorrectly invoked"
|
||||
"after Application rule." ;
|
||||
}
|
||||
}
|
||||
|
||||
return [ Property appicon : $(key) ] ;
|
||||
}
|
||||
|
||||
## Win32Resource basename : rcfiles
|
||||
## Specify .rc files for the target known as basename. The .rc files should
|
||||
## already have SEARCH set appropriately.
|
||||
rule Win32Resource { }
|
||||
|
||||
## Win32RcFlags basename : rcfiles
|
||||
## Specify flags passed to the resource compiler when compiling resources
|
||||
## for the target known as basename.
|
||||
rule Win32RcFlags { }
|
||||
353
mk/jam/static.jam
Normal file
353
mk/jam/static.jam
Normal file
@@ -0,0 +1,353 @@
|
||||
#============================================================================
|
||||
# Utility rules for static builds without plugins
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
# all private
|
||||
|
||||
rule GenerateStaticPluginBoilerplate
|
||||
{
|
||||
ResponseFile $(<) :
|
||||
"// This file is automatically generated."
|
||||
"#include \"cssysdef.h\""
|
||||
"#include \"csutil/scf.h\""
|
||||
""
|
||||
"// Put static linking stuff into own section."
|
||||
"// The idea is that this allows the section to be swapped out but not"
|
||||
"// swapped in again b/c something else in it was needed."
|
||||
"#if !defined(CS_DEBUG) && defined(CS_COMPILER_MSVC)"
|
||||
"#pragma const_seg(\".CSmetai\")"
|
||||
"#pragma comment(linker, \"/section:.CSmetai,r\")"
|
||||
"#pragma code_seg(\".CSmeta\")"
|
||||
"#pragma comment(linker, \"/section:.CSmeta,er\")"
|
||||
"#pragma comment(linker, \"/merge:.CSmetai=.CSmeta\")"
|
||||
"#endif"
|
||||
: notfile ;
|
||||
}
|
||||
|
||||
rule GenerateStaticPluginInstantiation
|
||||
{
|
||||
GenerateStaticPluginBoilerplate $(<) ;
|
||||
ResponseFile $(<) : "SCF_USE_STATIC_PLUGIN($(>:B))" : notfile ;
|
||||
}
|
||||
|
||||
rule GenerateStaticPluginRegistration
|
||||
{
|
||||
GenerateStaticPluginBoilerplate $(<) ;
|
||||
GenerateStaticPluginRegistration1 $(<) : $(>) ;
|
||||
}
|
||||
|
||||
rule BuildStaticRegFile
|
||||
{
|
||||
local statictarget = $(>) ;
|
||||
# prepare source files
|
||||
local sources = [ DoObjectGrist _$(<)_static_reg.cpp ] ;
|
||||
local object = [ CompileObject $(sources) ] ;
|
||||
|
||||
MakeLocate $(sources) : $(LOCATE_TARGET) ;
|
||||
MakeLocate $(object) : $(LOCATE_TARGET) ;
|
||||
|
||||
local metalist metafile i ;
|
||||
for i in $(<)
|
||||
{
|
||||
metafile = $($(i)_METAFILE) ;
|
||||
metalist += $(metafile) ;
|
||||
Depends $(sources) : $(metafile) ;
|
||||
}
|
||||
|
||||
GenerateStaticPluginRegistration $(sources) : $(metalist) ;
|
||||
Clean $(statictarget)clean : $(sources) ;
|
||||
Clean $(statictarget)clean : $(object) ;
|
||||
return $(object) ;
|
||||
}
|
||||
|
||||
rule BuildStaticUseFile
|
||||
{
|
||||
local statictarget = $(2) ;
|
||||
local package = $(3) ;
|
||||
# prepare source files
|
||||
local sources ;
|
||||
if $(3)
|
||||
{
|
||||
sources = [ DoObjectGrist _cs_static_use_$(package).cpp ] ;
|
||||
}
|
||||
else
|
||||
{
|
||||
sources = [ DoObjectGrist _cs_static_use.cpp ] ;
|
||||
}
|
||||
local object = [ CompileObject $(sources) ] ;
|
||||
|
||||
MakeLocate $(sources) : $(LOCATE_TARGET) ;
|
||||
SEARCH on $(sources) = $(LOCATE_TARGET) ;
|
||||
MakeLocate $(object) : $(LOCATE_TARGET) ;
|
||||
|
||||
C++FLAGS on $(object) += $($($(>).EXTERNALLIBS).CFLAGS) ;
|
||||
|
||||
GenerateStaticPluginInstantiation $(sources) : $(<) ;
|
||||
Clean $(statictarget)clean : $(sources) ;
|
||||
Clean $(statictarget)clean : $(object) ;
|
||||
return $(object) ;
|
||||
}
|
||||
|
||||
## LinkStaticPlugins target : plugins [: optionalplugins] [: package]
|
||||
## Builds the plugins in 'plugins' (and 'optionalplugins') statically into
|
||||
## 'target'. Can be used both for static plugins from the local project or
|
||||
## an external project. In the latter case, the project's static plugin
|
||||
## library has to have been built, also, the "<package>.STATICDEPS"
|
||||
## variable must contain a path to a specially generated Jamfile that
|
||||
## contains information about the plugins provided by as well as external
|
||||
## dependencies. The static plugins library for both local and external
|
||||
## package must be explicitly linked into 'target'.
|
||||
rule LinkStaticPlugins
|
||||
{
|
||||
local package target plugins optplugins ;
|
||||
# Fetch the parameters
|
||||
target = $(1) ;
|
||||
plugins = $(2) ;
|
||||
optplugins = $(3) ;
|
||||
package = $(4) ;
|
||||
|
||||
if $(package)
|
||||
{
|
||||
# External static plugins.
|
||||
# First include static plugin info
|
||||
if ! $(HAVE_STATICDEPS.$(package))
|
||||
{
|
||||
include $($(package).STATICDEPS) ;
|
||||
HAVE_STATICDEPS.$(package) = yes ;
|
||||
}
|
||||
local lflags p ;
|
||||
# Collect optional plugins
|
||||
for p in $(optplugins)
|
||||
{
|
||||
if [ IsElem $(p) : $(STATICPLUGINS.AVAILABLE) ]
|
||||
{
|
||||
plugins += $(p) ;
|
||||
}
|
||||
}
|
||||
# Grab flags
|
||||
for p in $(plugins)
|
||||
{
|
||||
NotFile $(p) ;
|
||||
CFlags $(target) : $(STATICPLUGIN.$(p).CFLAGS) ;
|
||||
lflags = [ MergeLFlags $(lflags) : $(STATICPLUGIN.$(p).LFLAGS) ] ;
|
||||
}
|
||||
LFlags $(target) : $(lflags) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
# Local static plugins
|
||||
local lflags libs p ;
|
||||
# Collect optional plugins
|
||||
for p in $(optplugins)
|
||||
{
|
||||
if $($(p)_TARGET)
|
||||
{
|
||||
plugins += $(p) ;
|
||||
}
|
||||
}
|
||||
# Grab flags
|
||||
for p in $(plugins)
|
||||
{
|
||||
lflags += [ Filter $($(p).LFLAGS) : $(LINKLIBS) $(PLUGIN.LFLAGS) ] ;
|
||||
libs += $($(p).NEEDLIBS) ;
|
||||
}
|
||||
LFlags $(target) : [ Reverse [ RemoveDups [ Reverse $(lflags) ] ] ] ;
|
||||
LinkWith $(target) : [ Reverse [ RemoveDups [ Reverse $(libs) ] ] ] ;
|
||||
}
|
||||
|
||||
# construct initialization sourcefile
|
||||
local staticobject = [ BuildStaticUseFile $(plugins) : $(target) : $(package) ] ;
|
||||
ExtraObjects $(target) : $(staticobject) : inheritcflags ;
|
||||
}
|
||||
|
||||
## StaticPluginLibrary name [: rejects]
|
||||
## Create a library that monolithically contains statically linkable
|
||||
## versions of all plugins, and also provides a target to install this
|
||||
## library ("install_staticplugins") as well as resources to facilitate the
|
||||
## use of that library from external projects. Also, most plugins will
|
||||
## probably themselves depend on other libraries; while those are correctly
|
||||
## linked in with the static plugins, they are not built or installed when
|
||||
## the static plugin library is.
|
||||
## This library is intended to be used together with the
|
||||
## "LinkStaticPlugins" rule.
|
||||
rule StaticPluginLibrary
|
||||
{
|
||||
local name = $(<) ;
|
||||
local rejects = $(>) ;
|
||||
local t ;
|
||||
|
||||
local targets = $(STATICPLUGINS.SUBTARGETS) ;
|
||||
if $(rejects)
|
||||
{
|
||||
targets = [ Filter $(targets) : $(rejects) ] ;
|
||||
}
|
||||
local objects ;
|
||||
for t in $(targets)
|
||||
{
|
||||
objects += $(STATICPLUGINS.OBJECTS.$(t)) ;
|
||||
}
|
||||
|
||||
# Set up library
|
||||
Library $(name) : $(objects) : noinstall notest independent nohelp ;
|
||||
SEARCH on $(name) += $(LOCATE_TARGET) ;
|
||||
MsvcDefine $(name) : $(STATICPLUGINS.MSVC_DEFINES) ;
|
||||
CFlags $(name) :
|
||||
[ FDefines CS_STATIC_LINKED ]
|
||||
: nostatic ;
|
||||
|
||||
# Copy a variety of flags
|
||||
local o ;
|
||||
for o in $(objects)
|
||||
{
|
||||
local sourceobj = $(STATICPLUGINS.OBJECTS.$(o)) ;
|
||||
if $(sourceobj)
|
||||
{
|
||||
CCFLAGS on $(o) += [ on $(sourceobj) GetVar CCFLAGS ] ;
|
||||
C++FLAGS on $(o) += [ on $(sourceobj) GetVar C++FLAGS ] ;
|
||||
}
|
||||
}
|
||||
|
||||
# Write out needed CFLAGS, LFLAGS
|
||||
STATICPLUGINS.DEPENDENCIES = $(name).jam ;
|
||||
MakeLocate $(STATICPLUGINS.DEPENDENCIES) : $(LOCATE.OBJECTS)/libs ;
|
||||
for t in $(targets)
|
||||
{
|
||||
WriteDependencies $(STATICPLUGINS.DEPENDENCIES) : $(t) : $(name) ;
|
||||
}
|
||||
Depends $(name) : $(STATICPLUGINS.DEPENDENCIES) ;
|
||||
Clean $(name)clean : $(STATICPLUGINS.DEPENDENCIES) ;
|
||||
|
||||
# Install targets
|
||||
Depends install_staticplugins :
|
||||
[ DoInstall [ ConstructLibraryTarget $(name) ] : $(libdir) ] ;
|
||||
Depends install_staticplugins : $(STATICPLUGINS.DEPENDENCIES) ;
|
||||
Depends install_staticplugins :
|
||||
[ DoInstall $(STATICPLUGINS.DEPENDENCIES) : $(libdir) ] ;
|
||||
Depends install_staticplugins : install_libs ;
|
||||
|
||||
INSTALLEDLIBS_OPTIONAL += $(name) ;
|
||||
|
||||
# Collect library dependencies. The idea is to built all libs needed by the
|
||||
# static plugins when "jam staticplugins" is invoked.
|
||||
for t in $(targets)
|
||||
{
|
||||
local deplibs ;
|
||||
if $($(t).NEEDLIBS)
|
||||
{
|
||||
deplibs += $($(t).NEEDLIBS) ;
|
||||
}
|
||||
deplibs = [ RemoveDups $(deplibs) ] ;
|
||||
Depends staticplugins : $(deplibs) ;
|
||||
}
|
||||
Help staticplugins :
|
||||
"Build the library with static versions of all plugins" ;
|
||||
Depends staticplugins : libs $(name) ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
# Write out CFLAGS, LFLAGS needed by a plugin
|
||||
rule WriteDependencies
|
||||
{
|
||||
local cflags ;
|
||||
local lflags ;
|
||||
local depfile = $(<) ;
|
||||
local plugin = $(>) ;
|
||||
local name = $(3) ;
|
||||
local depfile_gristed = $(depfile:G=$(plugin)) ;
|
||||
MakeLocate $(depfile_gristed) : [ on $(depfile) GetVar LOCATE ] ;
|
||||
|
||||
# Collect flags
|
||||
lflags += -l$(name) ;
|
||||
local libs = [ ResolveLibs $($(plugin).NEEDLIBS) ] ;
|
||||
lflags += -l$(libs) ;
|
||||
|
||||
local l ;
|
||||
for l in $($(plugin).EXTERNALLIBS)
|
||||
{
|
||||
cflags += $($(l).CFLAGS) ;
|
||||
lflags += [ Filter $($(l).LFLAGS) : $(LINKLIBS) $(PLUGIN.LFLAGS) ] ;
|
||||
}
|
||||
lflags += [ Filter $($(plugin).LFLAGS) : $(LINKLIBS) $(PLUGIN.LFLAGS) ] ;
|
||||
CFLAGS on $(depfile_gristed) = "$(cflags)" ;
|
||||
LFLAGS on $(depfile_gristed) = "$(lflags)" ;
|
||||
|
||||
if $($(depfile).FIRSTTIME) != "yes"
|
||||
{
|
||||
WriteDepFlags1 $(depfile_gristed) : $(plugin) ;
|
||||
$(depfile).FIRSTTIME = "yes" ;
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteDepFlags2 $(depfile_gristed) : $(plugin) ;
|
||||
}
|
||||
Depends $(depfile) : $(depfile_gristed) ;
|
||||
}
|
||||
|
||||
actions WriteDepFlags1
|
||||
{
|
||||
cat << EOT > $(<)
|
||||
STATICPLUGINS.AVAILABLE += $(>) ;
|
||||
STATICPLUGIN.$(>).CFLAGS = $(CFLAGS) ;
|
||||
STATICPLUGIN.$(>).LFLAGS = $(LFLAGS) ;
|
||||
EOT
|
||||
}
|
||||
|
||||
actions WriteDepFlags2
|
||||
{
|
||||
cat << EOT >> $(<)
|
||||
STATICPLUGINS.AVAILABLE += $(>) ;
|
||||
STATICPLUGIN.$(>).CFLAGS = $(CFLAGS) ;
|
||||
STATICPLUGIN.$(>).LFLAGS = $(LFLAGS) ;
|
||||
EOT
|
||||
}
|
||||
|
||||
actions piecemeal GenerateStaticPluginRegistration1
|
||||
{
|
||||
echo 'namespace csStaticPluginInit' >> $(<)
|
||||
echo '{' >> $(<)
|
||||
for x in $(>)
|
||||
do
|
||||
n=`basename $x $(SUFMETA)`
|
||||
echo "static char const metainfo_${n}[] =" >> $(<)
|
||||
$(SED) 's:\\:\\\\:g;s:":\\":g;s:\(.*\):"\1":' < $x >>$(<)
|
||||
echo ";" >> $(<)
|
||||
$(SED) '/<implementation>/!d;s:[ ]*<implementation>\(..*\)</implementation>: #ifndef \1_FACTORY_REGISTER_DEFINED \
|
||||
#define \1_FACTORY_REGISTER_DEFINED \
|
||||
SCF_DEFINE_FACTORY_FUNC_REGISTRATION(\1) \
|
||||
#endif:g' < $x >> $(<)
|
||||
done
|
||||
echo '' >> $(<)
|
||||
for x in $(>)
|
||||
do
|
||||
n=`basename $x $(SUFMETA)`
|
||||
echo "class ${n}" >> $(<)
|
||||
echo "{" >> $(<)
|
||||
echo "SCF_REGISTER_STATIC_LIBRARY($n,metainfo_${n})" >>$(<)
|
||||
$(SED) '/<implementation>/!d;s:[ ]*<implementation>\(..*\)</implementation>: #ifndef \1_FACTORY_REGISTERED \
|
||||
#define \1_FACTORY_REGISTERED \
|
||||
\1_StaticInit \1_static_init__; \
|
||||
#endif:g' < $x >> $(<)
|
||||
echo "public:" >> $(<)
|
||||
echo " ${n}();" >> $(<)
|
||||
echo "};" >> $(<)
|
||||
echo "$n::$n() {}" >> $(<)
|
||||
echo "" >> $(<)
|
||||
done
|
||||
echo '}' >> $(<)
|
||||
}
|
||||
109
mk/jam/subdir.jam
Normal file
109
mk/jam/subdir.jam
Normal file
@@ -0,0 +1,109 @@
|
||||
#============================================================================
|
||||
# Work around problems the SubDir rule of Jambase
|
||||
# (until jampeople accept my patches :-/ )
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
LOCATE.OBJECTS ?= $(BUILDTOP)/out/$(OSFULL[1]:L) ;
|
||||
LOCATE.TARGETS ?= $(BUILDTOP) ;
|
||||
LOCATE.DOCS ?= $(BUILDTOP)/out/docs ;
|
||||
|
||||
SUBDIRRULES += FixSubDirPath ;
|
||||
|
||||
CMD.MKDIR ?= mkdir ;
|
||||
CMD.MKDIRS ?= "$(CMD.MKDIR) -p" ;
|
||||
|
||||
rule FixSubDirPath
|
||||
{
|
||||
LOCATE_SOURCE = [ FDirName $(LOCATE.OBJECTS) $(SUBDIR_TOKENS) ] ;
|
||||
LOCATE_TARGET = [ FDirName $(LOCATE.OBJECTS) $(SUBDIR_TOKENS) ] ;
|
||||
}
|
||||
|
||||
# Fix bug in Jambase where SubInclude in the middle of a Jamfile made it break.
|
||||
rule SubInclude
|
||||
{
|
||||
if ! $($(<[1]))
|
||||
{
|
||||
Exit SubInclude $(<[1]) without prior SubDir $(<[1]) ;
|
||||
}
|
||||
|
||||
local save_SUBDIR_TOKENS = $(SUBDIR_TOKENS) ;
|
||||
|
||||
SubDir $(<) ;
|
||||
|
||||
include $(JAMFILE:D=$(SUBDIR)) ;
|
||||
|
||||
SubDir $(<[1]) $(save_SUBDIR_TOKENS) ;
|
||||
}
|
||||
|
||||
# This MakeLocate rule differs from the Jambase one in that it also works with
|
||||
# files being in subdirectories.
|
||||
rule MakeLocate
|
||||
{
|
||||
# MakeLocate targets : directory ;
|
||||
|
||||
# Sets special variable LOCATE on targets, and arranges
|
||||
# with MkDir to create target directory.
|
||||
|
||||
# Note we grist the directory name with 'dir',
|
||||
# so that directory path components and other
|
||||
# targets don't conflict.
|
||||
|
||||
if $(>) && $(>) != ""
|
||||
{
|
||||
local i ;
|
||||
for i in $(<)
|
||||
{
|
||||
LOCATE on $(i) = $(>) ;
|
||||
|
||||
local targetfile = $(i:R=$(>)) ;
|
||||
local targetdir = $(targetfile:D) ;
|
||||
if ! $(targetdir) { targetdir = "." ; }
|
||||
targetdir = $(targetdir:G=dir) ;
|
||||
Depends $(i) : $(targetdir) ;
|
||||
MkDir $(targetdir) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The default MkDir rule in Jambase has problems when paths contains a sequence
|
||||
# of multiple slashes (ie. bla////fup). We solve these problems and greatly
|
||||
# simply this rule by using the "mkdir -p" or mkdirs command.
|
||||
rule MkDir
|
||||
{
|
||||
# MkDir directory ;
|
||||
|
||||
# Make a directory and all its parent directories.
|
||||
|
||||
# Ignore timestamps on directories: we only care if they
|
||||
# exist.
|
||||
|
||||
NoUpdate $(<) ;
|
||||
|
||||
# don't create the dir multiple times
|
||||
if ! $($(<)-mkdir)
|
||||
{
|
||||
$(<)-mkdir = true ;
|
||||
MkDir1 $(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
actions MkDir1
|
||||
{
|
||||
$(CMD.MKDIRS) "$(<)"
|
||||
}
|
||||
225
mk/jam/swig.jam
Normal file
225
mk/jam/swig.jam
Normal file
@@ -0,0 +1,225 @@
|
||||
#============================================================================
|
||||
# Rules for swig
|
||||
# Copyright (C)2004 by Eric Sunshine <sunshine@sunshineco.com>
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if $(CMD.SWIG)
|
||||
{
|
||||
# Post-processing of the Swig-generated C++ file.
|
||||
#
|
||||
# (1) We need to ensure that <stdint.h> defines INT64_C() and cousins, which
|
||||
# means that the __STDC_CONSTANT_MACROS and __STDC_LIMIT_MACROS macros must
|
||||
# be defined before <stdint.h> is included. In some Python installations,
|
||||
# Python.h includes <stdint.h>, and Swig-generated output includes Python.h
|
||||
# before we ever have a chance to define the __STDC_* macros. There is no
|
||||
# Swig-supported mechanism allowing us to insert these #defines before
|
||||
# Python.h is included, so we post-process the output file.
|
||||
#
|
||||
# (2) We #undefine _DEBUG, to ensure that python23.lib is used by MSVC
|
||||
# instead of python23_d.lib.
|
||||
#
|
||||
# (3) Delete any lines containing the CVS `Header' keyword to ensure that CVS
|
||||
# does not consider the file changed simply because `Header' expansion
|
||||
# differs.
|
||||
#
|
||||
# (4) Swig 1.3.22 for Perl emits illegal expressions `new (sometype)[n]'
|
||||
# rather than `new sometype[n]' (at least gcc considers it illegal),
|
||||
# therefore, we transform the expression by dropping the parentheses.
|
||||
#
|
||||
# (5) cs_pyth.cpp contains a macro "#define SWIG_init init_cspace". However,
|
||||
# cs_pyth.cpp may reside in a shared lib, so we rather want the name
|
||||
# SWIG_init and define init_cspace as a simple forwared ourselves.
|
||||
#
|
||||
# (6) perl.h includes dirent.h on some configurations which conflicts with
|
||||
# the CS definitions of dirent, opendir, etc. So define _DIRENT_H_ to
|
||||
# make dirent.h skip its body. This is hackish but no better solution
|
||||
# has been found.
|
||||
#
|
||||
# (Despite the fact that these customizations might seem project-specific,
|
||||
# they should be safe for all projects.)
|
||||
SWIG.SED_SCRIPT =
|
||||
"'s/\\([ ]*#[ ]*include[ ][ ]*[<\"]Python.h[>\"]\\)/\\
|
||||
#ifndef __STDC_CONSTANT_MACROS\\
|
||||
#define __STDC_CONSTANT_MACROS\\
|
||||
#endif\\
|
||||
#ifndef __STDC_LIMIT_MACROS\\
|
||||
#define __STDC_LIMIT_MACROS\\
|
||||
#endif\\
|
||||
#ifndef DEBUG_PYTHON\\
|
||||
#undef _DEBUG\\
|
||||
#endif\\
|
||||
\\1/g
|
||||
/\$Header:/d
|
||||
s/new[ ][ ]*(\\([^)][^)]*\\))[ ]*\\[/new \\1 [/g
|
||||
s/[ ]*#[ ]*define[ ][ ]*SWIG_init[ ]*init_\\(.*\\)/#define SWIG_init SWIG_init_\\1/g
|
||||
s/\\([ ]*#[ ]*include[ ][ ]*[<\"]perl.h[>\"]\\)/\\
|
||||
#ifndef _DIRENT_H_\\
|
||||
#define _DIRENT_H_\\
|
||||
#endif\\
|
||||
\\1/g'" ;
|
||||
|
||||
## Swig targets : swigfile : language [ : swigflags [ : swigincdirs
|
||||
## [ : swigfiledir [ : frozendirs [ : tag [ : outdir ]]]]]]
|
||||
## Given a Swig input file `swigfile', generate `targets' for scripting
|
||||
## language `language'. The first element of `targets' should name the
|
||||
## generated C or C++ file, and the remaining optional elements should name
|
||||
## any other language-specific scripting files which Swig will generate.
|
||||
## For instance, the files widgets.cpp and widgets.py might be emitted by
|
||||
## Swig for the input file widgets.i. The generated files are placed in
|
||||
## $(LOCATE_TARGET). `swigflags' specifies additional flags to pass to
|
||||
## Swig. `swigincdirs' is a list of additional directories which Swig
|
||||
## should search for files which it includes. `swigfiledir' specifies the
|
||||
## location of `swigfile' if it does not reside in the present source
|
||||
## directory. This rule defines top-level targets named "$(tag)swig",
|
||||
## which generates `targets' on-demand; and "$(tag)swigclean", which
|
||||
## deletes the generated files. `tag' is a simple identifier out of which
|
||||
## top-level pseudo-targets names are constructed. If `tag' is not
|
||||
## provided, then `language' is used instead. If `frozentargdirs' is
|
||||
## provided, then an additional top-level target named "$(tag)freeze" is
|
||||
## defined, which copies the generated files to the specified directories.
|
||||
## If `frozentargdirs' contains only one element, then all generated files
|
||||
## are copied to that directory. If it contains two elements, then the
|
||||
## first element of `targets' is copied to the first element of
|
||||
## `frozentargdirs', and all remaining elements of `targets' are copied to
|
||||
## the second element of `frozentargdirs'. `outdir', if provided, is a list
|
||||
## of path components which specify a subdirectory in which Swig should
|
||||
## place the language-specific support files, rather than placing them in
|
||||
## $(LOCATE_TARGET). This might be useful, for instance, when Swig is in
|
||||
## Java mode, and the .java files must be placed in a directory hierarchy
|
||||
## which reflects the full package name.
|
||||
rule Swig
|
||||
{
|
||||
local target = $(1[1]) ;
|
||||
local othertargets = $(1[2-]) ;
|
||||
local swigfile = $(2) ;
|
||||
local language = $(3) ;
|
||||
local swigflags = $(4) ;
|
||||
local swigincdirs = $(5) ;
|
||||
local swigfiledir = $(6) ;
|
||||
local frozentargetdir = $(7[1]) ;
|
||||
local frozenotherdir = $(7[2-]) ;
|
||||
local tag = $(8) ;
|
||||
local outdir = $(9) ;
|
||||
|
||||
if ! $(frozenotherdir) { frozenotherdir = $(frozentargetdir) ; }
|
||||
if ! $(tag) { tag = $(language) ; }
|
||||
if ! $(outdir) { outdir = $(LOCATE_TARGET) ; }
|
||||
|
||||
Depends $(target) : $(swigfile) ;
|
||||
MakeLocate $(target) : $(LOCATE_TARGET) ;
|
||||
if $(othertargets)
|
||||
{
|
||||
MakeLocate $(othertargets) : $(outdir) ;
|
||||
|
||||
# If any target, such as an install target, depends upon the other files,
|
||||
# we force them to be built with a dependency upon the target.
|
||||
Depends $(othertargets) : $(target) ;
|
||||
}
|
||||
|
||||
SWIG.FLAGS on $(target) +=
|
||||
$(SWIG.FLAGS) -$(language) $(swigflags) -I$(swigincdirs)
|
||||
-outdir [ ConcatDirs $(outdir) ] ;
|
||||
|
||||
# Allow Swig input file to reside at location other than $(SEARCH_SOURCE).
|
||||
if $(swigfiledir)
|
||||
{
|
||||
SEARCH on $(swigfile) = $(swigfiledir) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
SEARCH on $(swigfile) = $(SEARCH_SOURCE) ;
|
||||
}
|
||||
|
||||
# Scan for special Swig includes.
|
||||
HDRGRIST on $(swigfile) = $(HDRGRIST) ;
|
||||
HDRSEARCH on $(swigfile) =
|
||||
$(SEARCH_SOURCE:E) $(SUBDIRHDRS) $(HDRS) $(STDHDRS) ;
|
||||
HDRRULE on $(swigfile) = HeaderRule ;
|
||||
HDRSCAN on $(swigfile) = $(SWIG.HDRPATTERN) ;
|
||||
|
||||
RunSwig $(target) : $(swigfile) ;
|
||||
Depends $(tag)swig : $(target) ;
|
||||
NotFile $(tag)swig ;
|
||||
Always $(tag)swig ;
|
||||
Help $(tag)swig : "Generate Swig files for $(tag)" ;
|
||||
|
||||
Clean $(tag)swigclean : $(target) $(othertargets) ;
|
||||
Depends clean : $(tag)swigclean ;
|
||||
|
||||
if $(frozentargetdir)
|
||||
{
|
||||
local frozen_target = $(target:G=$(tag)freeze) ;
|
||||
MakeLocate $(frozen_target) : $(frozentargetdir) ;
|
||||
Depends $(frozen_target) : $(target) ;
|
||||
Copy $(frozen_target) : $(target) ;
|
||||
Depends $(tag)freeze : $(frozen_target) ;
|
||||
|
||||
if $(othertargets)
|
||||
{
|
||||
local frozen_other = $(othertargets:G=$(tag)freeze) ;
|
||||
MakeLocate $(frozen_other) : $(frozenotherdir) ;
|
||||
Depends $(frozen_other) : $(othertargets) ;
|
||||
Copy $(frozen_other) : $(othertargets) ;
|
||||
Depends $(tag)freeze : $(frozen_other) ;
|
||||
}
|
||||
|
||||
NotFile $(tag)freeze ;
|
||||
Help $(tag)freeze : "Copy generated Swig files to source directory" ;
|
||||
}
|
||||
}
|
||||
|
||||
actions RunSwig
|
||||
{
|
||||
$(CMD.SWIG) $(SWIG.FLAGS) -o $(<) $(>)
|
||||
$(SED) $(SWIG.SED_SCRIPT) < $(<) > $(<).sed
|
||||
$(RM) $(<)
|
||||
$(MV) $(<).sed $(<)
|
||||
}
|
||||
|
||||
SWIG.SIMPLE.LANGUAGE ?= python ;
|
||||
SWIG.SIMPLE.EXT ?= py ;
|
||||
SWIG.SIMPLE.FLAGS ?= -c++ -shadow ;
|
||||
|
||||
## SimpleSwig swigfile
|
||||
## Given a Swig input file (.i), invokes Swig to generate a .cpp file with
|
||||
## the same basename, and a script file with the same basename.
|
||||
## SWIG.SIMPLE.LANGUAGE specifies the language for which Swig should emit a
|
||||
## binding; SWIG.SIMPLE.EXT indicates the file extension of the generated
|
||||
## script file; SWIG.SIMPLE.FLAGS specifies additional flags for Swig.
|
||||
rule SimpleSwig
|
||||
{
|
||||
local object = [ DoObjectGrist $(<:S=$(SUFOBJ)) ] ;
|
||||
local cppfile = $(<:S=.cpp) ;
|
||||
local script = $(<:S=.$(SWIG.SIMPLE.EXT)) ;
|
||||
|
||||
C++ $(object) : $(cppfile) ;
|
||||
Swig $(cppfile) $(script) : $(<) : $(SWIG.SIMPLE.LANGUAGE) :
|
||||
$(SWIG.SIMPLE.FLAGS) ;
|
||||
|
||||
return $(object) ;
|
||||
}
|
||||
RegisterFileType SimpleSwig : .i ;
|
||||
|
||||
if ! $(NO_SWIG_HEADER_SCANNING)
|
||||
{
|
||||
SWIG.HDRPATTERN =
|
||||
"^[ ]*[%#][ ]*include[ ]*[<\"]([^\">]*)[\">].*$" ;
|
||||
RegisterHeaderRule HeaderRule : $(SWIG.HDRPATTERN) : .i ;
|
||||
}
|
||||
}
|
||||
576
mk/jam/unittest.jam
Normal file
576
mk/jam/unittest.jam
Normal file
@@ -0,0 +1,576 @@
|
||||
#==============================================================================
|
||||
# Jam rules for unit testing with CppTest (http://cpptest.sourceforge.net/)
|
||||
# Copyright (C) 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.
|
||||
#
|
||||
#==============================================================================
|
||||
if $(CPPUNIT.AVAILABLE) = yes
|
||||
{
|
||||
|
||||
UNITTEST_VERBOSE ?= yes ;
|
||||
UNITTEST_RUNFLAGS ?= ;
|
||||
if $(UNITTEST_VERBOSE) = yes
|
||||
{
|
||||
UNITTEST_RUNFLAGS += "--verbose" ;
|
||||
}
|
||||
|
||||
## UnitTest module [ : testdirs [ : extensions ] ]
|
||||
##
|
||||
## This rule provides a dynamic unit testing framework which utilizes CppUnit
|
||||
## (http://cpptest.sourceforge.net/). The invocation:
|
||||
##
|
||||
## UnitTest <module> ;
|
||||
##
|
||||
## sets up unit testing support for `module' if $(SUBDIR)/t/ exists for
|
||||
## `module' and contains test fragment files (*.t) and/or header (*.h) files.
|
||||
## If `testdirs' is provided, then it is a list of directory to scan for test
|
||||
## fragments instead of `t/'. If `extensions' is provided, then it is a list of
|
||||
## file extensions for which to search instead of `.t'.
|
||||
##
|
||||
## It is safe to invoke this rule for modules which do not have a `t/'
|
||||
## subdirectory, in which case the rule invocation is silently ignored. The
|
||||
## UnitTest rule automatically synthesizes an appropriate driver program which
|
||||
## incorporates the test fragment files (*.t), thus eliminating a boring and
|
||||
## error-prone task.
|
||||
##
|
||||
## The Application, Library, and Plugin rules automatically invoke UnitTest on
|
||||
## behalf of the client (unless given the `notest' option), so the vast
|
||||
## majority of modules in a project inherit unit testing support automatically
|
||||
## and for free. Simply populating a `t/' subdirectory with unit testing
|
||||
## fragment files (*.t) is typically all that is needed to enable unit testing
|
||||
## for an application, library, or plugin.
|
||||
##
|
||||
## The unit testing Jam target for `module' is named "check_module". In
|
||||
## addition to this module-level granularity, the UnitTest rule also provides
|
||||
## dynamic directory-based granularity. For example, presume that the following
|
||||
## abbreviated list of directories exist in a project tree:
|
||||
##
|
||||
## apps/example
|
||||
## libs/common
|
||||
## plugins/bindings/perl_b
|
||||
## plugins/bindings/python_b
|
||||
## plugins/bindings/ruby_b
|
||||
##
|
||||
## The following module-based unit testing Jam targets will be created
|
||||
## (assuming that the appropriate test fragment files, $(SUBDIR)/t/*.t, exist
|
||||
## in each directory):
|
||||
##
|
||||
## check_example
|
||||
## check_common
|
||||
## check_perl_b
|
||||
## check_python_b
|
||||
## check_ruby_b
|
||||
##
|
||||
## Furthermore, the following directory-based targets also will be created
|
||||
## dynamically:
|
||||
##
|
||||
## check (and its alias check_all)
|
||||
## check_apps
|
||||
## check_apps_example
|
||||
## check_libs
|
||||
## check_libs_common
|
||||
## check_plugins
|
||||
## check_plugins_bindings
|
||||
## check_plugins_bindings_perl_b
|
||||
## check_plugins_bindings_python_b
|
||||
## check_plugins_bindings_ruby_b
|
||||
##
|
||||
## The very neat thing about the directory-based targets is that they
|
||||
## automatically synthesize a driver program which incorporates all of the
|
||||
## tests contained in child directories. For instance, the `check_plugins'
|
||||
## target creates a unit testing driver which incorporates the tests from the
|
||||
## bindings/perl_b/t, bindings/python_b/t, and bindings/ruby_b/t directories;
|
||||
## and the `check_all' target creates a driver which incorporates all tests in
|
||||
## the entire project. This allows entire selected branches of tests to be run
|
||||
## all at once rather than having to run several different driver programs to
|
||||
## get a complete report.
|
||||
##
|
||||
## The unit testing framework automatically wraps each test fragment file (*.t)
|
||||
## into a synthesized C++ source file containing CppUnit boilerplate, such as
|
||||
## necessary #include directives, #defines, etc. This allows the fragment
|
||||
## files to be as simple as possible. They need #include only headers related
|
||||
## to the actual module being tested, but need not worry about setting up the
|
||||
## CppUnit environment since that is done automatically. A typical fragment
|
||||
## file might look like this:
|
||||
##
|
||||
## /* Test file: libs/common/t/array.t */
|
||||
##
|
||||
## #include "common/myarray.h"
|
||||
##
|
||||
## class MyArrayTest : public CppUnit::TestFixture
|
||||
## {
|
||||
## public:
|
||||
## void setUp() { ...set up test data... }
|
||||
## void tearDown() { ...destroy test data... }
|
||||
##
|
||||
## void testInsert() { ...test array insertion methods... }
|
||||
## void testDelete() { ...test array deletion methods... }
|
||||
##
|
||||
## CPPUNIT_TEST_SUITE(MyArrayTest);
|
||||
## CPPUNIT_TEST(testInsert);
|
||||
## CPPUNIT_TEST(testDelete);
|
||||
## CPPUNIT_TEST_SUITE_END();
|
||||
## };
|
||||
##
|
||||
## When the UnitTest rule synthesizes C++ wrappers for the test fragments, it
|
||||
## needs to figure out the names of classes which contain tests. The synthesis
|
||||
## process makes this determination by examining *.t and *.h files for
|
||||
## subclasses of CppUnit::TestFixture. For this to work correctly, the
|
||||
## "class Foo : public CppUnit::TestFixture" declaration must not be split over
|
||||
## multiple lines.
|
||||
##
|
||||
## It is possible to have extra text added at the beginning and end of the
|
||||
## synthesized C++ source code for both the *.t wrappers and the driver
|
||||
## programs by optionally defining the following Jam variables (perhaps in
|
||||
## Jamrules) with whatever text you would like inserted into the synthesized
|
||||
## files:
|
||||
##
|
||||
## UNITTEST_BOILERPLATE_TEST_PRE
|
||||
## UNITTEST_BOILERPLATE_TEST_POST
|
||||
## UNITTEST_BOILERPLATE_MAIN_PRE
|
||||
## UNITTEST_BOILERPLATE_MAIN_POST
|
||||
##
|
||||
## Thest `TEST' variables apply to the *.t wrappers, and the `MAIN' variables
|
||||
## apply to the driver programs into which the wrappers are linked. If you find
|
||||
## that you are including common code in all of your *.t files, then you may
|
||||
## want to simplify by propagating the common code to the `TEST' boilerplate
|
||||
## instead.
|
||||
##
|
||||
rule UnitTest
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local testdirs = $(2) ;
|
||||
local exts = $(3) ;
|
||||
if ! $(testdirs) { testdirs = t ; }
|
||||
if ! $(exts) { exts = .t ; }
|
||||
|
||||
local test_clean = [ UnitTestNameClean $(mod) ] ;
|
||||
local oldsubdir = $(SUBDIR_TOKENS) ;
|
||||
|
||||
local testdir ;
|
||||
for testdir in $(testdirs)
|
||||
{
|
||||
SubDir TOP $(oldsubdir) $(testdir) ;
|
||||
|
||||
local tests_obj ;
|
||||
local tests = [ Recurse : $(exts) ] ;
|
||||
local headers = [ Recurse : .h .hpp .hxx .H ] ;
|
||||
if $(tests) || $(headers)
|
||||
{
|
||||
tests = [ DoSourceGrist $(tests) ] ;
|
||||
SEARCH on $(tests) = $(SEARCH_SOURCE) ;
|
||||
|
||||
local tests_src = $(tests:S=.cpp) ;
|
||||
MakeLocate $(tests_src) : $(LOCATE_TARGET) ;
|
||||
Clean $(test_clean) : $(tests_src) ;
|
||||
|
||||
# For each fragment (*.t), create a C++ wrapper. Automatically register
|
||||
# subclasses of CppUnit::TestFixture.
|
||||
local i ;
|
||||
for i in $(tests)
|
||||
{
|
||||
Includes $(i:S=.cpp) : $(i) ;
|
||||
UnitTestSource $(i:S=.cpp) : $(i) ;
|
||||
}
|
||||
|
||||
# Also search for CppUnit::TestFixture subclasses in headers (*.h) and
|
||||
# synthesize a C++ wrapper which registers them.
|
||||
if $(headers)
|
||||
{
|
||||
headers = [ DoSourceGrist $(headers) ] ;
|
||||
SEARCH on $(headers) = $(SEARCH_SOURCE) ;
|
||||
local suitereg = [ DoSourceGrist __suitereg.cpp ] ;
|
||||
MakeLocate $(suitereg) : $(LOCATE_TARGET) ;
|
||||
UnitTestSource $(suitereg) : $(headers) ;
|
||||
Includes $(suitereg) : $(headers) ;
|
||||
tests_src += $(suitereg) ;
|
||||
}
|
||||
|
||||
# Compile all synthesized sources.
|
||||
tests_obj = [ CompileObjects $(tests_src) ] ;
|
||||
CCHDRS on $(tests_obj) += [ FIncludes $(SEARCH_SOURCE) ] ;
|
||||
C++FLAGS on $(tests_obj) += $(COMPILER.C++FLAGS.EXCEPTIONS.ENABLE)
|
||||
$(CPPUNIT.CFLAGS) ;
|
||||
Clean $(test_clean) : $(tests_obj) ;
|
||||
|
||||
# Create the driver for "check_module".
|
||||
UnitTestDriver $(mod) : $(tests_obj) ;
|
||||
# Dynamically create the drivers for all parent directories.
|
||||
UnitTestDynamicTargets $(mod) : $(tests_obj) : $(oldsubdir) ;
|
||||
}
|
||||
}
|
||||
|
||||
SubDir TOP $(oldsubdir) ;
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# PRIVATE UTILITY RULES
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
# UnitTestDriver module : objs [ : owner ]
|
||||
# Given a set of object files which represent test fragment wrappers for
|
||||
# `module', set up the driver program which incorporates them, and create the
|
||||
# "check_module" and "check_moduleclean" targets. For invocations which arise
|
||||
# from the UnitTest rule, `module' will be the actual module for which
|
||||
# testing is being arranged, and `objs' will be the complete set of test
|
||||
# objects for `module'. For directory-based testing drivers, `module' will be
|
||||
# the dynamically synthesized module name representing the directory for
|
||||
# which testing is being arranged, and `objs' will be only a subset of all
|
||||
# objects which ultimately will be incorporated into this synthesized driver
|
||||
# (specifically, the subset will be the objects belonging to `owner'). This
|
||||
# rule may be invoked multiple times for the same synthesized directory-based
|
||||
# driver `module' in order to accumulate the object files from all child
|
||||
# directories (recursively).
|
||||
#
|
||||
# Since the driver programs in parent directories are actually conglomerates
|
||||
# of the objects from many different modules, this rule is invoked multiple
|
||||
# times for any given directory-based driver program. Each invocations
|
||||
# presents it with a different set of object files. Therefore, it must take
|
||||
# special care. In particular, the first time this rule is invoked for a
|
||||
# synthesized driver in a particular directory, it actually creates the
|
||||
# application target; on subsequent invocations for the same directory, it
|
||||
# merely adds `objs' to the already-created application target. This way,
|
||||
# the a directory's dynamically synthesized driver program can incorporate
|
||||
# objects from all of its child directories (recursively).
|
||||
#
|
||||
# The `owner' is the module which owns the object files, `objs'. In the
|
||||
# example illustrated for the UnitTest rule, when the "check_libs" driver
|
||||
# program is under creation from within the `UnitTest common' invocation, the
|
||||
# owner will be "common". This information is needed in order to ensure that
|
||||
# the driver program synthesized at the "libs" level, which incorporates
|
||||
# "common"'s object files, can gain access to "common's" linker flags (since
|
||||
# they will be needed for linking the directory-based driver). If `owner' is
|
||||
# not provided, then it defaults to `module'.
|
||||
rule UnitTestDriver
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local objs = $(2) ;
|
||||
local owner = $(3) ;
|
||||
if ! $(owner) { owner = $(mod) ; }
|
||||
|
||||
local test_name = [ UnitTestNameTest $(mod) ] ;
|
||||
local test_clean = [ UnitTestNameClean $(mod) ] ;
|
||||
|
||||
# This is the low-level target name by which a unit testing driver program is
|
||||
# known. We only create the target the first time we are called at a
|
||||
# particular directory level (thus the module_UNITTESTS check). Upon
|
||||
# subsequent invocations, we merely add the new objects files to the existing
|
||||
# driver.
|
||||
|
||||
local test_driver = $(mod)_unittest ;
|
||||
if ! $($(mod)_UNITTESTS)
|
||||
{
|
||||
$(mod)_UNITTESTS = $(test_driver) ;
|
||||
|
||||
# Create the actual driver program represented by the `test_driver' target.
|
||||
local test_driver_target =
|
||||
[ DoObjectGrist [ ConstructApplicationTarget __unittest : console ] ] ;
|
||||
MakeLocate $(test_driver_target) : $(LOCATE_TARGET) ;
|
||||
$(test_driver)_TYPE = application ;
|
||||
$(test_driver)_TARGET = $(test_driver_target) ;
|
||||
$(test_driver)_OBJECTS = $(objs) ;
|
||||
SystemLinkApplication $(test_driver) : $(objs) [ UnitTestCommonObj ] :
|
||||
console ;
|
||||
CFlags $(test_driver) : $(APPLICATION.CFLAGS) ;
|
||||
LFlags $(test_driver) : $(LINKLIBS) $(APPLICATION.LFLAGS)
|
||||
$(CPPUNIT.LFLAGS) ;
|
||||
|
||||
Depends $(test_name) : $(test_driver_target) ;
|
||||
Clean $(test_clean) : $(test_driver_target) ;
|
||||
|
||||
# Actually run the unit tests.
|
||||
NotFile $(test_name) $(test_clean) ;
|
||||
Always $(test_name) $(test_clean) ;
|
||||
Depends checkclean : $(test_clean) ;
|
||||
UnitTestRun $(test_name) : $(test_driver_target) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ExtraObjects $(test_driver) : $(objs) ;
|
||||
}
|
||||
|
||||
# Apply appropriate linker flags to the driver program. This has two parts:
|
||||
# (1) If these are the unit tests for a library, then, as a convenience,
|
||||
# assume that the tests need to link against that library.
|
||||
# (2) For directory-based test targets, the driver needs all of the linker
|
||||
# flags required by its child directories (recursively). For example, in
|
||||
# the earlier cited illustration, the "check_all", and "check_libs"
|
||||
# targets will also need whatever linker flags libs/common itself
|
||||
# requires.
|
||||
|
||||
if $($(owner)_TYPE) = library { LinkWith $(test_driver) : $(owner) ; }
|
||||
LinkWith $(test_driver) : [ on $($(owner)_TARGET) GetVar NEEDLIBS ] ;
|
||||
|
||||
return $(test_driver) ;
|
||||
}
|
||||
|
||||
# UnitTestCommonObj
|
||||
# Create object files common to all driver programs. Presently, the only
|
||||
# common component is the main() function, which utilizes CppUnit's automatic
|
||||
# test discovery protocol to discover test classes. (These are the subclasses
|
||||
# of CppUnit::TestFixture for which we scan and pass to the
|
||||
# CPPUNIT_TEST_SUITE_REGISTRATION() macro.)
|
||||
rule UnitTestCommonObj
|
||||
{
|
||||
if ! $(UNITTEST_COMMON_OBJ)
|
||||
{
|
||||
local test_main_dir = [ ConcatDirs $(LOCATE.OBJECTS) __unittest_common ] ;
|
||||
local test_main_src = main.cpp ;
|
||||
test_main_src = $(test_main_src:G=__unittest) ;
|
||||
MakeLocate $(test_main_src) : $(test_main_dir) ;
|
||||
UnitTestMain $(test_main_src) ;
|
||||
Clean checkclean : $(test_main_src) ;
|
||||
|
||||
local test_main_obj = [ CompileObjects $(test_main_src) ] ;
|
||||
MakeLocate $(test_main_obj) : $(test_main_dir) ;
|
||||
C++FLAGS on $(test_main_obj) += $(COMPILER.C++FLAGS.EXCEPTIONS.ENABLE)
|
||||
$(CPPUNIT.CFLAGS) ;
|
||||
Clean checkclean : $(test_main_obj) ;
|
||||
|
||||
UNITTEST_COMMON_OBJ = $(test_main_obj) ;
|
||||
}
|
||||
return $(UNITTEST_COMMON_OBJ) ;
|
||||
}
|
||||
|
||||
# UnitTestDynamicTargets module : objs : subdir_tokens
|
||||
# Given a set of subdirectory tokens representing the location of `module' in
|
||||
# the source tree, dynamically synthesize a test driver program in each
|
||||
# parent directory leading up to module's location. Each synthesized test
|
||||
# program will incorporate module's `objs', as well as the objects of all
|
||||
# other children (recursively) of the directory containing each driver. (The
|
||||
# additional objects will be incorporated by subsequent invocations for the
|
||||
# same directories.)
|
||||
rule UnitTestDynamicTargets
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local objs = $(2) ;
|
||||
local subdir_tokens = $(3) ;
|
||||
|
||||
# There is no need to synthesize a driver for the directory in which `module'
|
||||
# itself resides, since we already have a "check_module" target for that.
|
||||
# Therefore, simply alias this directory entry to the existing "check_module"
|
||||
# target.
|
||||
|
||||
local deepest_name = [ UnitTestNameTest $(subdir_tokens:J=_) ] ;
|
||||
local deepest_clean = [ UnitTestNameClean $(subdir_tokens:J=_) ] ;
|
||||
NotFile $(deepest_name) $(deepest_clean) ;
|
||||
Depends $(deepest_name) : [ UnitTestNameTest $(mod) ] ;
|
||||
Depends $(deepest_clean) : [ UnitTestNameClean $(mod) ] ;
|
||||
|
||||
# For each parent directory of `module', synthesize a driver target.
|
||||
local tokens = [ FReverse $(subdir_tokens) ] ;
|
||||
tokens = $(tokens[2-]) ;
|
||||
while $(tokens)
|
||||
{
|
||||
UnitTestDynamicTarget $(mod) : $(objs) : [ FReverse $(tokens) ] ;
|
||||
tokens = $(tokens[2-]) ;
|
||||
}
|
||||
|
||||
# Synthesize a "check_all" target which incorporates all tests projectwide.
|
||||
UnitTestDynamicTarget $(mod) : $(objs) : : all ;
|
||||
}
|
||||
|
||||
# UnitTestDynamicTarget module : objs : dir_tokens [ : dyn_module ]
|
||||
# The workhorse for UnitTestDynamicTargets which actually changes to the
|
||||
# specified directory and creates the driver program. The "check_foo" target
|
||||
# name is normally composed of the directory tokens joined with underscores
|
||||
# (i.e. "check_dir_tokens") unless the optional `dyn_module' is provided, in
|
||||
# which case the target name becomes "check_dyn_module".
|
||||
rule UnitTestDynamicTarget
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local objs = $(2) ;
|
||||
local dir_tokens = $(3) ;
|
||||
local dyn_mod = $(4) ;
|
||||
if ! $(dyn_mod) { dyn_mod = $(dir_tokens:J=_) ; }
|
||||
|
||||
local olddir = $(SUBDIR_TOKENS) ;
|
||||
SubDir TOP $(dir_tokens) ;
|
||||
|
||||
local test_driver = [ UnitTestDriver $(dyn_mod) : $(objs) : $(mod) ] ;
|
||||
|
||||
# Use module_UNITTESTS to remember that this dynamically synthesized driver
|
||||
# has a relation to `module'. This information is needed later when clients
|
||||
# invoke CFlags, LFlags, and LibDepends for `module'. Not only must those
|
||||
# settings be applied to `module', but we must also apply them to module's
|
||||
# test driver, as well as all of the directory-based drivers which
|
||||
# incorporate module's test objects. This is what the UnitTestCFlags,
|
||||
# UnitTestLFlags, and UnitTestLibDepends rules do.
|
||||
|
||||
$(mod)_UNITTESTS += $(test_driver) ;
|
||||
|
||||
SubDir TOP $(olddir) ;
|
||||
}
|
||||
|
||||
# UnitTestNameTest module
|
||||
# Return the name of the "check_module" target for `module'.
|
||||
rule UnitTestNameTest
|
||||
{ return check_$(<) ; }
|
||||
|
||||
# UnitTestNameClean module
|
||||
# Return the name of the "check_moduleclean" target for `module'.
|
||||
rule UnitTestNameClean
|
||||
{ local n = [ UnitTestNameTest $(<) ] ; return $(n)clean ; }
|
||||
|
||||
# UnitTestCFlags module : flags [ : options ]
|
||||
# Hook invoked automatically by CFlags. Applies `flags' also to module's test
|
||||
# driver.
|
||||
rule UnitTestCFlags
|
||||
{
|
||||
# Empty for now. Presumably the compiler flags are needed only by the actual
|
||||
# sources of `module'; not by its tests which merely link against module's
|
||||
# objects. This assumption may be wrong, and may change in the future.
|
||||
}
|
||||
|
||||
# UnitTestLFlags module : flags [ : options ]
|
||||
# Hook invoked automatically by LFlags. Applies `flags' also to module's test
|
||||
# driver and to all directory-based drivers which incorporate module's test
|
||||
# objects.
|
||||
rule UnitTestLFlags
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local flags = $(2) ;
|
||||
local options = $(3) ;
|
||||
local unittests = $($(mod)_UNITTESTS) ;
|
||||
local u ;
|
||||
for u in $(unittests)
|
||||
{
|
||||
LFlags $(u) : $(flags) : $(options) ;
|
||||
}
|
||||
}
|
||||
|
||||
# UnitTestLibDepends module : deps
|
||||
# Hook invoked automatically by LibDepends. Applies `deps' also to module's
|
||||
# test driver and to all directory-based drivers which incorporate module's
|
||||
# test objects.
|
||||
rule UnitTestLibDepends
|
||||
{
|
||||
local mod = $(1) ;
|
||||
local libs = $(2) ;
|
||||
local unittests = $($(mod)_UNITTESTS) ;
|
||||
local u ;
|
||||
for u in $(unittests)
|
||||
{
|
||||
LinkWith $(u) : $(libs) ;
|
||||
}
|
||||
}
|
||||
|
||||
# UnitTestSource wrapper : files
|
||||
# Create a `wrapper' which #includes all `files' (which are probably *.t test
|
||||
# fragments or headers). Also scan `files' for subclasses of
|
||||
# CppUnit::TestFixture and invoke CPPUNIT_TEST_SUITE_REGISTRATION() for each
|
||||
# discovery.
|
||||
actions UnitTestSource
|
||||
{
|
||||
cat <<EOF > $(<)
|
||||
// Automatically generated; do not edit.
|
||||
#include <string>
|
||||
#include <cppunit/TestCaller.h>
|
||||
#include <cppunit/TestFixture.h>
|
||||
#include <cppunit/TestSuite.h>
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
$(UNITTEST_BOILERPLATE_TEST_PRE)
|
||||
EOF
|
||||
for i in $(>:BS); do
|
||||
echo '#include "'$i'"' >> $(<)
|
||||
done
|
||||
for i in $(>); do
|
||||
classes=`sed '/public[ ][ ]*CppUnit::TestFixture/!d;\
|
||||
s/class[ ][ ]*\([^ ][^ ]*\)[ ]*:.*/\1/' < $i`
|
||||
for c in $classes; do
|
||||
echo "CPPUNIT_TEST_SUITE_REGISTRATION($c);" >> $(<)
|
||||
done
|
||||
done
|
||||
cat <<EOF >> $(<)
|
||||
$(UNITTEST_BOILERPLATE_TEST_POST)
|
||||
EOF
|
||||
}
|
||||
|
||||
# UnitTestMain file
|
||||
# Create a generic main() which is used for all test driver programs. It
|
||||
# uses CppUnit's automated test class discovery protocol to discover classes
|
||||
# containing tests, therefore it is entirely generic and can be used by any
|
||||
# number of driver programs.
|
||||
actions UnitTestMain
|
||||
{
|
||||
cat <<EOF > $(<)
|
||||
// Automatically generated; do not edit.
|
||||
#include <string>
|
||||
#include <cppunit/BriefTestProgressListener.h>
|
||||
#include <cppunit/TestResult.h>
|
||||
#include <cppunit/extensions/TestFactoryRegistry.h>
|
||||
#include <cppunit/ui/text/TestRunner.h>
|
||||
$(UNITTEST_BOILERPLATE_MAIN_PRE)
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
bool verbose = false;
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
char const* s = argv[i];
|
||||
if (*s == '-')
|
||||
{
|
||||
do { s++; } while (*s == '-');
|
||||
verbose = (*s == 'v' || *s == 'V');
|
||||
if (verbose)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CppUnit::TextUi::TestRunner runner;
|
||||
CppUnit::TestFactoryRegistry& registry =
|
||||
CppUnit::TestFactoryRegistry::getRegistry();
|
||||
CppUnit::BriefTestProgressListener listener;
|
||||
if (verbose)
|
||||
runner.eventManager().addListener(&listener);
|
||||
runner.addTest(registry.makeTest());
|
||||
return runner.run("", false, true, !verbose) ? 0 : -1;
|
||||
}
|
||||
$(UNITTEST_BOILERPLATE_MAIN_POST)
|
||||
EOF
|
||||
}
|
||||
|
||||
# UnitTestRun check_target : program
|
||||
# Actually run the unit test driver `program' for the invocation target
|
||||
# `check_target'.
|
||||
actions UnitTestRun
|
||||
{
|
||||
$(>) $(UNITTEST_RUNFLAGS)
|
||||
}
|
||||
|
||||
}
|
||||
else # !CPPUNIT.AVAILABLE
|
||||
{
|
||||
|
||||
rule UnitTest { }
|
||||
rule UnitTestCFlags { }
|
||||
rule UnitTestLFlags { }
|
||||
rule UnitTestLibDepends { }
|
||||
|
||||
actions UnitTestDisabled
|
||||
{
|
||||
echo "$(<): Unit testing disabled (CppUnit not installed)."
|
||||
}
|
||||
|
||||
Always check_all ;
|
||||
Depends check : check_all ;
|
||||
UnitTestDisabled check_all ;
|
||||
|
||||
}
|
||||
|
||||
NotFile check checkclean check_all check_allclean ;
|
||||
Depends check : check_all ;
|
||||
Depends clean : checkclean ;
|
||||
Help check : "Run unit tests" ;
|
||||
151
mk/jam/unix.jam
Normal file
151
mk/jam/unix.jam
Normal file
@@ -0,0 +1,151 @@
|
||||
#============================================================================
|
||||
# Jam configuration and actions for Unix (GNU/Linux, BSD, Darwin, etc.)
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
SHELL ?= "/bin/sh" ;
|
||||
|
||||
# Only use nasm on x86 for now...
|
||||
NASM.FLAGS += -f elf ;
|
||||
|
||||
PLUGIN.CFLAGS += $(COMPILER.C++FLAGS.PIC) ;
|
||||
LIBRARY.CFLAGS += $(COMPILER.C++FLAGS.PIC) ;
|
||||
|
||||
# The BFD tag name under which to embed meta-information into a plugin module.
|
||||
# This much match the name expected by csGetPluginMetadata() (bfdplugins.cpp).
|
||||
SECTION_TAG_NAME ?= .crystalspace ;
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# platform specific rules
|
||||
|
||||
## ConstructApplicationTarget target : options
|
||||
## Constructs the application target name (ie. foo.exe for foo)
|
||||
rule ConstructApplicationTarget
|
||||
{
|
||||
return $(<) ;
|
||||
}
|
||||
rule ConstructStaticLibraryTarget
|
||||
{
|
||||
return lib$(<)$(SUFLIB) ;
|
||||
}
|
||||
rule ConstructSharedLibraryTarget
|
||||
{
|
||||
return lib$(<).so.$(PACKAGE_VERSION) ;
|
||||
}
|
||||
rule ConstructSharedLibraryLinkLib
|
||||
{
|
||||
return lib$(<).so.$(PACKAGE_VERSION) ;
|
||||
}
|
||||
rule ConstructPluginTarget
|
||||
{
|
||||
return $(<).so ;
|
||||
}
|
||||
|
||||
# SystemLinkApplication target : objects : options
|
||||
# do system specific actions needed for linking the application and construct
|
||||
# correct clean targets.
|
||||
rule SystemLinkApplication
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
|
||||
Depends $(target) : $(>) ;
|
||||
LinkApplication $(target) : $(>) ;
|
||||
# setup clean rules
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
|
||||
rule SystemInstallApplication
|
||||
{
|
||||
Depends install_bin :
|
||||
[ DoInstall $(<) : $(bindir) $(2) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
rule SystemInstallPlugin
|
||||
{
|
||||
Depends install_plugin : [ DoInstall $(<) : $(plugindir) $(2) :
|
||||
$(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
# Put the meta data into the object file headers
|
||||
rule ObjTagMetaData
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
}
|
||||
actions ObjTagMetaData
|
||||
{
|
||||
$(CMD.OBJCOPY) --add-section $(SECTION_TAG_NAME)=$(>) $(<)
|
||||
}
|
||||
|
||||
# SystemLinkPlugin target : objects : options
|
||||
# do system specific actions needed for linking the plugin and construct
|
||||
# correct clean targets.
|
||||
rule SystemLinkPlugin
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
|
||||
Depends $(target) : $(>) ;
|
||||
LinkPlugin $(target) : $(>) ;
|
||||
if $(EMBED_META) = "yes" && $(OBJCOPY.AVAILABLE) = "yes"
|
||||
{
|
||||
ObjTagMetaData $(target) : $($(<)_METAFILE) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
PluginMetaData $(<) : $($(<)_METAFILE) : $(3) ;
|
||||
}
|
||||
# setup clean rules
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
|
||||
rule SystemLinkSharedLibrary
|
||||
{
|
||||
LFlags $(<) : $(LINKLIBS) ;
|
||||
Depends $(<) : $(>) ;
|
||||
LinkSharedLibrary $(<) : $(>) : $(3) ;
|
||||
|
||||
Clean clean : $(<) ;
|
||||
Clean $(<)clean : $(<) ;
|
||||
}
|
||||
|
||||
actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
|
||||
if $(PLUGIN.LFLAGS.USE_SONAME) = "yes"
|
||||
{
|
||||
actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) \
|
||||
-Wl,-soname,$(<:BS)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
}
|
||||
|
||||
actions LinkSharedLibrary bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -shared -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS) \
|
||||
-Wl,-soname,$(<:BS)
|
||||
}
|
||||
58
mk/jam/variant.jam
Normal file
58
mk/jam/variant.jam
Normal file
@@ -0,0 +1,58 @@
|
||||
#============================================================================
|
||||
# Setup of compiler/linker flags for debug/optimize mode
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#============================================================================
|
||||
|
||||
if ! $(VARIANT)
|
||||
{
|
||||
VARIANT = $(MODE) ;
|
||||
}
|
||||
|
||||
if $(VARIANT) != "debug" && $(VARIANT) != "optimize" && $(VARIANT) != "profile"
|
||||
{
|
||||
exit "Invalid modus set, please set VARIANT to debug, profile or optimize" ;
|
||||
}
|
||||
|
||||
# Set modus related flags
|
||||
CCFLAGS += $(COMPILER.CFLAGS) $(COMPILER.CFLAGS.$(VARIANT)) ;
|
||||
C++FLAGS += $(COMPILER.CFLAGS) $(COMPILER.C++FLAGS)
|
||||
$(COMPILER.CFLAGS.$(VARIANT)) $(COMPILER.C++FLAGS.$(VARIANT)) ;
|
||||
LINKLIBS += $(COMPILER.LFLAGS) $(COMPILER.LFLAGS.$(VARIANT)) ;
|
||||
LOCATE.OBJECTS = $(LOCATE.OBJECTS)/$(VARIANT) ;
|
||||
|
||||
## SubVariant variantname
|
||||
## Specify subvariant which are placed in separate compilation directories.
|
||||
SUBVARIANT ?= "" ;
|
||||
SAVED_LOCATE_TARGET = "" ;
|
||||
rule SubVariant
|
||||
{
|
||||
if ! $(<)
|
||||
{
|
||||
SUBVARIANT = $(SUBVARIANT[2]) ;
|
||||
SUBVARIANT ?= "" ;
|
||||
LOCATE_TARGET = $(SAVED_LOCATE_TARGET[1]) ;
|
||||
SAVED_LOCATE_TARGET = $(SAVED_LOCATE_TARGET[2-]) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
SUBVARIANT = $(<) $(SUBVARIANT) ;
|
||||
SAVED_LOCATE_TARGET = $(LOCATE_TARGET) $(SAVED_LOCATE_TARGET) ;
|
||||
LOCATE_TARGET = $(LOCATE_TARGET)/$(<) ;
|
||||
}
|
||||
}
|
||||
|
||||
563
mk/jam/win32.jam
Normal file
563
mk/jam/win32.jam
Normal file
@@ -0,0 +1,563 @@
|
||||
#============================================================================
|
||||
# Jam configuration and actions for Win32
|
||||
# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net>
|
||||
# Copyright (C)2004 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.
|
||||
#
|
||||
#============================================================================
|
||||
SHELL ?= "/bin/sh" ;
|
||||
|
||||
CMD.WINDRES ?= windres ;
|
||||
# DLL-tools not used by this script, but clients might have a need for them.
|
||||
CMD.DLLTOOL ?= dlltool ;
|
||||
CMD.DLLWRAP ?= dllwrap ;
|
||||
|
||||
USE_DLLWRAP ?= no ;
|
||||
|
||||
NASM.FLAGS += -f win32 -DEXTERNC_UNDERSCORE ;
|
||||
CCFLAGS += -pipe ;
|
||||
C++FLAGS += -pipe ;
|
||||
LINKLIBS += -L/usr/lib/w32api -lgdi32 -lshell32 ;
|
||||
PLUGIN.LFLAGS += -mwindows ;
|
||||
WINDRES.FLAGS = --use-temp-file ;
|
||||
|
||||
if "$(USE_DLLWRAP)" = "yes"
|
||||
{
|
||||
PLUGIN.LFLAGS = [ Filter $(PLUGIN.LFLAGS) : -shared ] ;
|
||||
}
|
||||
|
||||
# Natively-built Jam 2.5 (and probably earlier) on Cygwin fails to perform
|
||||
# library scanning properly and think that all object files need to be rebuilt
|
||||
# (along with everything which depends upon them) when "jam install" follows
|
||||
# "jam all", so disable this feature.
|
||||
if $(OS) = "CYGWIN"
|
||||
{
|
||||
NOARSCAN = true ;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# resource handling
|
||||
# Unfortunately we can't simply specify resources on the source list, because
|
||||
# Mingw/Cygwin have the limitation that they can only link 1 resource file
|
||||
# in. So we have to concatenate all resourcefiles here before compiling them.
|
||||
|
||||
actions GenerateWin32VersionRc
|
||||
{
|
||||
cat > $(<) << __EOF__
|
||||
// This file is generated automatically.
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION $(PACKAGE_VERSION_LIST[1]), $(PACKAGE_VERSION_LIST[2]), $(PACKAGE_VERSION_LIST[3]), $(PACKAGE_VERSION_LIST[4])
|
||||
PRODUCTVERSION $(PACKAGE_VERSION_LIST[1]), $(PACKAGE_VERSION_LIST[2]), $(PACKAGE_VERSION_LIST[3]), $(PACKAGE_VERSION_LIST[4])
|
||||
#ifdef CS_DEBUG
|
||||
FILEFLAGS 0x1
|
||||
#else
|
||||
FILEFLAGS 0x0
|
||||
#endif
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904E4"
|
||||
{
|
||||
VALUE "ProductName", "$(PRODUCT_NAME)"
|
||||
VALUE "ProductVersion", "$(PACKAGE_VERSION)"
|
||||
VALUE "FileVersion", "$(PACKAGE_VERSION)"
|
||||
VALUE "LegalCopyright", "$(PACKAGE_COPYRIGHT)"
|
||||
VALUE "FileDescription", "$(PRODUCT_DESCRIPTION)"
|
||||
#ifdef CS_DEBUG
|
||||
VALUE "Comments", "Debug build"
|
||||
#else
|
||||
VALUE "Comments", "Release build"
|
||||
#endif
|
||||
VALUE "WWW", "$(PACKAGE_HOMEPAGE)"
|
||||
}
|
||||
}
|
||||
}
|
||||
__EOF__
|
||||
}
|
||||
|
||||
actions GenerateWin32ManifestRc
|
||||
{
|
||||
cat > $(<) << __EOF__
|
||||
// This file is generated automatically.
|
||||
1 24 "$(MANIFEST_NAME)"
|
||||
__EOF__
|
||||
}
|
||||
|
||||
actions GenerateWin32Manifest
|
||||
{
|
||||
cat > $(<) << __EOF__
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<!-- This file is generated automatically. -->
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity
|
||||
__EOF__
|
||||
|
||||
# Filter out non-numerical characters from the version number. Windows does
|
||||
# not like them.
|
||||
echo '$(PACKAGE_VERSION_LIST[1]).$(PACKAGE_VERSION_LIST[2]).$(PACKAGE_VERSION_LIST[3]).$(PACKAGE_VERSION_LIST[4])' | $(SED) 's/[^0123456789.]//g' | $(SED) 's/\(.*\)/ version="\1"/' >> $(<)
|
||||
|
||||
cat >> $(<) << __EOF__
|
||||
processorArchitecture="X86"
|
||||
name="$(PRODUCT_NAME)"
|
||||
type="win32"
|
||||
/>
|
||||
<description>$(PRODUCT_DESCRIPTION)</description>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity
|
||||
type="win32"
|
||||
name="Microsoft.Windows.Common-Controls"
|
||||
version="6.0.0.0"
|
||||
processorArchitecture="X86"
|
||||
publicKeyToken="6595b64144ccf1df"
|
||||
language="*"
|
||||
/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
</assembly>
|
||||
__EOF__
|
||||
}
|
||||
|
||||
actions GenerateWin32MetadataRc
|
||||
{
|
||||
cat > $(<) << __EOF__
|
||||
// This file is automatically generated.
|
||||
|
||||
17485 RCDATA
|
||||
{
|
||||
__EOF__
|
||||
|
||||
cat $(>) | $(SED) "s:\":\"\":g" | $(SED) "s:\(.*\): \"\1\",:g" >> $(<)
|
||||
|
||||
cat >> $(<) << __EOF__
|
||||
"\0"
|
||||
}
|
||||
__EOF__
|
||||
|
||||
}
|
||||
|
||||
actions GenerateIconRc
|
||||
{
|
||||
echo '1 ICON "$(>)"' > $(<)
|
||||
}
|
||||
|
||||
actions together CompileResources
|
||||
{
|
||||
cat $(>) | $(CMD.WINDRES) $(WINDRES.FLAGS) $(RCFLAGS) --include-dir=$(>:D) -o $(<)
|
||||
}
|
||||
|
||||
rule CompileResources
|
||||
{
|
||||
Depends $(<) : $(>) ;
|
||||
}
|
||||
|
||||
## Win32Resource basename : rcfiles
|
||||
## Specify .rc files for the target known as basename. The .rc files should
|
||||
## already have SEARCH set appropriately.
|
||||
rule Win32Resource
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
local rcobject = [ DoObjectGrist $(<)_resource.o ] ;
|
||||
LOCATE on $(rcobject) = $(LOCATE_TARGET) ;
|
||||
SEARCH on $(rcobject) = $(LOCATE_TARGET) ;
|
||||
|
||||
# only add 1 resource object per target
|
||||
if ! $($(<)_HASWIN32RESOURCE)
|
||||
{
|
||||
$(<)_HASWIN32RESOURCE = yes ;
|
||||
ExtraObjects $(<) : $(rcobject) ;
|
||||
}
|
||||
|
||||
CompileResources $(rcobject) : $(>) ;
|
||||
}
|
||||
|
||||
## Win32RcFlags basename : rcfiles
|
||||
## Specify flags passed to the resource compiler when compiling resources
|
||||
## for the target known as basename.
|
||||
rule Win32RcFlags
|
||||
{
|
||||
local rcobject = [ DoObjectGrist $(<)_resource.o ] ;
|
||||
RCFLAGS on $(rcobject) += $(>) ;
|
||||
}
|
||||
|
||||
if $(USE_DLLWRAP) = "yes"
|
||||
{
|
||||
rule GenerateExportDefs
|
||||
{
|
||||
SEARCH on $(<) = $(LOCATE_TARGET) ;
|
||||
MakeLocate $(<) : $(LOCATE_TARGET) ;
|
||||
Depends $(<) : $(>) ;
|
||||
}
|
||||
|
||||
actions GenerateExportDefs
|
||||
{
|
||||
echo "EXPORTS" > $(<)
|
||||
echo " plugin_compiler" >> $(<)
|
||||
$(SED) '/<implementation>/!d;s:[ ]*<implementation>\(..*\)</implementation>: \1_scfInitialize:;p;s:_scfInitialize:_scfFinalize:;p;s:_scfFinalize:_Create:' < $(>) >> $(<)
|
||||
}
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# linking part
|
||||
|
||||
## ConstructApplicationTarget target : options
|
||||
## Constructs the application target name (ie. foo.exe for foo)
|
||||
rule ConstructApplicationTarget
|
||||
{
|
||||
return $(<).exe ;
|
||||
}
|
||||
rule ConstructStaticLibraryTarget
|
||||
{
|
||||
return lib$(<)$(SUFLIB) ;
|
||||
}
|
||||
rule ConstructSharedLibraryTarget
|
||||
{
|
||||
return $(<)-$(COMPILER.TYPE).dll ;
|
||||
}
|
||||
rule ConstructSharedLibraryLinkLib
|
||||
{
|
||||
return lib$(<)$(SUFLIB) ;
|
||||
}
|
||||
rule ConstructPluginTarget
|
||||
{
|
||||
return $(<).dll ;
|
||||
}
|
||||
|
||||
# Also invoked by msvcgen.jam.
|
||||
rule MakeVersionRc
|
||||
{
|
||||
# normalize version list
|
||||
local v1, v2, v3, v4 ;
|
||||
v1 = $(PACKAGE_VERSION_LIST[1]) ;
|
||||
if ! $(v1) { v1 = 0 ; }
|
||||
v2 = $(PACKAGE_VERSION_LIST[2]) ;
|
||||
if ! $(v2) { v2 = 0 ; }
|
||||
v3 = $(PACKAGE_VERSION_LIST[3]) ;
|
||||
if ! $(v3) { v3 = 0 ; }
|
||||
v4 = $(PACKAGE_VERSION_LIST[4]) ;
|
||||
if ! $(v4) { v4 = 0 ; }
|
||||
PACKAGE_VERSION_LIST on $(<) = $(v1) $(v2) $(v3) $(v4) ;
|
||||
|
||||
local desc = [ Description $(>) ] ;
|
||||
if ! $(desc) { desc = "$(>)" ; }
|
||||
PRODUCT_DESCRIPTION on $(<) = $(desc) ;
|
||||
|
||||
local name ;
|
||||
if $(PACKAGE_LONGNAME) { name = $(PACKAGE_LONGNAME) ; }
|
||||
else if $(PACKAGE_NAME) { name = $(PACKAGE_NAME) ; }
|
||||
else { name = $(>) ; }
|
||||
PRODUCT_NAME on $(<) = $(name) ;
|
||||
|
||||
GenerateWin32VersionRc $(<) ;
|
||||
}
|
||||
|
||||
rule MakeManifestFile
|
||||
{
|
||||
# normalize version list
|
||||
local v1, v2, v3, v4 ;
|
||||
v1 = $(PACKAGE_VERSION_LIST[1]) ;
|
||||
if ! $(v1) { v1 = 0 ; }
|
||||
v2 = $(PACKAGE_VERSION_LIST[2]) ;
|
||||
if ! $(v2) { v2 = 0 ; }
|
||||
v3 = $(PACKAGE_VERSION_LIST[3]) ;
|
||||
if ! $(v3) { v3 = 0 ; }
|
||||
v4 = $(PACKAGE_VERSION_LIST[4]) ;
|
||||
if ! $(v4) { v4 = 0 ; }
|
||||
PACKAGE_VERSION_LIST on $(<) = $(v1) $(v2) $(v3) $(v4) ;
|
||||
|
||||
local desc = [ Description $(>) ] ;
|
||||
if ! $(desc) { desc = "$(>)" ; }
|
||||
PRODUCT_DESCRIPTION on $(<) = $(desc) ;
|
||||
|
||||
local name ;
|
||||
if $(PACKAGE_NAME) { name = $(PACKAGE_NAME).$(>) ; }
|
||||
else { name = $(>) ; }
|
||||
PRODUCT_NAME on $(<) = $(name) ;
|
||||
|
||||
GenerateWin32Manifest $(<) ;
|
||||
}
|
||||
|
||||
rule MakeManifestRc
|
||||
{
|
||||
manifestfile = $(<:S=.manifest) ;
|
||||
MakeLocate $(manifestfile) : [ on $(<) GetVar LOCATE ] ;
|
||||
MakeManifestFile $(manifestfile) : $(>) ;
|
||||
MANIFEST_NAME on $(<) = $(manifestfile:G=) ;
|
||||
GenerateWin32ManifestRc $(<) ;
|
||||
Depends $(<) : $(manifestfile) ;
|
||||
}
|
||||
|
||||
rule MakeMetadataRc
|
||||
{
|
||||
local metafile = $($(>)_METAFILE) ;
|
||||
local metarc = $(<) ;
|
||||
Depends $(metarc) : $(metafile) ;
|
||||
GenerateWin32MetadataRc $(metarc) : $(metafile) ;
|
||||
Clean $(>)clean : $(metarc) ;
|
||||
Clean clean : $(metarc) ;
|
||||
}
|
||||
|
||||
rule AppResourceWin32
|
||||
{
|
||||
local options = $(2) ;
|
||||
|
||||
local versionrc = [ DoObjectGrist _versionrc.rc ] ;
|
||||
LOCATE on $(versionrc) = $(LOCATE_TARGET) ;
|
||||
SEARCH on $(versionrc) = $(LOCATE_TARGET) ;
|
||||
|
||||
MakeVersionRc $(versionrc) : $(<) ;
|
||||
Clean $(<)clean : $(versionrc) ;
|
||||
Clean clean : $(versionrc) ;
|
||||
Win32Resource $(<) : $(versionrc) ;
|
||||
|
||||
if ! [ IsElem nomanifest : $(options) ]
|
||||
{
|
||||
local manifestrc = [ DoObjectGrist _manifestrc.rc ] ;
|
||||
LOCATE on $(manifestrc) = $(LOCATE_TARGET) ;
|
||||
SEARCH on $(manifestrc) = $(LOCATE_TARGET) ;
|
||||
|
||||
MakeManifestRc $(manifestrc) : $(<) ;
|
||||
Clean $(<)clean : $(manifestrc) ;
|
||||
Clean clean : $(manifestrc) ;
|
||||
Win32Resource $(<) : $(manifestrc) ;
|
||||
}
|
||||
|
||||
local icon = [ ApplicationIcon win32 : $(<) ] ;
|
||||
if ! $(icon)
|
||||
{
|
||||
local apptype = gui ;
|
||||
if [ IsElem console : $(>) ] { apptype = console ; }
|
||||
icon = [ ApplicationIconDefault win32 : $(apptype) ] ;
|
||||
}
|
||||
if $(icon)
|
||||
{
|
||||
local iconcopy = [ DoObjectGrist $(icon) ] ;
|
||||
MakeLocate $(iconcopy) : $(LOCATE_TARGET) ;
|
||||
Depends $(iconcopy) : $(icon) ;
|
||||
Copy $(iconcopy) : $(icon) ;
|
||||
Clean $(<)clean : $(iconcopy) ;
|
||||
Clean clean : $(iconcopy) ;
|
||||
|
||||
local iconrc = [ DoObjectGrist $(<)_iconrc.rc ] ;
|
||||
MakeLocate $(iconrc) : $(LOCATE_TARGET) ;
|
||||
Depends $(iconrc) : $(iconcopy) ;
|
||||
GenerateIconRc $(iconrc) : $(iconcopy) ;
|
||||
Clean $(<)clean : $(iconrc) ;
|
||||
Clean clean : $(iconrc) ;
|
||||
|
||||
Win32Resource $(<) : $(iconrc) ;
|
||||
}
|
||||
}
|
||||
|
||||
rule PluginResourceWin32
|
||||
{
|
||||
local versionrc, metarc ;
|
||||
|
||||
versionrc = [ DoObjectGrist $(<)_versionrc.rc ] ;
|
||||
MakeLocate $(versionrc) : $(LOCATE_TARGET) ;
|
||||
MakeVersionRc $(versionrc) : $(<) ;
|
||||
|
||||
if $(EMBED_META) = "yes"
|
||||
{
|
||||
metarc = [ DoObjectGrist $(<)_metarc.rc ] ;
|
||||
MakeLocate $(metarc) : $(LOCATE_TARGET) ;
|
||||
MakeMetadataRc $(metarc) : $(<) ;
|
||||
}
|
||||
|
||||
Clean clean : $(versionrc) $(metarc) ;
|
||||
Clean $(<)clean : $(versionrc) $(metarc) ;
|
||||
|
||||
Win32Resource $(<) : $(versionrc) $(metarc) ;
|
||||
}
|
||||
|
||||
# SystemLinkApplication target : objects : options
|
||||
rule SystemLinkApplication
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
|
||||
Depends $(target) : $(>) ;
|
||||
LinkApplication $(target) : $(>) ;
|
||||
# setup clean rules
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
|
||||
AppResourceWin32 $(<) : $(3) ;
|
||||
}
|
||||
|
||||
rule SystemInstallApplication
|
||||
{
|
||||
Depends install_bin :
|
||||
[ DoInstall $(<) : $(bindir) $(2) : $(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
rule SystemInstallPlugin
|
||||
{
|
||||
Depends install_plugin : [ DoInstall $(<) : $(plugindir) $(2) :
|
||||
$(INSTALL_PROGRAM) ] ;
|
||||
}
|
||||
|
||||
# SystemLinkPlugin target : objects : options
|
||||
rule SystemLinkPlugin
|
||||
{
|
||||
local target = $($(<)_TARGET) ;
|
||||
|
||||
if $(USE_DLLWRAP) = "yes"
|
||||
{
|
||||
local exportdefs = [ DoObjectGrist $(<).def ] ;
|
||||
NAME on $(exportdefs) = $(<) ;
|
||||
GenerateExportDefs $(exportdefs) : $($(<)_METAFILE) ;
|
||||
Depends $(target) : $(exportdefs) ;
|
||||
EXPORTDEFS on $(target) = $(exportdefs) ;
|
||||
}
|
||||
|
||||
Depends $(target) : $(>) ;
|
||||
LinkPlugin $(target) : $(>) ;
|
||||
PluginResourceWin32 $(<) ;
|
||||
|
||||
if $(EMBED_META) != "yes"
|
||||
{
|
||||
PluginMetaData $(<) : $($(<)_METAFILE) : $(3) ;
|
||||
}
|
||||
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
|
||||
rule MakeDllDefFile
|
||||
{
|
||||
local def = $(<) ;
|
||||
local objects = $(>) ;
|
||||
|
||||
MakeLocate $(def) : $(LOCATE.OBJECTS)/libs ;
|
||||
WriteDefHeader $(def) ;
|
||||
for i in $(objects)
|
||||
{
|
||||
local drectve = $(i).drectve ;
|
||||
MakeLocate $(drectve) : [ on $(i) GetVar LOCATE ] ;
|
||||
Depends $(drectve) : $(i) ;
|
||||
Depends $(def) : $(drectve) ;
|
||||
ExtractDrectve $(drectve) : $(i) ;
|
||||
DrectveToDef $(def) : $(drectve) ;
|
||||
Clean clean : $(drectve) ;
|
||||
Clean $(def)clean : $(drectve) ;
|
||||
}
|
||||
}
|
||||
|
||||
rule SystemLinkSharedLibrary
|
||||
{
|
||||
LFlags $(<) : $(LINKLIBS) ;
|
||||
|
||||
# The "crystalspace" library is so massive that it blows Jam's command line
|
||||
# length limit when all object files are passed in at once to some command.
|
||||
# However, a DLL, like an executable, needs to be built with all objects at
|
||||
# once.
|
||||
# Problem is, since dllwrap etc. don't support response files, there is no
|
||||
# way to pass all objects at once to it. But, a static library can be built
|
||||
# piecemeal, so we take the detour of creating a static library out of the
|
||||
# DLL objects first.
|
||||
# However, another bug hits us: on MinGW, symbols exported from objects in
|
||||
# static libraries are not automatically exported from the DLL.
|
||||
# We work this around by constructing a .DEF file with all exports of the
|
||||
# DLL. Conveniently (somewhat), all exported symbols are into a section
|
||||
# ".drectve" of an object file by gcc. After extracting these sections and
|
||||
# some postprocessing, we finally have all .DEF entries. Phew.
|
||||
local lib = $(<).a ;
|
||||
MakeLocate $(lib) $(lib)($(>:BS)) : $(LOCATE.OBJECTS)/libs ;
|
||||
Depends $(lib) : $(lib)($(>:BS)) ;
|
||||
local i ;
|
||||
for i in $(>)
|
||||
{
|
||||
Depends $(lib)($(i:BS)) : $(i) ;
|
||||
}
|
||||
Archive $(lib) : $(>) ;
|
||||
Ranlib $(lib) ;
|
||||
#RmTemps $(lib) : $(>) ;
|
||||
|
||||
Depends $(<) : $(lib) ;
|
||||
|
||||
local def = $(<).def ;
|
||||
MakeDllDefFile $(def) : $(>) ;
|
||||
Depends $(<) : $(def) ;
|
||||
Clean clean : $(def) ;
|
||||
Clean $(<)clean : $(def) ;
|
||||
Depends $(<)clean : $(def)clean ;
|
||||
|
||||
EXPORTDEFS on $(<) = $(def) ;
|
||||
IMPLIB on $(<) = $(3) ;
|
||||
Depends $(3) : $(<) ;
|
||||
LinkSharedLibrary $(<) : $(lib) ;
|
||||
|
||||
Clean clean : $(target) ;
|
||||
Clean $(<)clean : $(target) ;
|
||||
}
|
||||
|
||||
actions ExtractDrectve
|
||||
{
|
||||
$(CMD.OBJCOPY) -j .drectve -O binary $(>) $(<).tmp
|
||||
echo >> $(<).tmp # Cheap trick to ensure there's always a .tmp file;
|
||||
# the action should not break with no .drectve - no exports
|
||||
# is a valid scenario.
|
||||
$(CMD.STRINGS) -n 1 $(<).tmp > $(<) # Run strings since the section data may be
|
||||
# padded with zeroes, get rid of those.
|
||||
rm $(<).tmp
|
||||
}
|
||||
|
||||
actions WriteDefHeader
|
||||
{
|
||||
echo "EXPORTS" > $(<)
|
||||
}
|
||||
|
||||
actions piecemeal together DrectveToDef
|
||||
{
|
||||
for d in $(>)
|
||||
do
|
||||
sed -e "s/ /\\
|
||||
/g" $d | sed -e "s/-export:\(.*\)/\1/g" | sed -e "s/,data/ DATA/g" >> $(<)
|
||||
done
|
||||
}
|
||||
|
||||
actions GenerateImportLib
|
||||
{
|
||||
$(CMD.DLLTOOL) -d $(>) -l $(<)
|
||||
}
|
||||
|
||||
actions LinkApplication bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
|
||||
if $(USE_DLLWRAP) != "yes"
|
||||
{
|
||||
actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS
|
||||
{
|
||||
$(CMD.LINK) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
actions LinkPlugin bind NEEDLIBS bind EXTRAOBJECTS bind EXPORTDEFS
|
||||
{
|
||||
$(CMD.DLLWRAP) --driver-name=$(CMD.LINK) --dllname $(<:B) --def=$(EXPORTDEFS) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
}
|
||||
}
|
||||
|
||||
actions LinkSharedLibrary bind NEEDLIBS bind EXTRAOBJECTS bind EXPORTDEFS bind IMPLIB
|
||||
{
|
||||
$(CMD.DLLWRAP) --driver-name=$(CMD.LINK) --dllname $(<:B).dll --def=$(EXPORTDEFS) --implib $(IMPLIB) -o $(<) $(>) $(EXTRAOBJECTS) $(NEEDLIBS) $(LINKLIBS)
|
||||
touch $(IMPLIB) # ensure the IMPLIB is always newer than the DLL,
|
||||
# since the IMPLIB depends on the DLL.
|
||||
}
|
||||
167
mk/msvcgen/control.tlib
Normal file
167
mk/msvcgen/control.tlib
Normal file
@@ -0,0 +1,167 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 common control values for MSVC6 and MSVC7 project generation
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Within the project, the listing of files comprising that project is broken
|
||||
# into groups based upon file types. The groups[] array of hashes defines the
|
||||
# groups into which the file will be placed. Each hash contains the following
|
||||
# keys:
|
||||
#
|
||||
# name
|
||||
# Provides a human-readable name for the group within the project file.
|
||||
# types
|
||||
# Regular expression controlling which files will be used to populate
|
||||
# the group. Filenames matching `types' will be included in the group.
|
||||
#------------------------------------------------------------------------------
|
||||
groups = [
|
||||
{
|
||||
name => 'Source Files'
|
||||
types => '\.(?i:c|cc|cpp|cxx|m|mm)$'
|
||||
},
|
||||
{
|
||||
name => 'Header Files'
|
||||
types => '\.(?i:h|hh|hpp|hxx)$'
|
||||
},
|
||||
{
|
||||
name => 'Resource Files'
|
||||
types => '\.(?!(?i:h|hh|hpp|hxx|c|cc|cpp|cxx|m|mm)$)\w*$'
|
||||
}
|
||||
];
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Each project file can support multiple build configurations, such as Release
|
||||
# and Debug. The builds[] array of hashes defines the build modes which will
|
||||
# appear in the project file. Each hash provides fine-grained control of
|
||||
# settings specific to a particular build modes. Other than `tag', `name', and
|
||||
# `priority', the hash keys are fairly arbitrary. The remaining keys are
|
||||
# accessed by the compose() macro (macros.tlib) based upon an essentially
|
||||
# arbitrary name given to compose() upon each invocation.
|
||||
#
|
||||
# tag
|
||||
# String often used in construction of pathnames for temporary
|
||||
# build-time files in order to prevent one build configuration from
|
||||
# stomping upon the files of another. Also used in composition of macro
|
||||
# names by interpolate() (macros.tlib) when searching for customizations
|
||||
# contained in the projectx{6,7}.tlib files.
|
||||
# name
|
||||
# Human-readable name of this configuration.
|
||||
# priority
|
||||
# Assign a relative priority to this build mode over others. Lower
|
||||
# numbers indicate higher priority. MSVC6 determines the "default"
|
||||
# build mode based upon the (reverse) order in which it encounters build
|
||||
# mode names in the project file header, so the MSVC6 project template
|
||||
# utilizes this field to ensure that the mode with the highest priority
|
||||
# is the one chosen by default by MSVC6.
|
||||
#
|
||||
# These keys are optional; they are accessed by the compose() macro
|
||||
# (macros.tlib) when compose() is invoked by the project template to retrieve a
|
||||
# list of preprocessor #defines, compiler flags, etc.
|
||||
#
|
||||
# defines
|
||||
# Array of additional preprocessor #defines for this build mode.
|
||||
# defineskey
|
||||
# Name of key in `my.doc' hash specifying array of additional #defines
|
||||
# for this build mode for the specific project being generated.
|
||||
# cflags
|
||||
# Array of additional compiler flags for this build mode.
|
||||
# cflagsskey
|
||||
# Name of key in `my.doc' hash specifying array of additional compiler
|
||||
# flags for this build mode for the specific project being generated.
|
||||
# incdirskey
|
||||
# Name of the key in `my.doc' hash specifying array of additional header
|
||||
# search directories for this build mode for the specific project being
|
||||
# generated.
|
||||
# lflags
|
||||
# Array of additional linker flags for this build mode.
|
||||
# lflagskey
|
||||
# Name of key in `my.doc' hash specifying array of additional linker
|
||||
# flags for this build mode for the specific project being generated.
|
||||
# libs
|
||||
# Array of additional library dependencies (including .lib suffix) for
|
||||
# this build mode.
|
||||
# libskey
|
||||
# Name of key in `my.doc' hash specifying array of additional library
|
||||
# dependencies for this build mode for the specific project being
|
||||
# generated.
|
||||
# libdirskey
|
||||
# Name of the key in `my.doc' hash specifying array of additional
|
||||
# library search directories for this build mode for the specific
|
||||
# project being generated.
|
||||
#------------------------------------------------------------------------------
|
||||
builds = [
|
||||
{
|
||||
tag => 'release',
|
||||
name => 'Release',
|
||||
defines => ['NDEBUG'],
|
||||
snpreprocessor => 'SN_TARGET_PS3;NDEBUG;__GCC__',
|
||||
snadditional => '-O2 -Wall -fno-exceptions',
|
||||
defineskey => 'define',
|
||||
cflagskey => 'cflags',
|
||||
incdirskey => 'include',
|
||||
lflagskey => 'lflags',
|
||||
libskey => 'library',
|
||||
libdirskey => 'libdir',
|
||||
priority => 100
|
||||
},
|
||||
{
|
||||
tag => 'debug',
|
||||
name => 'Debug',
|
||||
defines => ['_DEBUG'],
|
||||
snpreprocessor => 'SN_TARGET_PS3;_DEBUG;__GCC__',
|
||||
snadditional => '-g -O0 -Wall -fno-exceptions',
|
||||
defineskey => 'definedebug',
|
||||
cflagskey => 'cflagsdebug',
|
||||
incdirskey => 'includedebug',
|
||||
lflagskey => 'lflagsdebug',
|
||||
libskey => 'librarydebug',
|
||||
libdirskey => 'libdirdebug',
|
||||
priority => 200
|
||||
}
|
||||
];
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# The projtypes[] array defines the different types of built targets (GUI
|
||||
# application, DLL, library, etc.) which a project file might represent. The
|
||||
# client will choose one of these keys as the type of project desired. The
|
||||
# value of each key is a hash specifying additional customization of the
|
||||
# project based upon its type. The keys of the subhash are the same as the
|
||||
# optional keys described above for the builds[] array ('defines', 'cflags',
|
||||
# and so forth; but not the 'defineskey', 'cflagskey', etc.).
|
||||
#------------------------------------------------------------------------------
|
||||
projtypes = {
|
||||
appcon =>
|
||||
{
|
||||
defines = ['_CONSOLE']
|
||||
},
|
||||
appgui =>
|
||||
{
|
||||
defines = ['_WINDOWS']
|
||||
},
|
||||
group =>
|
||||
{
|
||||
},
|
||||
library =>
|
||||
{
|
||||
defines = ['_LIB', '_WINDOWS']
|
||||
}
|
||||
};
|
||||
|
||||
END %]
|
||||
301
mk/msvcgen/macros.tlib
Normal file
301
mk/msvcgen/macros.tlib
Normal file
@@ -0,0 +1,301 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 utility macros for MSVC project generation
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Return input string with forward slashes changed to backward slashes.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO slash(s) GET s.replace('/','\\');
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given a path, strip off any prefix found in the my.doc.striproot[] array.
|
||||
# For example, if my.doc.striproot[] contains '/usr/local/', and this macro is
|
||||
# invoked as striproot('/usr/local/foo.bar'), then the return value will be
|
||||
# 'foo.bar'.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO striproot(p) BLOCK;
|
||||
IF my.doc.striproot;
|
||||
UNLESS my.doc.striprootpat;
|
||||
r = [];
|
||||
FOREACH c IN my.doc.striproot;
|
||||
IF c != '.';
|
||||
c = c.replace('[/\\\\]?$', '/?') IF c != './';
|
||||
r.push(c.replace('[.]', '\\.'));
|
||||
END;
|
||||
END;
|
||||
my.doc.striprootpat = '^(?i:' _ r.join('|') _ ')';
|
||||
END;
|
||||
p.replace(my.doc.striprootpat, '');
|
||||
ELSE;
|
||||
GET p;
|
||||
END;
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an array of paths, invoke striproot() upon each and return the results.
|
||||
# Note that, because TemplateToolkit macros can not return true lists, the
|
||||
# return value is actually a string with the elements delimited by the token
|
||||
# `|'; thus clients must split() the return value if a real list result is
|
||||
# desired. For instance: myfiles = striproots(allfiles).split('|')
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO striproots(p) BLOCK;
|
||||
r = [];
|
||||
FOREACH c IN p;
|
||||
r.push(striproot(c));
|
||||
END;
|
||||
r.join('|');
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an array of path components, return the concatenation of the components
|
||||
# (using backslash '\' as a delimiter) after possibly stripping an optional
|
||||
# prefix from each component. The list of prefixes which may be stripped are
|
||||
# found in the my.doc.striproot[] array. For example, if my.doc.striproot[]
|
||||
# contains '/usr/local/', and this macro is invoked as
|
||||
# path(['/usr/local/foo', 'bar', 'cow.baz']), then the return value will be
|
||||
# 'foo\bar\cow.baz'.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO path(p) BLOCK;
|
||||
r = [];
|
||||
FOREACH c IN p;
|
||||
r.push(striproot(c));
|
||||
END;
|
||||
slash(r.join('\\'));
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given a string specifying a set of options for a tool (compiler, linker,
|
||||
# etc.) of the form `/opt1 "arg1" /opt2 "arg2"' (or `/opt1:arg1 /opt2:arg2', or
|
||||
# the like), translate forward slashes in `arg' (which is assumed to be a
|
||||
# pathname) to backward slashes. For example, given
|
||||
# `/I "foo/bar" /out:cow/baz', returns `/I "foo\bar" /out:cow\baz'.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO flags(s) GET slash(s).replace('\A\\\\','/').replace('\s\\\\',' /');
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an array of items, return only the items which match the set of regular
|
||||
# expressions in my.doc.accept[] and which do not match the set of expressions
|
||||
# in my.doc.reject[]. For example, if my.doc.accept[] contains the one pattern
|
||||
# '\.cpp$', and my.doc.reject[] contains the one pattern 'ow', then, given the
|
||||
# list ['foo.h', 'bar.cpp', 'cow.cpp'], the list of returned items will be
|
||||
# ['bar.cpp']. Note that, because TemplateToolkit macros can not return true
|
||||
# lists, the return value is actually a string with the elements delimited by
|
||||
# the token `|'; thus clients must split() the return value if a real list
|
||||
# result is desired. For instance: myfiles = filter(allfiles).split('|')
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO filter(x) BLOCK;
|
||||
IF my.doc.accept;
|
||||
UNLESS my.doc.acceptpat;
|
||||
my.doc.acceptpat = my.doc.accept.join('|');
|
||||
END;
|
||||
x = x.grep(my.doc.acceptpat);
|
||||
END;
|
||||
IF my.doc.reject;
|
||||
UNLESS my.doc.acceptpat;
|
||||
my.doc.rejectpat = my.doc.reject.join('|');
|
||||
END;
|
||||
y = [];
|
||||
FOREACH i IN x;
|
||||
UNLESS i.match(my.doc.rejectpat);
|
||||
y.push(i);
|
||||
END;
|
||||
END;
|
||||
y.join('|');
|
||||
ELSE;
|
||||
x.join('|');
|
||||
END;
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an input string, return a globally unique identifier (GUID)
|
||||
# representing the string (essentially a textual representation of an MD5
|
||||
# checksum). The returned string has the form
|
||||
# XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, where each `X' represents some
|
||||
# (uppercase) hexadecimal digit.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO guid(s) BLOCK;
|
||||
USE md5 = Digest::MD5;
|
||||
CALL md5.add(s);
|
||||
digest = md5.hexdigest.chunk(4);
|
||||
GET digest.0 _
|
||||
digest.1 _ '-' _
|
||||
digest.2 _ '-' _
|
||||
digest.3 _ '-' _
|
||||
digest.4 _ '-' _
|
||||
digest.5 _
|
||||
digest.6 _
|
||||
digest.7 | upper;
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an arbitrary identifier (the `tag'), attempt to locate macros named
|
||||
# after variations of that tag and the current build mode and project type;
|
||||
# then invoke any discovered macros and concatenate their results, delimited by
|
||||
# `delim' (which may be omitted if no explicit delimiter is needed). Macro
|
||||
# names are composed of `tag', the current build mode (given by the global
|
||||
# `build.mode' property, where `build' typically is a reference to a hash
|
||||
# contained in the global builds[] array), and the current project type as
|
||||
# indicated by the global my.doc.projtype.0 property. The full list of macros
|
||||
# consulted by interpolate() is presented below. The macros are invoked in the
|
||||
# order shown.
|
||||
#
|
||||
# tag_build
|
||||
# tag_projtype
|
||||
# tag_projtype_build
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO interpolate(tag, delim) BLOCK;
|
||||
p = [];
|
||||
s = ${"${tag}_${build.tag}"};
|
||||
p.push(s) IF s.length > 0;
|
||||
s = ${"${tag}_${my.doc.projtype.0}"};
|
||||
p.push(s) IF s.length > 0;
|
||||
s = ${"${tag}_${my.doc.projtype.0}_${build.tag}"};
|
||||
p.push(s) IF s.length > 0;
|
||||
GET p.join(delim);
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an array of strings, return the concatenation of the elements,
|
||||
# delimited by `delim'. Prior to concatenation, `prefix' and `suffix' (if
|
||||
# provided) are attached to each element. For example,
|
||||
# glue(['foo','bar'],':','<','>') returns "<foo>:<bar>".
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO glue(array, delim, prefix, suffix) BLOCK;
|
||||
delim = suffix _ delim _ prefix;
|
||||
s = array.join(delim);
|
||||
IF s.length > 0;
|
||||
s = prefix _ s _ suffix;
|
||||
END;
|
||||
GET s;
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an arbitrary identifier (the `tag'), attempt to access several in-scope
|
||||
# or globally visible arrays in order to extract additional options for a given
|
||||
# build mode and project type. The elements of the accessed arrays, along with
|
||||
# a `seed' array, are concatentated, delimited by `delim'. Each element is
|
||||
# optionally modified by `prefix' and `suffix' as described in the glue()
|
||||
# macro. The actual list of arrays consulted is:
|
||||
#
|
||||
# build.tag
|
||||
# projtypes.projtype.tag
|
||||
# my.doc.tagkey
|
||||
#
|
||||
# The above list assumes that a hash named `build' is in scope. Typically,
|
||||
# this is a reference to an element of the global builds[] array
|
||||
# (control.tlib). Furthermore, `projtype' is shorthand for my.doc.projtype.0,
|
||||
# which is assumed to exist globally, and is specific to the project being
|
||||
# generated. Finally, `tagkey' is actually the value of the "${tag}key" key
|
||||
# within the `build' hash. As a practical example, if generating a project
|
||||
# file for a "plugin" and emitting the "debug" configuration, given a `tag' of
|
||||
# "cflags", then the following arrays may be consulted:
|
||||
#
|
||||
# build.cflags
|
||||
# projtypes.plugin.cflags
|
||||
# my.doc.cflagsdebug
|
||||
#
|
||||
# In this example, the name "cflagsdebug" comes from the
|
||||
# builds['debug'].cflagskey property (control.tlib).
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO compose(tag, seed, delim, prefix, suffix) BLOCK;
|
||||
p = [];
|
||||
p = p.merge(build.$tag).
|
||||
merge(projtypes.${my.doc.projtype.0}.$tag).
|
||||
merge(my.doc.${${"build.${tag}key"}}).
|
||||
merge(seed);
|
||||
GET glue(p, delim, prefix, suffix);
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Given an arbitrary `tag', concatenate the list of pathnames in my.doc.tag[],
|
||||
# along with a `seed' list, delimited by `delim'. Each item is mutated by
|
||||
# path() prior to concatenation. The optional `prefix' and `suffix' modify
|
||||
# each item as described in the glue() macro. For example, if my.doc.libdir[]
|
||||
# contains the elements "foo/bar" and "baz/snorz", then the invocation
|
||||
# composepaths('libdir',['cow/fish'],' ','/I "','"') will return the string
|
||||
# `/I "cow\fish" /I "foo\bar" /I "baz\snorz"'. Likewise,
|
||||
# composepaths('libdir',[],',') will return `foo\bar,baz\snorz'.
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO composepaths(tag, seed, delim, prefix, suffix) BLOCK;
|
||||
p = seed;
|
||||
FOREACH d IN my.doc.$tag;
|
||||
p.push(path([d]).replace('\\\\$',''));
|
||||
END;
|
||||
GET glue(p, delim, prefix, suffix);
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Loads a data file containing key/value tuples and stores the tuples in the
|
||||
# hash named my.tag, where `tag' is provided by the caller. The key/value
|
||||
# tuples appear one per line in the data file, and the key must be separated
|
||||
# from the value via a literal '|'. The very first line of the data file
|
||||
# _must_ be the literal string "key|value" (sans quotes). Each key in the data
|
||||
# file becomes a key in the my.tag hash. Typically, the name "doc" is used for
|
||||
# `tag', and is meant to represent attributes (such as special compiler and
|
||||
# linker flags, list of files, etc.) of the current "project file document"
|
||||
# under construction. Indeed, many of the macros defined here (macros.tlib)
|
||||
# assume the presence of the my.doc hash, and consult it to learn about
|
||||
# properties specific to the project file being synthesized. It is legal for
|
||||
# the same key to appear multiple times in the data file; this is how an array
|
||||
# of values is defined for a given key. In fact, _all_ values in the hash are
|
||||
# assumed to be arrays. Consequently, even if you know that a particular key
|
||||
# will appear in the data file only a single time, you must still perform an
|
||||
# array access to obtain its value (for instance, `my.doc.projtype.0'). Values
|
||||
# from the loaded data file are typically accessed via the FOREACH directive
|
||||
# (for example, `FOREACH cflag IN my.doc.cflags'), but can also be accessed
|
||||
# individually (`my.doc.cflags.0', `my.doc.cflags.1', etc.).
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO load(path, tag) BLOCK;
|
||||
my.$tag = {};
|
||||
USE f = datafile(path, delim = '|');
|
||||
FOREACH r IN f;
|
||||
IF my.$tag.exists(r.key);
|
||||
my.$tag.${r.key}.push(r.value);
|
||||
ELSE;
|
||||
my.$tag.${r.key} = [ r.value ];
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Build-specific path composition macros.
|
||||
#
|
||||
# workroot
|
||||
# Return the root of the directory hierarchy in which build temporaries
|
||||
# and some targets will be placed.
|
||||
# worklibout
|
||||
# Return the location where built static libraries will be placed.
|
||||
# workbuild
|
||||
# Return the location of a build temporary. If `tail' is omitted, then
|
||||
# this will be the directory into which temporary build output will be
|
||||
# placed (a subdirectory of `workroot'). If `tail', an array of
|
||||
# pathname components, is provided, then it can specify a directory or
|
||||
# file beneath the `workbuild' directory. The elements of `tail' are
|
||||
# concatenated without any delimiter. For example, workbuild([]) might
|
||||
# return "..\out\build", whereas workbuild(['myapp']) would return
|
||||
# "..\out\build\myapp", and workbuild(['myapp/test','.obj']) would
|
||||
# return "..\out\build\myapp\test.obj".
|
||||
#------------------------------------------------------------------------------
|
||||
MACRO workroot GET path([my.doc.buildroot.0, 'out', glue([build.tag, my.doc.msvcversion.0])]);
|
||||
MACRO worklibout GET path([workroot, 'libs']);
|
||||
MACRO workbuild(tail)
|
||||
GET path([workroot, 'build', my.doc.project.0, tail.join('')]);
|
||||
|
||||
END %]
|
||||
129
mk/msvcgen/project6.tlib
Normal file
129
mk/msvcgen/project6.tlib
Normal file
@@ -0,0 +1,129 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC6 project (dsp) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
PROCESS projectx6.tlib;
|
||||
|
||||
MACRO composedefs(defs) GET compose('defines', defs, ' ', '/D "', '"');
|
||||
MACRO composedirs(tag, seed, directive) BLOCK;
|
||||
prefix = directive _ '"';
|
||||
GET composepaths(${"build.${tag}key"}, seed, ' ', prefix, '"');
|
||||
END;
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
files = striproots(filter(my.doc.file).split('\|')).split('\|').sort;
|
||||
builds = builds.nsort('priority');
|
||||
END -%]
|
||||
# Microsoft Developer Studio Project File - Name="[% my.doc.project.0 %]" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) [% projtypes.${my.doc.projtype.0}.type %]" [% projtypes.${my.doc.projtype.0}.typecode %]
|
||||
|
||||
CFG=[% my.doc.project.0 %] - Win32 [% builds.0.name %]
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "[% my.doc.project.0 %].mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "[% my.doc.project.0 %].mak" CFG="[% my.doc.project.0 %] - Win32 [% builds.0.name %]"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
[% # MSVC6 uses the last listed build mode as default, so we reverse the list.
|
||||
FOREACH build IN builds.reverse -%]
|
||||
!MESSAGE "[% my.doc.project.0 %] - Win32 [% build.name %]" (based on "Win32 (x86) [% projtypes.${my.doc.projtype.0}.type %]")
|
||||
[% END -%]
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
[% FOREACH build IN builds -%]
|
||||
![% IF loop.first; 'IF'; ELSE; 'ELSEIF'; END %] "$(CFG)" == "[% my.doc.project.0 %] - Win32 [% build.name %]"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries [% interpolate('usedebuglibs') %]
|
||||
# PROP BASE Output_Dir "[% build.tag %]"
|
||||
# PROP BASE Intermediate_Dir "[% build.tag %]"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries [% interpolate('usedebuglibs') %]
|
||||
# PROP Output_Dir "[% workbuild([]) %]"
|
||||
# PROP Intermediate_Dir "[% workbuild([]) %]"
|
||||
[% interpolate('ignoreexportlib') -%]
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c
|
||||
# ADD CPP /nologo /vmb /vms /W3 /Gm /GX /G5 /FD /c [% interpolate('addcpp', ' ') %] /D "_MT" /D "_MBCS" [% composedefs(['WIN32']) %] [% flags(compose('cflags', [], ' ')) %] [% composedirs('incdirs', ['.'], '/I ') %]
|
||||
# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32
|
||||
# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 [% composedefs([]) %]
|
||||
# ADD BASE RSC /l 0x409
|
||||
# ADD RSC /l 0x409 /fo".\[% workbuild([my.doc.project.0,'.res']) %]" [% composedirs('incdirs', ['.'], '/i ') %]
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo [% interpolate('addlib32') %]
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386
|
||||
# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib [% compose('libs', [], ' ') %] [% interpolate('delaylibs', ' ') %] /nologo /version:4.0 /machine:I386 [% interpolate('linkeropts', ' ') %] [% interpolate('addlink32') %] [% composedirs('libdirs', [], '/libpath:') %] [% flags(compose('lflags', [], ' ')) %]
|
||||
# Begin Special Build Tool
|
||||
SOURCE="$(InputPath)"
|
||||
[% interpolate('postbuild') -%]
|
||||
# End Special Build Tool
|
||||
|
||||
[% END -%]
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
[% FOREACH build IN builds -%]
|
||||
# Name "[% my.doc.project.0 %] - Win32 [% build.name %]"
|
||||
[% END -%]
|
||||
[% FOREACH group IN groups -%]
|
||||
[% items = files.grep(group.types) -%]
|
||||
[% IF items.size > 0 -%]
|
||||
# Begin Group "[% group.name %]"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
[% FOREACH file IN items -%]
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=[% path([my.doc.sourceroot.0, file]) %]
|
||||
# End Source File
|
||||
[% END -%]
|
||||
# End Group
|
||||
[% END -%]
|
||||
[% END -%]
|
||||
# End Target
|
||||
# End Project
|
||||
146
mk/msvcgen/project7.tlib
Normal file
146
mk/msvcgen/project7.tlib
Normal file
@@ -0,0 +1,146 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC7 project (vcproj) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
PROCESS projectx7.tlib;
|
||||
|
||||
MACRO composedefs(defs) GET compose('defines', defs, ';');
|
||||
MACRO composedirs(tag, seed) GET composepaths(${"build.${tag}key"},seed,';');
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
files = striproots(filter(my.doc.file).split('\|')).split('\|').sort;
|
||||
END -%]
|
||||
<?xml version="1.0" encoding = "Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="[% my.doc.formatversion.0 %]"
|
||||
Name="[% my.doc.project.0 %]"
|
||||
ProjectGUID="{[% guid(my.doc.project.0) %]}"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
[% FOREACH build IN builds -%]
|
||||
<Configuration
|
||||
Name="[% build.name %]|Win32"
|
||||
OutputDirectory="[% workbuild([]) %]"
|
||||
IntermediateDirectory="[% workbuild([]) %]"
|
||||
[% interpolate('global') -%]
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
[% interpolate('compiler') -%]
|
||||
PreprocessorDefinitions="
|
||||
[%- composedefs(['WIN32']) %]"
|
||||
OptimizeForProcessor="1"
|
||||
ExceptionHandling="0"
|
||||
AdditionalOptions="[% flags(compose('cflags', [], ' ')) | html %] [% flags(compose('cflags7', [], ' ')) | html %]"
|
||||
AdditionalIncludeDirectories="[% composedirs('incdirs', ['.']) %]"
|
||||
PrecompiledHeaderFile="[% workbuild([my.doc.project.0,'.pch']) %]"
|
||||
AssemblerListingLocation="[% workbuild([]) %]"
|
||||
ObjectFile="[% workbuild([]) %]"
|
||||
ProgramDataBaseFileName="[% workbuild([my.doc.rawtarget.0,'.pdb']) %]"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
TreatWChar_tAsBuiltInType="false"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
[% interpolate('linker') -%]
|
||||
AdditionalOptions="[% flags(compose('lflags', [], ' ')) | html %] [% flags(compose('lflags7', [], ' ')) | html %]"
|
||||
AdditionalDependencies="[% compose('libs', [], ' ') %]"
|
||||
IgnoreImportLibrary="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="[% composedirs('libdirs', []) %]"
|
||||
ProgramDatabaseFile="[% workbuild([my.doc.rawtarget.0,'.pdb']) %]"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
[% interpolate('librarian') -%]
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="[% composedefs([]) %]"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName="[% workbuild([my.doc.project.0,'.tlb']) %]"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
[% interpolate('postbuild') -%]
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="[% composedefs([glue (['PROJECTGEN_VERSION', my.doc.msvcversion.0], '=')]) %]"
|
||||
AdditionalIncludeDirectories="[% composedirs('incdirs', ['.']) %]"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
</Configuration>
|
||||
[% END -%]
|
||||
</Configurations>
|
||||
<Files>
|
||||
[%- FOREACH group IN groups %]
|
||||
[%- items = files.grep(group.types) %]
|
||||
[%- IF items.size > 0 %]
|
||||
<Filter
|
||||
Name="[% group.name %]"
|
||||
Filter="">
|
||||
[%- FOREACH file IN items %]
|
||||
<File
|
||||
RelativePath="[% path([my.doc.sourceroot.0, file]) %]">
|
||||
[%- IF my.doc.static %]
|
||||
[%- UNLESS file.match('\\.(h|hpp|rc)$') %]
|
||||
[%- FOREACH build IN builds %]
|
||||
<FileConfiguration
|
||||
Name="[% build.name %]|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
ObjectFile="[% workbuild([file.replace('/', '_'), '.obj']) %]"/>
|
||||
</FileConfiguration>
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
</File>
|
||||
[%- END %]
|
||||
</Filter>
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
141
mk/msvcgen/projectsn71.tlib
Normal file
141
mk/msvcgen/projectsn71.tlib
Normal file
@@ -0,0 +1,141 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC7 project (vcproj) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
PROCESS projectxsn71.tlib;
|
||||
|
||||
MACRO composedefs(defs) GET compose('defines', defs, ';');
|
||||
MACRO composedirs(tag, seed) GET composepaths(${"build.${tag}key"},seed,';');
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
files = striproots(filter(my.doc.file).split('\|')).split('\|').sort;
|
||||
END -%]
|
||||
<?xml version="1.0" encoding = "Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="[% my.doc.formatversion.0 %]"
|
||||
Name="[% my.doc.project.0 %]"
|
||||
ProjectGUID="{[% guid(my.doc.project.0) %]}"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
[% FOREACH build IN builds -%]
|
||||
<Configuration
|
||||
Name="[% build.name %]|Win32"
|
||||
OutputDirectory="[% workbuild([]) %]"
|
||||
IntermediateDirectory="[% workbuild([]) %]"
|
||||
[% interpolate('global') -%]>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
[% interpolate('compiler') -%]
|
||||
PreprocessorDefinitions="[% build.snpreprocessor %]"
|
||||
|
||||
ExceptionHandling="FALSE"
|
||||
OptimizeForProcessor="1"
|
||||
AdditionalOptions="[% build.snadditional %] [% flags(compose('cflags', [], ' ')) | html %] [% flags(compose('cflags7', [], ' ')) | html %]"
|
||||
AdditionalIncludeDirectories=""$(SN_PS3_PATH)\ppu\include\sn";"$(SCE_PS3_ROOT)\target\ppu\include";"$(SCE_PS3_ROOT)\target\common\include";[% composedirs('incdirs', ['.']) %]"
|
||||
PrecompiledHeaderFile="[% workbuild([my.doc.project.0,'.pch']) %]"
|
||||
AssemblerListingLocation="[% workbuild([]) %]"
|
||||
ObjectFile="[% workbuild([]) %]"
|
||||
ProgramDataBaseFileName=" "
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
[% interpolate('linker') -%]
|
||||
AdditionalOptions="-fno-exceptions [% flags(compose('lflags', [], ' ')) | html %] [% flags(compose('lflags7', [], ' ')) | html %]"
|
||||
|
||||
AdditionalDependencies=""$(SCE_PS3_ROOT)\target\ppu\lib\libm.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libspurs.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libio.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libpad.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libusbd.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libkb.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libmouse.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libnet.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libgcm.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\PSGL\RSX\opt\libPSGL.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\PSGL\RSX\opt\libPSGLU.a"; "$(SCE_PS3_ROOT)\target\ppu\lib\libsysutil.a" ;[% compose('libs', [], ' ') %]"
|
||||
IgnoreImportLibrary="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
AdditionalLibraryDirectories="[% composedirs('libdirs', []) %]"
|
||||
ProgramDatabaseFile="[% workbuild([my.doc.rawtarget.0,'.pdb']) %]"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
[% interpolate('librarian') -%]
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="[% build.snpreprocessor %];[% composedefs([]) %]"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName="[% workbuild([my.doc.project.0,'.tlb']) %]"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
[% interpolate('postbuild') -%]
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="SN_TARGET_PS3;_DEBUG;__GCC__;[% composedefs([glue (['PROJECTGEN_VERSION', my.doc.msvcversion.0], '=')]) %]"
|
||||
AdditionalIncludeDirectories="[% composedirs('incdirs', ['.']) %]"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
</Configuration>
|
||||
[% END -%]
|
||||
</Configurations>
|
||||
<Files>
|
||||
[%- FOREACH group IN groups %]
|
||||
[%- items = files.grep(group.types) %]
|
||||
[%- IF items.size > 0 %]
|
||||
<Filter
|
||||
Name="[% group.name %]"
|
||||
Filter="">
|
||||
[%- FOREACH file IN items %]
|
||||
<File
|
||||
RelativePath="[% path([my.doc.sourceroot.0, file]) %]">
|
||||
[%- IF my.doc.static %]
|
||||
[%- UNLESS file.match('\\.(h|hpp|rc)$') %]
|
||||
[%- FOREACH build IN builds %]
|
||||
<FileConfiguration
|
||||
Name="[% build.name %]|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
ObjectFile="[% workbuild([file.replace('/', '_'), '.o']) %]"/>
|
||||
</FileConfiguration>
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
</File>
|
||||
[%- END %]
|
||||
</Filter>
|
||||
[%- END %]
|
||||
[%- END %]
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
99
mk/msvcgen/projectx6.tlib
Normal file
99
mk/msvcgen/projectx6.tlib
Normal file
@@ -0,0 +1,99 @@
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template extension for MSVC6 project (vcproj) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
#------------------------------------------------------------------------------
|
||||
# This file, projectx6.tlib, provides additional support for the main MSVC6
|
||||
# project file template, project6.tlib, in the form of macros which customize
|
||||
# the file generation based upon combinations of build mode and target type.
|
||||
#
|
||||
# project6.tlib will look for macros named "tag_build", "tag_type", and
|
||||
# "tag_type_build". `tag' is an arbitrary name, such as "addcpp", "addlink32",
|
||||
# or "linkeropts". which project6.tlib will use when looking for
|
||||
# customizations for a particular section of the project file (such as the
|
||||
# compiler or linker sections, for instance). `build' is one of the build mode
|
||||
# tag names (typically "release" or "debug") from the build[] array
|
||||
# (control.tlib). `type' is one of the project types (typically "appcon",
|
||||
# "appgui", "group", "library", or "plugin") named by the projtypes[] array
|
||||
# (control.tlib).
|
||||
#
|
||||
# For example, to add customization entries to the post-build portion of the
|
||||
# project file in release mode for all project types, provide a macro named
|
||||
# "postbuild_release". To customize the post-build for plugins only but for
|
||||
# all build modes, provide the macro "postbuild_plugin". To add customizations
|
||||
# for the post-build in debug mode for GUI application projects only, provide a
|
||||
# macro named "postbuild_appgui_debug".
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
[%
|
||||
projtypes.appcon.type = 'Console Application';
|
||||
projtypes.appcon.typecode = '0x0103';
|
||||
projtypes.appgui.type = 'Application';
|
||||
projtypes.appgui.typecode = '0x0101';
|
||||
projtypes.group.type = 'Static Library';
|
||||
projtypes.group.typecode = '0x0104';
|
||||
projtypes.library.type = 'Static Library';
|
||||
projtypes.library.typecode = '0x0104';
|
||||
projtypes.plugin.type = 'Dynamic-Link Library';
|
||||
projtypes.plugin.typecode = '0x0102';
|
||||
%]
|
||||
|
||||
[% MACRO delaylibs_plugin
|
||||
GET glue(my.doc.librarydelay,' ','/DELAYLOAD:','.dll') %]
|
||||
|
||||
[% MACRO linkeropts_release GET '/OPT:NOREF' %]
|
||||
[% MACRO linkeropts_debug GET '/debug /pdbtype:sept' %]
|
||||
[% MACRO linkeropts_plugin GET '/dll' %]
|
||||
|
||||
[% MACRO usedebuglibs_release GET '0' %]
|
||||
[% MACRO usedebuglibs_debug GET '1' %]
|
||||
|
||||
[% MACRO addcpp_release GET '/Gy /GF /MD /Ob2 /Og /Oi /Ot /Oy' %]
|
||||
[% MACRO addcpp_debug GET '/GR /MDd /ZI /Od' %]
|
||||
[% MACRO addcpp_library GET '/D "_LIB"' %]
|
||||
|
||||
[% MACRO ignoreexportlib_common(bool) BLOCK -%]
|
||||
# PROP Ignore_Export_Lib [% bool %]
|
||||
[% END %]
|
||||
[% MACRO ignoreexportlib_appcon_release GET ignoreexportlib_common('0') %]
|
||||
[% MACRO ignoreexportlib_appcon_debug GET ignoreexportlib_common('1') %]
|
||||
[% MACRO ignoreexportlib_appgui_release GET ignoreexportlib_common('0') %]
|
||||
[% MACRO ignoreexportlib_appgui_debug GET ignoreexportlib_common('1') %]
|
||||
[% MACRO ignoreexportlib_group GET ignoreexportlib_common('0') %]
|
||||
[% MACRO ignoreexportlib_library GET ignoreexportlib_common('0') %]
|
||||
[% MACRO ignoreexportlib_plugin GET ignoreexportlib_common('1') %]
|
||||
|
||||
[% MACRO addlib32_outfile(suffix) BLOCK -%]
|
||||
/out:"[% worklibout %]\[% my.doc.project.0 %][% suffix %].lib"
|
||||
[%- END %]
|
||||
[% MACRO addlib32_library_release GET addlib32_outfile('') %]
|
||||
[% MACRO addlib32_library_debug GET addlib32_outfile('_d') %]
|
||||
[% MACRO addlib32_group GET addlib32_outfile('') %]
|
||||
|
||||
[% MACRO addlink32_subsystem(subsys) BLOCK -%]
|
||||
/subsystem:[% subsys %]
|
||||
[%- END %]
|
||||
[% MACRO addlink32_common(subsys) BLOCK -%]
|
||||
/out:"[% path([my.doc.buildroot.0, my.doc.target.0]) %]" [%
|
||||
addlink32_subsystem(subsys) %]
|
||||
[%- END %]
|
||||
[% MACRO addlink32_appcon GET addlink32_common('console') %]
|
||||
[% MACRO addlink32_appgui_release GET addlink32_common('windows') %]
|
||||
[% MACRO addlink32_appgui_debug GET addlink32_common('console') %]
|
||||
[% MACRO addlink32_library GET addlink32_subsystem('windows') %]
|
||||
[% MACRO addlink32_plugin GET addlink32_common('windows') %]
|
||||
121
mk/msvcgen/projectx7.tlib
Normal file
121
mk/msvcgen/projectx7.tlib
Normal file
@@ -0,0 +1,121 @@
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template extension for MSVC7 project (vcproj) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
#------------------------------------------------------------------------------
|
||||
# This file, projectx7.tlib, provides additional support for the main MSVC7
|
||||
# project file template, project7.tlib, in the form of macros which customize
|
||||
# the file generation based upon combinations of build mode and target type.
|
||||
#
|
||||
# project7.tlib will look for macros named "tag_build", "tag_type", and
|
||||
# "tag_type_build". `tag' is an arbitrary name, such as "compiler" or "linker"
|
||||
# which project7.tlib will use when looking for customizations for a particular
|
||||
# section of the project file (such as the compiler or linker sections, for
|
||||
# instance). `build' is one of the build mode tag names (typically "release"
|
||||
# or "debug") from the build[] array (control.tlib). `type' is one of the
|
||||
# project types (typically "appcon", "appgui", "group", "library", or "plugin")
|
||||
# named by the projtypes[] array (control.tlib).
|
||||
#
|
||||
# For example, to add customization entries to the compiler portion of the
|
||||
# project file in release mode for all project types, provide a macro named
|
||||
# "compiler_release". To customize linker for plugins only but for all build
|
||||
# modes, provide the macro "linker_plugin". To add customizations for the
|
||||
# compiler in debug mode for GUI application projects only, provide a macro
|
||||
# named "compiler_appgui_debug".
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
[% MACRO global_app BLOCK -%]
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2"
|
||||
[% END %]
|
||||
[% MACRO global_app_release BLOCK -%]
|
||||
WholeProgramOptimization="1"
|
||||
[% END %]
|
||||
[% MACRO global_appcon GET global_app %]
|
||||
[% MACRO global_appcon_release GET global_app_release %]
|
||||
[% MACRO global_appgui GET global_app %]
|
||||
[% MACRO global_appgui_release GET global_app_release %]
|
||||
|
||||
[% MACRO global_group BLOCK -%]
|
||||
ConfigurationType="4"
|
||||
[% END %]
|
||||
|
||||
[% MACRO global_library BLOCK -%]
|
||||
ConfigurationType="4"
|
||||
[% END %]
|
||||
|
||||
[% MACRO global_plugin BLOCK -%]
|
||||
ConfigurationType="2"
|
||||
[% END %]
|
||||
[% MACRO global_plugin_release BLOCK -%]
|
||||
WholeProgramOptimization="1"
|
||||
[% END %]
|
||||
|
||||
[% MACRO compiler_release BLOCK -%]
|
||||
Optimization="2"
|
||||
StringPooling="TRUE"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
DebugInformationFormat="3"
|
||||
BufferSecurityCheck="FALSE"
|
||||
[% END %]
|
||||
[% MACRO compiler_debug BLOCK -%]
|
||||
Optimization="0"
|
||||
MinimalRebuild="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
RuntimeTypeInfo="TRUE"
|
||||
RuntimeLibrary="3"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_release BLOCK -%]
|
||||
LinkIncremental="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
IgnoreDefaultLibraryNames="LIBC,LIBCD,LIBCMT,LIBCMTD"
|
||||
[% END %]
|
||||
[% MACRO linker_debug BLOCK -%]
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
IgnoreDefaultLibraryNames="LIBC,LIBCD,LIBCMT,LIBCMTD,MSVCRT"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_common BLOCK -%]
|
||||
OutputFile="[% path([my.doc.buildroot.0, my.doc.target.0]) %]"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_app(subsys) BLOCK -%]
|
||||
[% linker_common -%]
|
||||
SubSystem="[% subsys %]"
|
||||
[% END %]
|
||||
[% MACRO linker_appcon GET linker_app(1) %]
|
||||
[% MACRO linker_appgui_release GET linker_app(2) %]
|
||||
[% MACRO linker_appgui_debug GET linker_app(1) %]
|
||||
|
||||
[% MACRO linker_plugin BLOCK -%]
|
||||
[% linker_common -%]
|
||||
DelayLoadDLLs="[% glue(my.doc.librarydelay,';','','.dll') %]"
|
||||
ImportLibrary="[% workbuild([my.doc.project.0,'.lib']) %]"
|
||||
[% END %]
|
||||
|
||||
[% MACRO library_outfile(suffix) BLOCK -%]
|
||||
OutputFile="[% worklibout %]\[% my.doc.project.0 %][% suffix %].lib"
|
||||
[% END %]
|
||||
[% MACRO librarian_library_release GET library_outfile('') %]
|
||||
[% MACRO librarian_library_debug GET library_outfile('_d') %]
|
||||
[% MACRO librarian_group GET library_outfile('') %]
|
||||
121
mk/msvcgen/projectxsn71.tlib
Normal file
121
mk/msvcgen/projectxsn71.tlib
Normal file
@@ -0,0 +1,121 @@
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template extension for MSVC7 project (vcproj) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
#------------------------------------------------------------------------------
|
||||
# This file, projectx7.tlib, provides additional support for the main MSVC7
|
||||
# project file template, project7.tlib, in the form of macros which customize
|
||||
# the file generation based upon combinations of build mode and target type.
|
||||
#
|
||||
# project7.tlib will look for macros named "tag_build", "tag_type", and
|
||||
# "tag_type_build". `tag' is an arbitrary name, such as "compiler" or "linker"
|
||||
# which project7.tlib will use when looking for customizations for a particular
|
||||
# section of the project file (such as the compiler or linker sections, for
|
||||
# instance). `build' is one of the build mode tag names (typically "release"
|
||||
# or "debug") from the build[] array (control.tlib). `type' is one of the
|
||||
# project types (typically "appcon", "appgui", "group", "library", or "plugin")
|
||||
# named by the projtypes[] array (control.tlib).
|
||||
#
|
||||
# For example, to add customization entries to the compiler portion of the
|
||||
# project file in release mode for all project types, provide a macro named
|
||||
# "compiler_release". To customize linker for plugins only but for all build
|
||||
# modes, provide the macro "linker_plugin". To add customizations for the
|
||||
# compiler in debug mode for GUI application projects only, provide a macro
|
||||
# named "compiler_appgui_debug".
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
[% MACRO global_app BLOCK -%]
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2"
|
||||
[% END %]
|
||||
[% MACRO global_app_release BLOCK -%]
|
||||
WholeProgramOptimization="1"
|
||||
[% END %]
|
||||
[% MACRO global_appcon GET global_app %]
|
||||
[% MACRO global_appcon_release GET global_app_release %]
|
||||
[% MACRO global_appgui GET global_app %]
|
||||
[% MACRO global_appgui_release GET global_app_release %]
|
||||
|
||||
[% MACRO global_group BLOCK -%]
|
||||
ConfigurationType="4"
|
||||
[% END %]
|
||||
|
||||
[% MACRO global_library BLOCK -%]
|
||||
ConfigurationType="4"
|
||||
[% END %]
|
||||
|
||||
[% MACRO global_plugin BLOCK -%]
|
||||
ConfigurationType="2"
|
||||
[% END %]
|
||||
[% MACRO global_plugin_release BLOCK -%]
|
||||
WholeProgramOptimization="1"
|
||||
[% END %]
|
||||
|
||||
[% MACRO compiler_release BLOCK -%]
|
||||
Optimization="2"
|
||||
StringPooling="TRUE"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
DebugInformationFormat="3"
|
||||
BufferSecurityCheck="FALSE"
|
||||
[% END %]
|
||||
[% MACRO compiler_debug BLOCK -%]
|
||||
Optimization="0"
|
||||
MinimalRebuild="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
RuntimeTypeInfo="TRUE"
|
||||
RuntimeLibrary="3"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_release BLOCK -%]
|
||||
LinkIncremental="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
IgnoreDefaultLibraryNames="LIBC,LIBCD,LIBCMT,LIBCMTD"
|
||||
[% END %]
|
||||
[% MACRO linker_debug BLOCK -%]
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
IgnoreDefaultLibraryNames="LIBC,LIBCD,LIBCMT,LIBCMTD,MSVCRT"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_common BLOCK -%]
|
||||
OutputFile="[% path([my.doc.buildroot.0, my.doc.target.0]) %]"
|
||||
[% END %]
|
||||
|
||||
[% MACRO linker_app(subsys) BLOCK -%]
|
||||
[% linker_common -%]
|
||||
SubSystem="[% subsys %]"
|
||||
[% END %]
|
||||
[% MACRO linker_appcon GET linker_app(1) %]
|
||||
[% MACRO linker_appgui_release GET linker_app(2) %]
|
||||
[% MACRO linker_appgui_debug GET linker_app(1) %]
|
||||
|
||||
[% MACRO linker_plugin BLOCK -%]
|
||||
[% linker_common -%]
|
||||
DelayLoadDLLs="[% glue(my.doc.librarydelay,';','','.dll') %]"
|
||||
ImportLibrary="[% workbuild([my.doc.project.0,'.a']) %]"
|
||||
[% END %]
|
||||
|
||||
[% MACRO library_outfile(suffix) BLOCK -%]
|
||||
OutputFile="[% worklibout %]\[% my.doc.project.0 %][% suffix %].a"
|
||||
[% END %]
|
||||
[% MACRO librarian_library_release GET library_outfile('') %]
|
||||
[% MACRO librarian_library_debug GET library_outfile('_d') %]
|
||||
[% MACRO librarian_group GET library_outfile('') %]
|
||||
65
mk/msvcgen/workspace6.tlib
Normal file
65
mk/msvcgen/workspace6.tlib
Normal file
@@ -0,0 +1,65 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC6 workspace (dsw) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
projects = filter(my.doc.project).split('\|').sort;
|
||||
END -%]
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
[% FOREACH project IN projects -%]
|
||||
###############################################################################
|
||||
|
||||
Project: "[% project %]"=.\[% project %].dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
[% FOREACH dep IN filter(my.doc.$project).split('\|').sort -%]
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name [% dep %]
|
||||
End Project Dependency
|
||||
[% END -%]
|
||||
}}}
|
||||
|
||||
[% END -%]
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
66
mk/msvcgen/workspace7.tlib
Normal file
66
mk/msvcgen/workspace7.tlib
Normal file
@@ -0,0 +1,66 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC7 solution (sln) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
projects = filter(my.doc.project).split('\|').sort;
|
||||
guids = {};
|
||||
FOREACH project IN projects;
|
||||
guids.$project = guid(project);
|
||||
END;
|
||||
END -%]
|
||||
Microsoft Visual Studio Solution File, Format Version [% my.doc.formatversion.0 %]
|
||||
# Visual C++ Express 2005
|
||||
[% FOREACH project IN projects -%]
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "[% project %]", "
|
||||
[%- project %].vcproj", "{[% guids.$project %]}"
|
||||
EndProject
|
||||
[% END -%]
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
[% n = 0; FOREACH build IN builds -%]
|
||||
ConfigName.[% n; n = n + 1 %] = [% build.name %]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectDependencies) = postSolution
|
||||
[% FOREACH project IN projects; g = guids.$project; n = 0 -%]
|
||||
[% FOREACH dep IN filter(my.doc.$project).split('\|').sort -%]
|
||||
{[% g %]}.[% n; n = n + 1 %] = {[% guids.$dep %]}
|
||||
[% END -%]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
[% FOREACH project IN projects; g = guids.$project -%]
|
||||
[% FOREACH build IN builds -%]
|
||||
{[% g %]}.[% build.name %].ActiveCfg = [% build.name %]|Win32
|
||||
{[% g %]}.[% build.name %].Build.0 = [% build.name %]|Win32
|
||||
[% END -%]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
66
mk/msvcgen/workspacesn71.tlib
Normal file
66
mk/msvcgen/workspacesn71.tlib
Normal file
@@ -0,0 +1,66 @@
|
||||
[% FILTER null;
|
||||
#==============================================================================
|
||||
# TemplateToolkit2 template for MSVC7 solution (sln) file.
|
||||
# Copyright (C) 2004 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.
|
||||
#
|
||||
#==============================================================================
|
||||
PROCESS macros.tlib;
|
||||
PROCESS control.tlib;
|
||||
|
||||
my = {};
|
||||
load(respfile, 'doc');
|
||||
FOREACH f IN my.doc.customize; PROCESS $f | null; END;
|
||||
|
||||
projects = filter(my.doc.project).split('\|').sort;
|
||||
guids = {};
|
||||
FOREACH project IN projects;
|
||||
guids.$project = guid(project);
|
||||
END;
|
||||
END -%]
|
||||
Microsoft Visual Studio Solution File, Format Version [% my.doc.formatversion.0 %]
|
||||
# Visual C++ Express 2005
|
||||
[% FOREACH project IN projects -%]
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "[% project %]", "
|
||||
[%- project %].vcproj", "{[% guids.$project %]}"
|
||||
EndProject
|
||||
[% END -%]
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
[% n = 0; FOREACH build IN builds -%]
|
||||
ConfigName.[% n; n = n + 1 %] = [% build.name %]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectDependencies) = postSolution
|
||||
[% FOREACH project IN projects; g = guids.$project; n = 0 -%]
|
||||
[% FOREACH dep IN filter(my.doc.$project).split('\|').sort -%]
|
||||
{[% g %]}.[% n; n = n + 1 %] = {[% guids.$dep %]}
|
||||
[% END -%]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
[% FOREACH project IN projects; g = guids.$project -%]
|
||||
[% FOREACH build IN builds -%]
|
||||
{[% g %]}.[% build.name %].ActiveCfg = [% build.name %]|Win32
|
||||
{[% g %]}.[% build.name %].Build.0 = [% build.name %]|Win32
|
||||
[% END -%]
|
||||
[% END -%]
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Reference in New Issue
Block a user