dynamic loading

This commit is contained in:
Vitor Santos Costa
2017-11-08 10:29:01 +01:00
parent 9100e797f8
commit 538cb4eb2c
15 changed files with 206 additions and 228 deletions

View File

@@ -1,12 +1,6 @@
# This is a CMake example for Python
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/yap4py)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/yap4py/include)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog/os)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/yap4py/prolog/pl)
INCLUDE(UseSWIG)
include(FindPythonModule)
@@ -16,10 +10,11 @@ set (PYTHON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/yap4py/yapi.py ${CMAKE_CURRENT_S
SET_SOURCE_FILES_PROPERTIES(../../swig/yap.i PROPERTIES CPLUSPLUS ON)
SET_SOURCE_FILES_PROPERTIES(../../swig/yap.i PROPERTIES SWIG_FLAGS "-O;-py3")
SET_SOURCE_FILES_PROPERTIES(../../swiyap.i PROPERTIES SWIG_MODULE_NAME yap)
SET_SOURCE_FILES_PROPERTIES(../../swiyap.i PROPERTIES SWIG_MODULE_NAME yap4py.yap)
#SET_SOURCE_FILES_PROPERTIES(../../swi/yap.i PROPERTIES OUTPUT_NAME yap)
set(YAP4PY_PL prolog/jupyter.yap prolog/yapi.yap)
configure_file("setup.py.in" ${CMAKE_CURRENT_BINARY_DIR}/setup.py)
configure_file("MANIFEST.in" ${CMAKE_CURRENT_BINARY_DIR}/MANIFEST.in)
@@ -32,21 +27,6 @@ INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/yap4py/i
SWIG_ADD_LIBRARY(Py2YAP LANGUAGE python SHARED SOURCES ../../swig/yap.i )
if (WIN32)
SWIG_LINK_LIBRARIES(Py2YAP YAPPython libYap ${PYTHON_LIBRARIES} )
else()
SWIG_LINK_LIBRARIES( Py2YAP libYap YAP++ YAPPython ${PYTHON_LIBRARIES} )
endif()
set_target_properties ( ${SWIG_MODULE_Py2YAP_REAL_NAME}
PROPERTIES
NO_SONAME ON
OUTPUT_NAME yap
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS YAPPython
)
SET(SWIG_SOURCES
${CMAKE_SOURCE_DIR}/packages/swig/yap.i
@@ -64,41 +44,6 @@ else()
add_custom_command( OUTPUT yap.i
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/packages/swig/yap.i .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/packages/swig/yap.i )
add_custom_command( OUTPUT yapi.cpp
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp )
add_custom_command( OUTPUT yap4py/prolog/lists.yap
COMMAND ${CMAKE_COMMAND} -E copy ${pl_library} yap4py/prolog
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${pl_library} )
add_custom_command( OUTPUT yap4py/prolog/os/yio.yap
COMMAND ${CMAKE_COMMAND} -E copy ${pl_os_library} yap4py/prolog/os
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${pl_os_library} )
add_custom_command( OUTPUT yap4py/prolog/pl/boot.yap
COMMAND ${CMAKE_COMMAND} -E copy ${pl_boot_library} yap4py/prolog/pl
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${pl_boot_library} )
add_custom_command( OUTPUT yap4py/include/YapInterface.h
COMMAND ${CMAKE_COMMAND} -E copy ${c_headers} yap4py/include
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${c_headers} )
add_custom_command( OUTPUT yap4py/include/yapi.hh
COMMAND ${CMAKE_COMMAND} -E copy ${cxx_headers} yap4py/include
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${cxx_headers} )
if (CONDA)
set(bdist bdist_conda)
else()
@@ -107,32 +52,25 @@ endif()
add_custom_target( YAP4PY ALL
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/startup.yss ${CMAKE_CURRENT_BINARY_DIR}/yap4py
COMMAND ${CMAKE_COMMAND} -E copy ${CONFIGURATION_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/yap4py/include
COMMAND ${SWIG_EXECUTABLE} -c++ -python -O -py3 -module "yap" -outcurrentdir -addextern -Iyap4py/include -outdir ${CMAKE_CURRENT_BINARY_DIR} -I${GMP_INCLUDE_DIRS} -DX_API="" -o yapPyTHON_wrap.cxx ${SWIG_SOURCES}
COMMAND ${CMAKE_COMMAND} -E remove_directory yap4py
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/yap4py yap4py
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/CXX/yapi.cpp yap4py
COMMAND ${SWIG_EXECUTABLE} -c++ -python -O -py3 -module "yap" -addextern -I${CMAKE_SOURCE_DIR}/H -I${CMAKE_SOURCE_DIR}/H/generated -I${CMAKE_SOURCE_DIR}/include -I${CMAKE_SOURCE_DIR}/OPTYap -I${CMAKE_SOURCE_DIR}/os -I${CMAKE_SOURCE_DIR}/utf8proc -I.././.. -I${CMAKE_SOURCE_DIR}/CXX -I${CMAKE_SOURCE_DIR}/packages/python -outdir ${CMAKE_CURRENT_BINARY_DIR}/yap4py -I${GMP_INCLUDE_DIRS} -DX_API="" -o yap4py/yap_wrap.cxx -oh yap4py/yap_wrap.hh ${SWIG_SOURCES}
COMMAND ${PYTHON_EXECUTABLE} setup.py sdist ${bdist}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${YAP_DLLS} STARTUP yap4py/prolog/pl/boot.yap yapi.cpp yap4py/include/yapi.hh yap4py/include/YapInterface.h yap4py/prolog/os/yio.yap yap4py/prolog/lists.yap yap.i
)
DEPENDS ${SWIG_SOURCES} Py4YAP YAP++
)
function(f_copy filename output )
get_filename_component(base ${filename} NAME_WE)
set(outfile ${output}/${base})
file (COPY ${filename} DESTiNATION ${output})
add_custom_command(
OUTPUT ${outfile}
COMMAND ${CMAKE_COMMAND} -E COPY ${filename} ${outfile}
DEPENDS ${filename}
)
set_source_files_properties(${outfile} PROPERTIES GENERATED TRUE)
endfunction()
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pip install .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})"
install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pip install --ignore-installed .
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})"
DEPENDS Py4YAP ${CMAKE_BINARY_DIR}/${YAP_STARTUP} ${dlls} )
install(FILES ${YAP4PY_PL} DESTINATION ${libpl} )
add_to_group( YAP4PY_PL pl_library )
if (WITH_DOCS AND DOXYGEN_FOUND)
set(CMAKE_SWIG_FLAGS -DDOXYGEN=${DOXYGEN_FOUND})

