#============================================================================ # Rules for swig # Copyright (C)2004 by Eric Sunshine # Copyright (C)2003 by Matze Braun # # 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 defines INT64_C() and cousins, which # means that the __STDC_CONSTANT_MACROS and __STDC_LIMIT_MACROS macros must # be defined before is included. In some Python installations, # Python.h includes , 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 ; } }