Сборка вручную из командной строки
Не добавляя шаги SWIG в ваши make-файлы, вы можете создать расширение SWIG, используя эти команды (если у вас есть source_file.cpp и your_extension.i для создания модуля python):
# creation of your_extension_wrap.cpp
swig -c++ -python -o your_extension_wrap.cpp your_extension.i
# creation of your_extension_wrap.o, source_file.o and your_extension.py
g++ -fPIC -c your_extension_wrap.cpp source_file.cpp -I/usr/include/python2.7
# creation of the library _your_extension.so
g++ -shared your_extension_wrap.o source_file.o -o _your_extension.so
Примечание : важно поставить префикс имени разделяемого объекта с подчеркиванием, иначе Python не сможет найти его при выполнении импорта your_extension.
Добавление SWIG в Autoconf
Я написал небольшую программу на Python, в которой мне нужен один файл, написанный на C ++ (например, метод округления).
Вам нужны дополнительные макросы Autoconf длявключить поддержку SWIG.Как отметил johanvdw, будет проще, если вы будете использовать эти два макроса m4: ax_pck_swig и ax_swig_python.Я скачал из макроархива Autoconf и поместил его в подкаталог m4 моего дерева проектов:
trunk
├── configure.ac
├── __init__.py
├── m4
│ ├── ax_pkg_swig.m4
│ ├── ax_swig_python.m4
│ ├── libtool.m4
│ ├── lt~obsolete.m4
│ ├── ltoptions.m4
│ ├── ltsugar.m4
│ └── ltversion.m4
├── Makefile.am
├── rounding_swig
│ ├── compile.txt
│ ├── __init__.py
│ ├── Makefile.am
│ ├── rnd_C.cpp
│ ├── rounding.i
│ ├── rounding_wrap.cpp
└── src
├── cadna_add.py
├── cadna_computedzero.py
├── cadna_convert.py
├── __init__.py
└── Makefile.am
Когда вы помещаете два макроса m4 в подкаталог, вам нужно добавитьэта строка для вашего trunk / Makefile.am:
ACLOCAL_AMFLAGS = -I m4
Теперь давайте посмотрим на trunk / configure.ac:
AC_PREREQ([2.69]) # Check autoconf version
AC_INIT(CADNA_PY, 1.0.0, cadna-team@lip6.fr) # Name of your software
AC_CONFIG_SRCDIR([rounding_swig/rnd_C.cpp]) # Name of the c++ source
AC_CONFIG_MACRO_DIR(m4) # Indicate where are your m4 macro
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE
AC_DISABLE_STATIC #enable shared libraries
# Checks for programs.
AC_PROG_LIBTOOL # check libtool
AC_PROG_CXX # check c++ compiler
AM_PATH_PYTHON(2.3) # check python version
AX_PKG_SWIG(1.3.21) # check swig version
AX_SWIG_ENABLE_CXX # fill some variable usefull later
AX_SWIG_PYTHON # same
# Checks for header files.
AC_CHECK_HEADERS([fenv.h stdlib.h string.h]) # any header needed by your c++ source
# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_TYPE_SIZE_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([fesetround memset strstr])
AC_CONFIG_FILES([
Makefile
src/Makefile
rounding_swig/Makefile
])
LIBPYTHON="python$PYTHON_VERSION" # define the python interpreter
LDFLAGS="$LDFLAGS -l$LIBPYTHON"
AC_OUTPUT
Добавление SWIG в Automake
В вашемtrunk / Makefile.am, вам нужно сделать следующее:
ACLOCAL_AMFLAGS = -I m4
# Indicate the subdir of c++ file and python file
SUBDIRS = src rounding_swig
# Indicate a list of all the files that are part of the package, but
# are not installed by default and were not specified in any other way
EXTRA_DIST= \
rounding_swig/rounding.i \
rounding_swig/testrounding.py \
rounding_swig/testrounding.cpp
В вашем trunk / src / Makefile.am:
# Python source files that will be install in prefix/lib/name_of_your_python_interpreter/site-packages/name_of_your_project
pkgpython_PYTHON = cadna_add.py cadna_computedzero.py cadna_convert.py
Сложная часть находится в trunk / rounding_swig /Makefile.am.Он создает библиотеку .la и _your_extension.so и помещает ее в префикс / lib64 / python2.7 / site-packages / name_of_the_project /.
# Name of the cpp source file
BUILT_SOURCES = rounding_wrap.cpp
# Name of the swig source file
SWIG_SOURCES = rounding.i
# Python source files that will be install in prefix/lib/name_of_your_python_interpreter/site-packages/name_of_your_project
pkgpython_PYTHON = rounding.py __init__.py
pkgpyexec_LTLIBRARIES = _rounding.la
_rounding_la_SOURCES = rounding_wrap.cpp $(SWIG_SOURCES) rnd_C.cpp
_rounding_la_CPPFLAGS = $(AX_SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/rounding_swig -I/usr/include/python@PYTHON_VERSION@ -lpython@PYTHON_VERSION@
_rounding_la_LDFLAGS = -module
rounding_wrap.cpp: $(SWIG_SOURCES)
$(SWIG) $(AX_SWIG_PYTHON_OPT) -I$(top_srcdir)/rounding_swig -I/usr/include/python@PYTHON_VERSION@ -o $@ $<
В конце, еслиу вас нет 5 других макросов, вы можете получить его, набрав:
autoreconf -i
Наконец, чтобы установить ваш проект:
libtoolize && aclocal && autoheader && autoconf && automake -a -c
./configure --prefix= <endroit ou vous voulez installer cadna>
make
make install
PS: Здесь это устаревшее, но простое учебное пособие, которое мне помогло (устарело, потому что использовалось ac_pkg_swig.m4, которое не работает с новой версией swig).