View File

@@ -23,6 +23,8 @@
:- python_import(yap4py.yapi).
%:- start_low_level_trace.
%% @pred yapi_query( + VarList, - Dictionary)
%%
%% dictionary, Examples
@@ -32,18 +34,25 @@
show_answer(VarNames, Dict),
Self.bindings := Dict.
:- initialization set_preds.
%:- initialization set_preds.
set_preds :-
current_predicate(P, Q),
functor(Q,P,A),
atom_string(P,S),
:= yap4py.yapi.named( S, A),
catch(
:= yap4py.yapi.named( S, A),
_,
fail),
fail.
set_preds :-
system_predicate(P/A),
atom_string(P,S),
:= yap4py.yapi.named( S, A),
catch(
:= yap4py.yapi.named( S, A),
_,
fail),
fail.
set_preds.

View File

@@ -61,17 +61,17 @@ sys.path.insert(0, "${CMAKE_CURRENT_SOURCE_DIR}")
if platform.system() == 'Windows':
local_libs = []
win_libs = ['wsock32','ws2_32']
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,@loader_path/../../..']
my_extra_link_args = ['-Wl,-rpath','-Wl,@loader_path']
win_libs = []
local_libs = ['Py4YAP']
# or dll in glob('yap/dlls/*'):
# move( dll ,'lib' )
native_sources = ["yapPYTHON_wrap.cxx",'yapi.cpp']
native_sources = ["yap4py/yap_wrap.cxx","yap4py/yapi.cpp"]
#gmp_dir = path.abspath(path.dirname("${GMP_LIBRARIES}"))
#python_libdir = path.abspath(path.dirname("${PYTHON_LIBRARIES}")
@@ -79,7 +79,7 @@ native_sources = ["yapPYTHON_wrap.cxx",'yapi.cpp']
extensions = [Extension('_yap', native_sources,
extensions = [Extension('yap4py._yap', native_sources,
define_macros=[('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0'),
('_YAP_NOT_INSTALLED_', '1'),
@@ -91,20 +91,24 @@ extensions = [Extension('_yap', native_sources,
'-DX_API', '-Iyap4py/include' ],
library_dirs=[".",'../../..'],
extra_link_args=my_extra_link_args,
libraries=['Yap','Py4YAP','gmp']+win_libs+local_libs,
include_dirs=['yap4py/include']
libraries=['Yap','gmp']+win_libs+local_libs,
include_dirs=['${CMAKE_SOURCE_DIR}/H',
'${CMAKE_SOURCE_DIR}/H/generated',
'${CMAKE_SOURCE_DIR}/include',
'${CMAKE_SOURCE_DIR}/OPTYap',
'${CMAKE_SOURCE_DIR}/os',
'${CMAKE_SOURCE_DIR}/utf8proc',
'${CMAKE_SOURCE_DIR}/packages/python',
'../../..',
'${CMAKE_SOURCE_DIR}/CXX' ]
)]
packages = setuptools.find_packages('${CMAKE_CURRENT_SOURCE_DIR}')
package_data = {
'yap4py/prolog': 'prolog/*.*',
'': '*.*'
#'': '*.*'
}
data_files=[('../..', glob('lib*.*'))]
data_files=[]
version_ns = {'__version__': '6.3.5', 'minor-version': '6', 'minor-version': '3', 'patch': '5'}
@@ -112,10 +116,10 @@ setup_args = dict(
name=name,
version=version_ns['__version__'],
scripts=glob(join('scripts', '*')),
packages=packages,
packages=['yap4py'],
ext_modules=extensions,
py_modules=['yap','yap4py.yapi'],
package_data=package_data,
py_modules=[],
# package_data=package_data,
include_package_data=True,
data_files = data_files,
# requirements=[

View File

@@ -6,8 +6,8 @@ import os.path
import platform
import sys
global yap_lib_path
yap_lib_path = os.path.dirname(__file__)
# global yap_lib_path
#yap_lib_path = os.path.dirname(__file__)
if platform.system() == 'Windows':
def load( dll ):
@@ -15,10 +15,10 @@ if platform.system() == 'Windows':
dll = os.path.abspath(dll)
ctypes.WinDLL(dll)
load('libYap*')
else:
def load( dll ):
dll = glob.glob(os.path.join(yap_lib_path,dll))[0]
dll = os.path.abspath(dll)
ctypes.CDLL(dll, mode=ctypes.RTLD_GLOBAL)
# else:
# def load( dll ):
# 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('libPy4YAP*')

View File

@@ -6,18 +6,20 @@ import keyword
# import pdb
from collections import namedtuple
from yap import *
from .yap import *
class Engine( YAPEngine ):
def __init__(self, args=None,**kwargs):
# type: (object) -> object
self.contained = False
if not args:
args = EngineArgs(**kwargs)
yap_lib_path = os.path.dirname(__file__)
args.setYapShareDir(os.path.join(yap_lib_path,"prolog"))
args.setYapLibDir(yap_lib_path)
args.setSavedState(os.path.join(yap_lib_path,"startup.yss"))
if self.contained:
yap_lib_path = os.path.dirname(__file__)
args.setYapShareDir(os.path.join(yap_lib_path,"prolog"))
args.setYapLibDir(yap_lib_path)
args.setSavedState(os.path.join(yap_lib_path,"startup.yss"))
YAPEngine.__init__(self,args)
self.goal( set_prolog_flag('verbose', 'silent' ) )
self.goal( use_module(library('yapi') ) )
@@ -84,19 +86,10 @@ class PrologTableIter:
self.q = None
raise StopIteration()
f2p = []
f2p = {"fails":{}}
for i in range(16):
f2p += [{}]
f2p[i] ={}
def named( name, arity):
if arity > 0 and name.isidentifier() and not keyword.iskeyword(name):
s = []
for i in range(arity):
s += ["A" + str(i)]
f2p[arity][name] = namedtuple(name, s)
class PrologPredicate( YAPPrologPredicate ):
""" Interface to Prolog Predicate"""
@@ -115,6 +108,20 @@ yapi_query = namedtuple( 'yapi_query', 'vars dict')
show_answer = namedtuple( 'show_answer', 'vars dict')
set_prolog_flag = namedtuple('set_prolog_flag', 'flag new_value')
def named( name, arity):
try:
if arity > 0 and name.isidentifier() and not keyword.iskeyword(name):
s = []
for i in range(arity):
s += ["A" + str(i)]
f2p[arity][name] = namedtuple(name, s)
except:
f2p[fails][name] = True
class PrologPredicate( YAPPrologPredicate ):
""" Interface to Prolog Predicate"""
class v(YAPVarTerm):
def __init__(self):
super().__init__()