From 31f1c25ee7eb09e065111b6d4baad3cdc06daeb1 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Fri, 16 Jun 2017 11:53:46 +0100 Subject: [PATCH] python --- CXX/yapi.cpp | 6 +- packages/python/#python.pl# | 167 ---------------------------- packages/python/CMakeLists.txt | 13 +-- packages/python/pybips.c | 2 +- packages/python/python.pl | 2 +- packages/python/swig/CMakeLists.txt | 8 +- packages/python/swig/__init__.py | 2 +- packages/python/swig/setup.py.in | 13 ++- 8 files changed, 23 insertions(+), 190 deletions(-) delete mode 100644 packages/python/#python.pl# diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index a78fcfdcc..951a3c832 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -475,7 +475,7 @@ bool YAPEngine::mgoal(Term t, Term tmod) BACKUP_MACHINE_REGS(); Term *ts = nullptr; PredEntry *ap = Yap_get_pred(t, tmod, "C++"); - + if (ap == nullptr || ap->OpcodeOfPred == UNDEF_OPCODE) { ap = rewriteUndefEngineQuery(ap, t, tmod); @@ -517,7 +517,6 @@ bool YAPEngine::mgoal(Term t, Term tmod) __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); result = (bool)YAP_EnterGoal(ap, nullptr, &q); - // fprintf(stderr,"in");Yap_DebugPlWrite(t); { YAP_LeaveGoal(false, &q); RECOVER_MACHINE_REGS(); @@ -625,6 +624,7 @@ Term YAPEngine::fun(Term t) YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[]) : YAPPredicate(f, mod) { + /* ignore flags for now */ BACKUP_MACHINE_REGS(); Term *nts; @@ -1110,7 +1110,7 @@ YAPEngine::YAPEngine(int argc, char *argv[], s += "\n"; } } - printf("%s\n", s.c_str()); + // printf("%s\n", s.c_str()); return s.c_str(); } diff --git a/packages/python/#python.pl# b/packages/python/#python.pl# deleted file mode 100644 index c732c30de..000000000 --- a/packages/python/#python.pl# +++ /dev/null @@ -1,167 +0,0 @@ -% % % -*-Mode : Prolog; -*- -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Author: Vitor Santos Costa -% E-mail: vsc@dcc.fc.up.pt -% Copyright (C): Universidade do Porto -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% This file is part of the YAP Python Interface -% distributed according to Perl Artistic License -% check LICENSE file for distribution license -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% - -:- module(python, - [ - init_python/0, - end_python/0, - python_command/1, - python_run_file/1, - python_run_command/1, - python_run_script/2, - python_assign/3, - python_import/1, - array_to_python_list/4, - array_to_python_tuple/4, - array_to_python_view/5, - python/2, - acquire_GIL/0, - release_GIL/0, - python_threaded/0, - (:=)/2, - (:=)/1, - % (<-)/2, - % (<-)/1, - op(100,fy,$), - op(950,fy,:=), - op(950,yfx,:=), - op(950,fx,<-), - op(950,yfx,<-), - op(50, yf, []), - op(50, yf, '()'), - op(100, xfy, '.'), - op(100, fy, '.') - ]). - - -/** python - - A C-based Prolog interface to python. - - @author Vitor Santos Costa - @version 0:0:5, 2012/10/8 - @license Perl Artistic License - -This is an interface to allow calling Python from Prolog. Please look -at the SWIG package if you want to embedd Prolog with Python. - -The interface should be activated by consulting the python lybrary. It -immediately boots a Python image. - -To best define the interface, one has to address two opposite goals: - - make it as similar to python as possible - - make all embedded language interfaces (python, R, Java) as -similar as possible. - - YAP supports the following translation between Prolog and Python: - -| *Prolog* | *Pyhon* | *Prolog Examples* | -|:-------------:|:-------------:|---------------------------------------:| -| Numbers | Numbers | 2.3 -| | | 1545 -| | | -| Atom | Symbols | var -| $Atom | | $var [ = var] -| `string` | 'string' | \`hello\` -| "string" | ' | "hello" -| | | -| Atom(...) | Symb(...) | f( a, b, named=v) -| E.F(...) | E.F (...) | mod.f( a) [ = [mod\|f(a)] ] -| Atom() | | f() [ = '()'(f) ] -| Lists | Lists | [1,2,3] -| t(....) | Tuples | t(1,2,3) to (1,2,3) -| (..., ...) | | (1,2,3)[ = (1,(2,3))] -| {.=., .=.} | Dict | {\`one\`: 1, \`two\`: 2, \`three\`: 3} - -*/ - - - -/************************************************************************************************************ - - -Python interface - -Data types are - - Python Prolog - string atoms - numbers numbers - lists lists - tuples t(...) - generic objs __pointer__(Address) - - $var refers to the attribute __main__.var - -*************************************************************************************************************/ - - -:- use_module(library(shlib)). -:- use_module(library(lists)). -:- use_module(library(apply_macros)). -:- use_module(library(charsio)). -:- dynamic python_mref_cache/2, python_obj_cache/2. - -:= (P1,P2) :- !, - := P1, - := P2. -:= import( F ) :- !, python_import(F). -:= F :- python_is(F,_). - -V <- F :- - V := F. - -( V := F ) :- - python_assign(V, F). - -((<- F)) :- - := F. - -python_import(Module) :- - python_import(Module, _). - - -python(Exp, Out) :- - Out := Exp. - -python_assign(V, New) :- var(V), !, - python_is( New, V). -python_assign(T, F) :- atom(T), !, - python_assign_symbol(T, F). -python_assign(T.I, F) :- !, - python_assign_field(T, I, F). -python_assign(T[I], F) :- !, - python_assign_item(T, I, F). -python_assign(F, Tuple) :- - python_assign_tuple(F, Tuple). - -python_command(Cmd) :- - python_run_command(Cmd). - - -start_python :- - python_import('inspect', _), - at_halt(end_python). - -add_cwd_to_python :- - unix(getcwd(Dir)), - atom_concat(['sys.path.append(\"',Dir,'\")'], Command), - python_command(Command), - python_command("sys.argv = [\"yap\"]"). - % done - -:- initialization( load_foreign_files([libYAPPython], [], init_python), now ). - -:- initialization( load_foreign_library(foreign(libYAPPython), init_python), now ). diff --git a/packages/python/CMakeLists.txt b/packages/python/CMakeLists.txt index 265aa38b1..752d78c0c 100644 --- a/packages/python/CMakeLists.txt +++ b/packages/python/CMakeLists.txt @@ -9,12 +9,13 @@ set (CMAKE_POSITION_INDEPENDENT_CODE TRUE) include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ) +add_library (YAPPython SHARED pyload.c ${PYTHON_HEADERS} ) + if (WIN32) add_library (Py4YAP OBJECT ${PYTHON_SOURCES} ${PYTHON_HEADERS}) -add_library (YAPPython SHARED pyload.c ${PYTHON_HEADERS} ) + else() add_library (Py4YAP SHARED ${PYTHON_SOURCES} ${PYTHON_HEADERS}) -add_library (YAPPython SHARED pyload.c ${PYTHON_SOURCES} ${PYTHON_HEADERS}) # arithmetic hassle. set_property(TARGET Py4YAP PROPERTY CXX_STANDARD 11) @@ -36,7 +37,7 @@ set_property(TARGET YAPPython PROPERTY CXX_STANDARD_REQUIRED ON) target_link_libraries(YAPPython libYap ${PYTHON_LIBRARIES}) -set_property( SOURCE ${PYTHON_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 _GNU-SOURCE=1) +set_property( SOURCE ${PYTHON_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 _GNU_SOURCE=1) set (PYTHON_PL python.pl) @@ -44,11 +45,7 @@ install(FILES python.pl DESTINATION ${libpl} ) add_to_group( pl_library PYTHON_PL ) -# configure_file ("setup.py.cmake" "setup.py" ) - -# set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py") - -#set_target_properties (YAPPython PROPERTIES PREFIX "") +set_target_properties (YAPPython PROPERTIES PREFIX "") install(TARGETS YAPPython LIBRARY DESTINATION ${dlls} diff --git a/packages/python/pybips.c b/packages/python/pybips.c index 0cab4508b..690f0ce70 100644 --- a/packages/python/pybips.c +++ b/packages/python/pybips.c @@ -99,7 +99,7 @@ PyObject *find_obj(PyObject *ob, term_t l, bool eval) { yt = YAP_GetFromSlot(l); while (YAP_IsPairTerm(yt)) { hd = YAP_HeadOfTerm(yt); - ob = yap_to_python(hd, eval, ob); + ob = yap_to_python(hd, true, ob); ob = CHECKNULL(yt, ob); if (!ob){ return Py_None; diff --git a/packages/python/python.pl b/packages/python/python.pl index 34d871bb0..792e44279 100644 --- a/packages/python/python.pl +++ b/packages/python/python.pl @@ -151,4 +151,4 @@ add_cwd_to_python :- python_command("sys.argv = [\"yap\"]"). % done -:- initialization( load_foreign_files([libYAPPython], [], init_python_dll), now ). +:- initialization( load_foreign_files(['YAPPython'], [], init_python_dll), now ). diff --git a/packages/python/swig/CMakeLists.txt b/packages/python/swig/CMakeLists.txt index dc3aa6bd2..ba28e9ba2 100644 --- a/packages/python/swig/CMakeLists.txt +++ b/packages/python/swig/CMakeLists.txt @@ -48,11 +48,13 @@ endif() $ $ $ - $ - $ ) if (TARGET real) list(APPEND python_dlls $ + ) + endif() + if (NOT WIN32) + list(APPEND python_dlls $ $ ) endif() @@ -76,7 +78,7 @@ add_custom_target( YAP4PY_SETUP_DIRS ) add_custom_target( YAP4PY ALL - COMMAND ${PYTHON_EXECUTABLE} setup.py sdist bdist_wheel + COMMAND ${SWIG_EXECUTABLE} -python -modern -c++ -py3 -DX_API -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/OPTYap -I../../.. -o yap_wrap.cpp yap.i COMMAND ${PYTHON_EXECUTABLE} setup.py sdist bdist_wheel WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS YAP4PY_SETUP) diff --git a/packages/python/swig/__init__.py b/packages/python/swig/__init__.py index a394860ea..2e6496c74 100644 --- a/packages/python/swig/__init__.py +++ b/packages/python/swig/__init__.py @@ -20,6 +20,6 @@ else: dll = glob.glob(os.path.join(yap_lib_path,dll))[0] dll = os.path.abspath(dll) ctypes.CDLL(dll, mode=ctypes.RTLD_GLOBAL) + load('libYap*') load('libYAP+*') load('libPy4YAP*') - load('libYap*') diff --git a/packages/python/swig/setup.py.in b/packages/python/swig/setup.py.in index 4d46fb5e6..5f1722c28 100644 --- a/packages/python/swig/setup.py.in +++ b/packages/python/swig/setup.py.in @@ -52,20 +52,21 @@ here = os.path.abspath(os.path.dirname(__file__)) pkg_root = pjoin(here, name) my_extra_link_args = [] -if platform.system() == 'Darwin': +if platform.system() == 'Windows': + local_libs = [] + win_libs = ['wsock32','ws2_32'] + my_extra_link_args = ['-Wl,-export-all-symbols'] +else: + # if platform.system() == 'Darwin': my_extra_link_args = ['-Wl,-rpath', '-Wl,${_ABS_PYTHON_MODULE_PATH}'] win_libs = [] local_libs = ['YAP++','Py4YAP'] # or dll in glob('yap/dlls/*'): # move( dll ,'lib' ) -elif platform.system() == 'Windows': - local_libs = [] - win_libs = ['wsock32','ws2_32'] - my_extra_link_args = ['-Wl,-export-all-symbols'] cplus = [''] bpy2yap = [] -native_sources = ['yap.i'] +native_sources = ['yap_wrap.cpp'] here = path.abspath(path.dirname(__file__)) # Get the long description from the README file