From 96d3ffea9f0ab1a454a9f48e698291d89d0ec22b Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Wed, 13 Jul 2011 18:46:17 +0200 Subject: [PATCH] - add support for bindings creation --- CMakeLists.txt | 7 +++++++ bindings/CMakeLists.txt | 22 ++++++++++++++++++++++ bindings/perl/CMakeLists.txt | 37 +++++++++++++++++++++++++++++++++++++ bindings/python/CMakeLists.txt | 28 ++++++++++++++++++++++++++++ bindings/ruby/CMakeLists.txt | 24 ++++++++++++++++++++++++ bindings/solv.i | 34 +++++++++++++++++++--------------- examples/p5solv | 1 - examples/pysolv | 0 examples/rbsolv | 2 +- 9 files changed, 138 insertions(+), 17 deletions(-) create mode 100644 bindings/CMakeLists.txt create mode 100644 bindings/perl/CMakeLists.txt create mode 100644 bindings/python/CMakeLists.txt create mode 100644 bindings/ruby/CMakeLists.txt mode change 100644 => 100755 examples/pysolv diff --git a/CMakeLists.txt b/CMakeLists.txt index 9634bc3..1afd2eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,10 @@ CMAKE_MINIMUM_REQUIRED (VERSION 2.4) OPTION(ENABLE_STATIC "Build a static version of the libraries?" OFF) OPTION(DISABLE_SHARED "Do not build a shared version of the libraries?" OFF) +OPTION(ENABLE_PERL "Build the perl bindings?" OFF) +OPTION(ENABLE_PYTHON "Build the python bindings?" OFF) +OPTION(ENABLE_RUBY "Build the ruby bindings?" OFF) + #IF(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERISION} GREATER 2.4) #ENDIF(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERISION} GREATER 2.4) @@ -182,6 +186,9 @@ set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -O0") ADD_SUBDIRECTORY (src) ADD_SUBDIRECTORY (ext) ADD_SUBDIRECTORY (tools) +IF (ENABLE_PERL OR ENABLE_PYTHON OR ENABLE_RUBY) + ADD_SUBDIRECTORY (bindings) +ENDIF (ENABLE_PERL OR ENABLE_PYTHON OR ENABLE_RUBY) ADD_SUBDIRECTORY (examples) MESSAGE (STATUS "version: ${VERSION}") diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt new file mode 100644 index 0000000..1fe3061 --- /dev/null +++ b/bindings/CMakeLists.txt @@ -0,0 +1,22 @@ +# as we link with --as-needed we do not get bogus dependencies +SET (SYSTEM_LIBRARIES ${EXPAT_LIBRARY} ${ZLIB_LIBRARY}) +IF (NOT DEBIAN) +SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES}) +ENDIF (NOT DEBIAN) + +SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") + +FIND_PACKAGE (SWIG) + +MESSAGE (STATUS "Found SWIG version ${SWIG_VERSION}") +SET (SWIG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/solv.i") + +IF (ENABLE_PYTHON) + ADD_SUBDIRECTORY (python) +ENDIF (ENABLE_PYTHON) +IF (ENABLE_PERL) + ADD_SUBDIRECTORY (perl) +ENDIF (ENABLE_PERL) +IF (ENABLE_RUBY) + ADD_SUBDIRECTORY (ruby) +ENDIF (ENABLE_RUBY) diff --git a/bindings/perl/CMakeLists.txt b/bindings/perl/CMakeLists.txt new file mode 100644 index 0000000..8f86cf8 --- /dev/null +++ b/bindings/perl/CMakeLists.txt @@ -0,0 +1,37 @@ +FIND_PACKAGE (Perl) + +EXECUTE_PROCESS(COMMAND ${PERL_EXECUTABLE} -e "use Config; print \$Config{ccflags}" OUTPUT_VARIABLE PERL_CCFLAGS) +EXECUTE_PROCESS(COMMAND ${PERL_EXECUTABLE} -e "use Config; print \$Config{archlib}.\"/CORE\"" OUTPUT_VARIABLE PERL_CORE_DIR) +EXECUTE_PROCESS(COMMAND ${PERL_EXECUTABLE} -e "use Config; print \$Config{ccldflags}" OUTPUT_VARIABLE PERL_CCLDFLAGS) +EXECUTE_PROCESS(COMMAND ${PERL_EXECUTABLE} -e "use Config; print \$Config{installsitearch}" OUTPUT_VARIABLE PERL_SITEARCHDIR) +EXECUTE_PROCESS(COMMAND ${PERL_EXECUTABLE} -e "use Config; print \$Config{installvendorarch}" OUTPUT_VARIABLE PERL_VENDORARCHDIR) + +IF (USE_VENDORDIRS) + SET (PERL_INSTALL_DIR ${PERL_VENDORARCHDIR}) +ELSE (USE_VENDORDIRS) + SET (PERL_INSTALL_DIR ${PERL_SITEARCHDIR}) +ENDIF (USE_VENDORDIRS) + +MESSAGE (STATUS "Perl executable: ${PERL_EXECUTABLE}") +MESSAGE (STATUS "Perl installation dir: ${PERL_INSTALL_DIR}") + +ADD_CUSTOM_COMMAND ( + OUTPUT solv_perl.c + COMMAND ${SWIG_EXECUTABLE} -perl -I${CMAKE_SOURCE_DIR}/src -o solv_perl.c ${CMAKE_SOURCE_DIR}/bindings/solv.i + COMMAND sed -i -e "s/SvTYPE(tsv) == SVt_PVHV/SvTYPE(tsv) == SVt_PVHV || SvTYPE(tsv) == SVt_PVAV/" solv_perl.c + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/bindings/solv.i + VERBATIM +) + +ADD_DEFINITIONS(${PERL_CCFLAGS} -Wno-unused) +LINK_DIRECTORIES (${PERL_CORE_DIR}) +INCLUDE_DIRECTORIES (${PERL_INCLUDE_PATH} ${PERL_CORE_DIR}) + +ADD_LIBRARY (bindings_perl SHARED solv_perl.c) +SET_TARGET_PROPERTIES (bindings_perl PROPERTIES PREFIX "" OUTPUT_NAME "solv") +SET_TARGET_PROPERTIES (bindings_perl PROPERTIES LINK_FLAGS "${PERL_CCLDFLAGS}") +TARGET_LINK_LIBRARIES (bindings_perl libsolvext libsolv ${SYSTEM_LIBRARIES}) + +INSTALL (TARGETS bindings_perl LIBRARY DESTINATION ${PERL_INSTALL_DIR}) +INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/solv.pm DESTINATION ${PERL_INSTALL_DIR}) diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt new file mode 100644 index 0000000..31a69c1 --- /dev/null +++ b/bindings/python/CMakeLists.txt @@ -0,0 +1,28 @@ +FIND_PACKAGE (PythonLibs) +FIND_PACKAGE (PythonInterp REQUIRED) +EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; from distutils import sysconfig; stdout.write(sysconfig.get_python_lib())" OUTPUT_VARIABLE PYTHON_LIB_DIR) + +IF (NOT PYTHON_SITEDIR) + SET (PYTHON_SITEDIR ${PYTHON_LIB_DIR}) +ENDIF (NOT PYTHON_SITEDIR) + +SET (PYTHON_INSTALL_DIR ${PYTHON_SITEDIR}) + +MESSAGE (STATUS "Python executable: ${PYTHON_EXECUTABLE}") +MESSAGE (STATUS "Python installation dir: ${PYTHON_INSTALL_DIR}") + +ADD_CUSTOM_COMMAND ( + OUTPUT solv_python.c + COMMAND ${SWIG_EXECUTABLE} -python -I${CMAKE_SOURCE_DIR}/src -o solv_python.c ${CMAKE_SOURCE_DIR}/bindings/solv.i + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/bindings/solv.i +) +INCLUDE_DIRECTORIES (${PYTHON_INCLUDE_PATH}) + +ADD_LIBRARY (bindings_python SHARED solv_python.c) +SET_TARGET_PROPERTIES (bindings_python PROPERTIES PREFIX "" OUTPUT_NAME "_solv") +TARGET_LINK_LIBRARIES (bindings_python libsolvext libsolv ${SYSTEM_LIBRARIES}) + +INSTALL (TARGETS bindings_python LIBRARY DESTINATION ${PYTHON_INSTALL_DIR}) +INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/solv.py DESTINATION ${PYTHON_INSTALL_DIR}) + diff --git a/bindings/ruby/CMakeLists.txt b/bindings/ruby/CMakeLists.txt new file mode 100644 index 0000000..e536ca2 --- /dev/null +++ b/bindings/ruby/CMakeLists.txt @@ -0,0 +1,24 @@ +FIND_PACKAGE (Ruby) + +IF (USE_VENDORDIRS) + SET (RUBY_INSTALL_DIR ${RUBY_VENDORARCH_DIR}) +ELSE (USE_VENDORDIRS) + SET (RUBY_INSTALL_DIR ${RUBY_SITEARCH_DIR}) +ENDIF (USE_VENDORDIRS) + +MESSAGE (STATUS "Ruby executable: ${RUBY_EXECUTABLE}") +MESSAGE (STATUS "Ruby installation dir: ${RUBY_INSTALL_DIR}") + +ADD_CUSTOM_COMMAND ( + OUTPUT solv_ruby.c + COMMAND ${SWIG_EXECUTABLE} -ruby -I${CMAKE_SOURCE_DIR}/src -o solv_ruby.c ${CMAKE_SOURCE_DIR}/bindings/solv.i + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${CMAKE_SOURCE_DIR}/bindings/solv.i +) +INCLUDE_DIRECTORIES (${RUBY_INCLUDE_PATH}) + +ADD_LIBRARY (bindings_ruby SHARED solv_ruby.c) +SET_TARGET_PROPERTIES (bindings_ruby PROPERTIES PREFIX "" OUTPUT_NAME "solv") +TARGET_LINK_LIBRARIES (bindings_ruby libsolvext libsolv ${SYSTEM_LIBRARIES}) + +INSTALL (TARGETS bindings_ruby LIBRARY DESTINATION ${RUBY_INSTALL_DIR}) diff --git a/bindings/solv.i b/bindings/solv.i index 3fe9bcb..c029cb4 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -150,7 +150,10 @@ int v; int e = SWIG_AsVal_int(*o, &v); if (!SWIG_IsOK(e)) - SWIG_croak("list must contain only integers"); + { + SWIG_Error(SWIG_RuntimeError, "list must contain only integers"); + SWIG_fail; + } queue_push(&$1, v); } } @@ -328,10 +331,13 @@ typedef VALUE AppObjectPtr; %include "typemaps.i" %{ -#include "stdio.h" -#include "sys/stat.h" +#include +#include +#include +#include #include "pool.h" +#include "poolarch.h" #include "solver.h" #include "policy.h" #include "solverdebug.h" @@ -750,7 +756,7 @@ typedef struct { char *hex() { int l; const unsigned char *b; - char *ret, *rp; + char *ret; b = solv_chksum_get($self, &l); ret = solv_malloc(2 * l + 1); @@ -1010,7 +1016,7 @@ typedef struct { Datamatcher ma; if (!datamatcher_init(&ma, match, flags)) { for (id = 1; id < pool->ss.nstrings; id++) - if (pool->whatprovides[id] && datamatcher_match(&ma, id2str(pool, id))) + if (pool->whatprovides[id] && datamatcher_match(&ma, pool_id2str(pool, id))) queue_push(&q, id); datamatcher_free(&ma); } @@ -1327,19 +1333,19 @@ typedef struct { return $self->key->name; } const char *key_idstr() { - return id2str($self->pool, $self->key->name); + return pool_id2str($self->pool, $self->key->name); } Id type_id() { return $self->key->type; } const char *type_idstr() { - return id2str($self->pool, $self->key->type); + return pool_id2str($self->pool, $self->key->type); } Id id() { return $self->kv.id; } const char *idstr() { - return id2str($self->pool, $self->kv.id); + return pool_id2str($self->pool, $self->kv.id); } const char *str() { return $self->kv.str; @@ -1389,7 +1395,6 @@ typedef struct { %newobject __next__; XSolvable *__next__() { Pool *pool = $self->pool; - XSolvable *s; if ($self->id >= pool->nsolvables) return 0; while (++$self->id < pool->nsolvables) @@ -1500,7 +1505,6 @@ typedef struct { XSolvable *__next__() { Repo *repo = $self->repo; Pool *pool = repo->pool; - XSolvable *s; if (repo->start > 0 && $self->id < repo->start) $self->id = repo->start - 1; if ($self->id >= repo->end) @@ -1592,7 +1596,7 @@ typedef struct { const unsigned char *b = pool_lookup_bin_checksum($self->pool, $self->id, keyname, &type); return solv_chksum_create_from_bin(type, b); } - const char *lookup_location(int *OUTPUT) { + const char *lookup_location(unsigned int *OUTPUT) { return solvable_get_location($self->pool->solvables + $self->id, OUTPUT); } #ifdef SWIGRUBY @@ -1613,7 +1617,7 @@ typedef struct { %{ SWIGINTERN const char *XSolvable_name_get(XSolvable *xs) { Pool *pool = xs->pool; - return id2str(pool, pool->solvables[xs->id].name); + return pool_id2str(pool, pool->solvables[xs->id].name); } %} Id const nameid; @@ -1626,7 +1630,7 @@ typedef struct { %{ SWIGINTERN const char *XSolvable_evr_get(XSolvable *xs) { Pool *pool = xs->pool; - return id2str(pool, pool->solvables[xs->id].evr); + return pool_id2str(pool, pool->solvables[xs->id].evr); } %} Id const evrid; @@ -1639,7 +1643,7 @@ typedef struct { %{ SWIGINTERN const char *XSolvable_arch_get(XSolvable *xs) { Pool *pool = xs->pool; - return id2str(pool, pool->solvables[xs->id].arch); + return pool_id2str(pool, pool->solvables[xs->id].arch); } %} Id const archid; @@ -1652,7 +1656,7 @@ typedef struct { %{ SWIGINTERN const char *XSolvable_vendor_get(XSolvable *xs) { Pool *pool = xs->pool; - return id2str(pool, pool->solvables[xs->id].vendor); + return pool_id2str(pool, pool->solvables[xs->id].vendor); } %} Id const vendorid; diff --git a/examples/p5solv b/examples/p5solv index c2efc39..08c96bc 100755 --- a/examples/p5solv +++ b/examples/p5solv @@ -3,7 +3,6 @@ use POSIX; use Fcntl; use Config::IniFiles; -use File::FnMatch; use Data::Dumper; use solv; use Devel::Peek; diff --git a/examples/pysolv b/examples/pysolv old mode 100644 new mode 100755 diff --git a/examples/rbsolv b/examples/rbsolv index 5cc2a5a..2e206a0 100755 --- a/examples/rbsolv +++ b/examples/rbsolv @@ -87,7 +87,7 @@ class Repo_generic if chksum fchksum = Solv::Chksum.new(chksum.type) fchksum.add_fd(f.fileno) - if !fchksum.matches(chksum) + if !fchksum == chksum puts "#{file}: checksum error" @incomplete = true if markincomplete return nil -- 2.7.4