trying to improve Python interface

This commit is contained in:
Vitor Santos Costa
2016-12-10 01:01:10 -06:00
parent 474fa2fe14
commit 70b11ab8f9
35 changed files with 592 additions and 19841 deletions

View File

@@ -1,4 +1,9 @@
#CHECK: SWIG
option (WITH_SWiG
"Allow Python->YAP and Java->YAP" ON)
IF (WITH_SWiG)
find_host_package (SWIG)
macro_log_feature (SWIG_FOUND "Swig"
"Use SWIG Documentation System "
@@ -20,7 +25,10 @@ if (ANDROID)
add_subdirectory(android)
else(ANDROID)
add_subdirectory(python)
add_subdirectory(java)
# add_subdirectory(java)
endif(ANDROID)
endif (SWIG_FOUND)
ENDIF (WITH_SWiG)

View File

@@ -1,95 +0,0 @@
macro_optional_find_package(Java ON)
find_package(Java COMPONENTS Runtime Development)
#find_ mmmk]\']package(Java COMPONENTS Runtime)
macro_log_feature (Java_Development_FOUND "Java"
"Use Java System"
"http://www.java.org" FALSE)
macro_optional_find_package(JNI ON)
macro_log_feature (JNI_FOUND "JNI"
"Use Java Native Interface"
"http://www.java.org" FALSE)
if (Java_Development_FOUND)
include ( UseJava )
include ( UseSWIG )
# SET(CMAKE_SWIG_FLAGS -package YAP)
set (CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR} )
SET(SWIG_SOURCES
../yap.i
)
#set (CMAKE_JAVA_CLASS_OUTPUT_PATH java)
SET_SOURCE_FILES_PROPERTIES(${SWIG_SOURCES} PROPERTIES CPLUSPLUS ON)
include_directories (
${CMAKE_SOURCE_DIR}/CXX
${JAVA_INCLUDE_DIRS}
${JNI_INCLUDE_DIRS}
)
if ( ${C_COMPILER} MATCHES "Clang")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-prototypes")
endif()
if ( ${C_COMPILER} MATCHES "GNU")
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-declarations")
endif()
#SET(CMAKE_SWIG_FLAGS "${CMAKE_SWIG_FLAGS} ")
SWIG_ADD_MODULE(Native java ${SWIG_SOURCES}
)
add_dependencies(Native Yap++ )
SWIG_LINK_LIBRARIES (Native Yap++ )
set(CMAKE_JNI_TARGET 1)
ADD_JAR( NativeJar
SOURCES "../../../misc/icons/yap_16x16x32.png"
DEPENDS Native
PROPERTIES OUTPUT_NAME Native
)
install_jar(NativeJar ${libpl})
add_dependencies(NativeJar Native )
#install_jni_symlink(NativeJar .)
ADD_CUSTOM_COMMAND(TARGET NativeJar
POST_BUILD
COMMAND cmake -E echo "Compiling Java files..."
COMMAND ${Java_JAVAC_EXECUTABLE} *.java -cp .
COMMAND cmake -E echo "Creating jar file..."
COMMAND ${Java_JAR_EXECUTABLE} -ufM Native.jar *.class
)
ADD_JAR( JavaYAP
SOURCES "JavaYAP.java"
ENTRY_POINT JavaYAP
INCLUDE_JARS NativeJar )
SET(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.8" "-target" "1.8")
install( TARGETS Native
RUNTIME DESTINATION ${bindir}
ARCHIVE DESTINATION ${libdir}
LIBRARY DESTINATION ${libdir}
)
install_jar(JavaYAP ${libpl})
#install_jni_symlink(JavaYAP ${libpl})
Endif (Java_Development_FOUND)

View File

@@ -43,7 +43,7 @@ if (JNI_FOUND)
set(CMAKE_JNI_TARGET 1)
ADD_JAR( NativeJar
SOURCES "../../../docs/icons/yap_16x16x32.png"
SOURCES "${CMAKE_SOURCES_DIR}/docs/icons/yap_16x16x32.png"
DEPENDS Native
PROPERTIES OUTPUT_NAME Native
)

View File

@@ -1,7 +1,7 @@
//package pt.up.fc.dcc.yap;
//package pt.up.yap;
//
import java.io.* ;
//import YAP.* ;
import pt.up.yap.* ;
class JavaYAP {
YAPQuery q;
@@ -34,10 +34,10 @@ class JavaYAP {
q.close();
return false;
}
YAPListTerm vs = q.namedVars();
YAPTerm vs = YAPTerm( q.namedVars() );
System.out.println("Another one "+vs);
while(!vs.nil()){
YAPTerm eq = vs.car();
eq = YAPTerm( vs.car() );
//outputText.append(Integer.toString(i) + ": " + eq.text() );
System.out.println(":\t" + eq.getArg(1).text() + " = " + eq.getArg(2).text() +"\n" );
vs = vs.cdr();
@@ -89,7 +89,7 @@ class JavaYAP {
}
}
public static void main(String args[])
{
System.loadLibrary("Native");

View File

@@ -3,11 +3,20 @@
INCLUDE(${SWIG_USE_FILE})
GET_PROPERTY(OBJECTS TARGET core PROPERTY SOURCES)
GET_PROPERTY(OBJECTS TARGET libYAPOs PROPERTY SOURCES)
GET_PROPERTY(OBJECTS TARGET libOPTYap PROPERTY SOURCES)
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET myddas PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET Yapsqlite3 PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET libswi PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET myddas PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET utf8proc PROPERTY SOURCES))
# list( APPEND OBJECTS GET_PROPERTY(sourcefiles TARGET Yap++ PROPERTY SOURCES))
if (PYTHONLIBS_FOUND)
include(FindPythonModule)
include(FindPythonModule)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/CXX)
@@ -16,45 +25,46 @@ if (PYTHONLIBS_FOUND)
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES SWIG_FLAGS "-includeall")
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY SWIG_MODULE_NAME libPy2YAP )
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTIES SWIG_FLAGS "-py3")
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY SWIG_MODULE_NAME yap )
SET_SOURCE_FILES_PROPERTIES(../yap.i PROPERTY OUTPUT_NAME yap )
configure_file ("setup.py.cmake" "setup.py" )
configure_file ("../yap.i" "yap.i" )
#configure_file ("setup.py.cmake" "setup.py" )
#configure_file ("../yap.i" "yap.i" )
#SET( CMAKE_SWIG_OUTDIR "yap" )
SET( CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/yap" )
# SWIG_ADD_MODULE(Py2YAP python ../yap.i )
# SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ libYap YAPPython)
# set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
# NO_SONAME ON )
SWIG_ADD_MODULE(Py2YAP python ../yap.i )
SWIG_LINK_LIBRARIES(Py2YAP ${PYTHON_LIBRARIES} Yap++ YAPPython libYap)
set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME} PROPERTIES
NO_SONAME ON OUTPUT_NAME _yap LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/yap" )
# execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print( sysconfig.get_python_lib( plat_specific=True, prefix='${CMAKE_INSTALL_PREFIX}' ) )"
# OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
# OUTPUT_STRIP_TRAILING_WHITESPACE )
# get_filename_component ( _ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
# file ( RELATIVE_PATH _REL_PYTHON_MOULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
execute_process ( COMMAND ${PYTHON_EXECUTABLE} -c "import sysconfig; print( sysconfig.get_path( 'platlib' ) )"
OUTPUT_VARIABLE _ABS_PYTHON_MODULE_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE )
get_filename_component ( ABS_PYTHON_MODULE_PATH ${_ABS_PYTHON_MODULE_PATH} ABSOLUTE )
file ( RELATIVE_PATH _REL_PYTHON_MOULE_PATH ${CMAKE_INSTALL_PREFIX} ${_ABS_PYTHON_MODULE_PATH} )
# set ( PYTHON_MODULE_PATH
# ${_REL_PYTHON_MODULE_PATH}
# )
set ( PYTHON_MODULE_PATH
${_ABS_PYTHON_MODULE_PATH}
)
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
# set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
add_custom_target ( py2yap ALL
COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
DEPENDS ../yap.i YAPPython )
# add_custom_target ( py2yap ALL
# COMMAND ${PYTHON_EXECUTABLE} setup.py bdist
# DEPENDS ../yap.i YAPPython )
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
# INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/_yap.so DESTINATION ${PYTHON_MODULE_PATH} )
# INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/yap.py DESTINATION ${PYTHON_MODULE_PATH} )
# INSTALL ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/yap/yapex.py DESTINATION ${PYTHON_MODULE_PATH} )
# install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} install
# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})")
INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/_yap.so DESTINATION ${PYTHON_MODULE_PATH} )
INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/yap/yap.py DESTINATION ${PYTHON_MODULE_PATH} )
if ( DOCUMENTATION AND DOXYGEN_FOUND )
@@ -81,7 +91,7 @@ if (PYTHONLIBS_FOUND)
endif ()
install(TARGETS ${SWIG_MODULE_Py2YAP_REAL_NAME}
install(TARGETS ${SWIG_MODULE_Py2YAP_REAL_NAME}
LIBRARY DESTINATION ${dlls}
ARCHIVE DESTINATION ${dlls}
)

View File

@@ -7,19 +7,22 @@ if platform.system() == 'Darwin':
my_extra_link_args = ['-Wl,-rpath','-Wl,${dlls}']
else:
my_extra_link_args = []
python_sources = ['yap.i'] # ,'../../CXX/yapi.cpp'] + ${PYTHON_SOURCES}
set objects = split('${OBJECTS}',';')
setup(
name = "yap",
version = "0.1",
ext_modules=[Extension('_yap', ['yap.i'],
ext_modules=[Extension('_yap', python_sources,
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0'),
('_YAP_NOT_INSTALLED_', '1'),
('YAP_PYTHON', '1')],
runtime_library_dirs=['${dlls}'],
swig_opts=['-modern','-outcurrentdir', '-c++', '-py3','-I${CMAKE_SOURCE_DIR}/CXX'],
library_dirs=['../../..','../../../CXX',
'../../python',
library_dirs=['../../.o.',
'.'],
extra_link_args=my_extra_link_args,
libraries=['Yap++','Yap','YAPPython'],

View File

@@ -1,67 +1,52 @@
/* example.i */
%module(directors = "1") yap
// Language independent exception handler
%include exception.i
%include stdint.i
%ignore *::operator[];
class YAPPredicate;
class YAPEngine;
%{
/* Put header files here or function declarations like below */
#define arity_t uintptr_t
#define YAP_CPP_INTERFACE 1
#include "yapi.hh"
extern "C" {
#if THREADS
#define Yap_regp regcache
#endif
// we cannot consult YapInterface.h, that conflicts with what we
// declare, though
// it shouldn't
}
%}
#ifdef SWIGPYTHON
%typemap(typecheck) Term* {
$1 = PySequence_Check($input);
}
//include python/python.i
// Map a Python sequence into any sized C double array
%typemap(in) Term* {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_TypeError,"Expecting a sequence");
$1 = nullptr;
} else {
int sz = PyObject_Length($input);
std::vector<Term> v(sz);
for (i =0; i < sz; i++) {
PyObject *o = PySequence_GetItem($input,i);
v[i] = Term(pythonToYAP(o));
Py_DECREF(o);
}
$1 = &v[0];
}
}
%typemap(typecheck) YPTerm {
$1 = true;
}
%inline %{
YAPTerm T(PyObject *input ) { return *new YAPTerm( pythonToYAP(input) ); }
%}
%typemap(in) YAPTerm { $1 = *new YAPTerm( pythonToYAP($input) ); }
%typemap(in) Term { $1 = pythonToYAP($input); }
%typemap(out) YAPTerm { return $result = yap_to_python($1.term(), false);}
%typemap(out) Term { return $result = yap_to_python($1, false);}
%extend(out) Term{Term & __getitem__(size_t i){Term t0 = $self;
if (IsApplTerm(t0)) {
Functor f = FunctorOfTerm(t0);
if (!IsExtensionFunctor(f))
return (ArgOfTerm(i + 1, t0);
} else if (IsPairTerm(t0)) {
if (i == 0)
return HeadOfTerm(t0);
else if (i == 1)
return TailOfTerm(t0);
}
}
}
// Language independent exception handler
@@ -291,26 +276,6 @@ LOCAL_Error_TYPE = YAP_NO_ERROR;
#endif
%{
/* Put header files here or function declarations like below */
#define YAP_CPP_INTERFACE 1
#include "yapi.hh"
extern "C" {
#if THREADS
#define Yap_regp regcache
#endif
// we cannot consult YapInterface.h, that conflicts with what we
// declare, though
// it shouldn't
}
%}
/* turn on director wrapping Callback */
%feature("director") YAPCallback;