- add support for bindings creation
authorMichael Schroeder <mls@suse.de>
Wed, 13 Jul 2011 16:46:17 +0000 (18:46 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 13 Jul 2011 16:46:17 +0000 (18:46 +0200)
CMakeLists.txt
bindings/CMakeLists.txt [new file with mode: 0644]
bindings/perl/CMakeLists.txt [new file with mode: 0644]
bindings/python/CMakeLists.txt [new file with mode: 0644]
bindings/ruby/CMakeLists.txt [new file with mode: 0644]
bindings/solv.i
examples/p5solv
examples/pysolv [changed mode: 0644->0755]
examples/rbsolv

index 9634bc3..1afd2eb 100644 (file)
@@ -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 (file)
index 0000000..1fe3061
--- /dev/null
@@ -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 (file)
index 0000000..8f86cf8
--- /dev/null
@@ -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 (file)
index 0000000..31a69c1
--- /dev/null
@@ -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 (file)
index 0000000..e536ca2
--- /dev/null
@@ -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})
index 3fe9bcb..c029cb4 100644 (file)
     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 <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
 
 #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;
index c2efc39..08c96bc 100755 (executable)
@@ -3,7 +3,6 @@
 use POSIX;
 use Fcntl;
 use Config::IniFiles;
-use File::FnMatch;
 use Data::Dumper;
 use solv;
 use Devel::Peek;
old mode 100644 (file)
new mode 100755 (executable)
index 5cc2a5a..2e206a0 100755 (executable)
@@ -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