dynamic loading
This commit is contained in:
@@ -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})
|
||||
|
@@ -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.
|
||||
|
||||
|
@@ -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=[
|
||||
|
@@ -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*')
|
||||
|
@@ -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__()
|
||||
|
Reference in New Issue
Block a user