diff --git a/build.sh b/build.sh index f038301b..1d415760 100644 --- a/build.sh +++ b/build.sh @@ -1,3 +1,3 @@ python3 prebuild.py SRC=$(find src/ -name "*.cpp") -clang++ -std=c++17 -fno-rtti -O2 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl \ No newline at end of file +clang++ -std=c++17 -fno-rtti -O2 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl -rdynamic \ No newline at end of file diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 4296946f..d33aff76 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -2,7 +2,7 @@ namespace pkpy{ -using dylib_entry_t = PyObject*(*)(VM*, const char*); +using dylib_entry_t = const char* (*)(void*, const char*); #if PK_ENABLE_OS @@ -11,7 +11,7 @@ static dylib_entry_t load_dylib(const char* path){ std::error_code ec; auto p = std::filesystem::absolute(path, ec); if(ec) return nullptr; - HMODULE handle = LoadLibraryA((LPCSTR)"test.dll"); + HMODULE handle = LoadLibraryA(p.string().c_str()); // get last error // Get the last error code SetErrorMode(SEM_FAILCRITICALERRORS); @@ -169,7 +169,8 @@ void init_builtins(VM* _vm) { if(!entry){ vm->_error("ImportError", "cannot load dynamic library: " + name.escape()); } - return entry(vm, PK_VERSION); + const char* name = entry(vm, PK_VERSION); + return vm->_modules[name]; } } return vm->py_import(name); diff --git a/src2/main.cpp b/src2/main.cpp index 9d4cbaf4..0b41f76a 100644 --- a/src2/main.cpp +++ b/src2/main.cpp @@ -57,9 +57,9 @@ int main(int argc, char** argv){ #if _WIN32 // implicitly load pocketpy.dll in current directory #elif __linux__ - dlopen("libpocketpy.so", RTLD_LAZY); + dlopen("libpocketpy.so", RTLD_LAZY | RTLD_GLOBAL); #elif __APPLE__ - dlopen("libpocketpy.dylib", RTLD_LAZY); + dlopen("libpocketpy.dylib", RTLD_LAZY | RTLD_GLOBAL); #endif pkpy_vm* vm = pkpy_new_vm(true); diff --git a/src2/pocketpy_c.cpp b/src2/pocketpy_c.cpp new file mode 100644 index 00000000..ed9a4a04 --- /dev/null +++ b/src2/pocketpy_c.cpp @@ -0,0 +1,244 @@ +/* autogenerated code. Do not edit */ + +#include "pocketpy_c.h" + +#ifdef _WIN32 +#pragma warning(disable: 4700) +#endif + +pkpy_vm* pkpy_new_vm(bool enable_os) { + pkpy_vm* returnValue; + return returnValue; +} + +void pkpy_delete_vm(pkpy_vm*) { +} + +bool pkpy_exec(pkpy_vm*, const char* source) { + bool returnValue; + return returnValue; +} + +bool pkpy_exec_2(pkpy_vm*, const char* source, const char* filename, int mode, const char* module) { + bool returnValue; + return returnValue; +} + +bool pkpy_pop(pkpy_vm*, int) { + bool returnValue; + return returnValue; +} + +bool pkpy_pop_top(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +bool pkpy_dup_top(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +bool pkpy_rot_two(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +int pkpy_stack_size(pkpy_vm*) { + int returnValue; + return returnValue; +} + +bool pkpy_push_int(pkpy_vm*, int) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_int(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_to_int(pkpy_vm*, int i, int* out) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_float(pkpy_vm*, float) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_float(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_to_float(pkpy_vm*, int i, float* out) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_bool(pkpy_vm*, bool) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_bool(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_to_bool(pkpy_vm*, int i, bool* out) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_string(pkpy_vm*, pkpy_CString) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_string(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_to_string(pkpy_vm*, int i, pkpy_CString* out) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_voidp(pkpy_vm*, void*) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_voidp(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_to_voidp(pkpy_vm*, int i, void** out) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_none(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +bool pkpy_is_none(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_null(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_function(pkpy_vm*, const char*, pkpy_CFunction) { + bool returnValue; + return returnValue; +} + +bool pkpy_push_module(pkpy_vm*, const char*) { + bool returnValue; + return returnValue; +} + +bool pkpy_getattr(pkpy_vm*, pkpy_CName) { + bool returnValue; + return returnValue; +} + +bool pkpy_setattr(pkpy_vm*, pkpy_CName) { + bool returnValue; + return returnValue; +} + +bool pkpy_getglobal(pkpy_vm*, pkpy_CName) { + bool returnValue; + return returnValue; +} + +bool pkpy_setglobal(pkpy_vm*, pkpy_CName) { + bool returnValue; + return returnValue; +} + +bool pkpy_eval(pkpy_vm*, const char* source) { + bool returnValue; + return returnValue; +} + +bool pkpy_unpack_sequence(pkpy_vm*, int size) { + bool returnValue; + return returnValue; +} + +bool pkpy_get_unbound_method(pkpy_vm*, pkpy_CName) { + bool returnValue; + return returnValue; +} + +bool pkpy_py_repr(pkpy_vm*, int i) { + bool returnValue; + return returnValue; +} + +bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString) { + bool returnValue; + return returnValue; +} + +bool pkpy_check_error(pkpy_vm*) { + bool returnValue; + return returnValue; +} + +bool pkpy_clear_error(pkpy_vm*, char** message) { + bool returnValue; + return returnValue; +} + +bool pkpy_vectorcall(pkpy_vm*, int argc) { + bool returnValue; + return returnValue; +} + +void pkpy_free(void* p) { +} + +pkpy_CString pkpy_string(const char*) { + pkpy_CString returnValue; + return returnValue; +} + +pkpy_CName pkpy_name(const char*) { + pkpy_CName returnValue; + return returnValue; +} + +pkpy_CString pkpy_name_to_string(pkpy_CName) { + pkpy_CString returnValue; + return returnValue; +} + +void pkpy_compile_to_string(pkpy_vm*, const char* source, const char* filename, int mode, bool* ok, char** out) { +} + +void* pkpy_new_repl(pkpy_vm* vm) { + void* returnValue; + return returnValue; +} + +bool pkpy_repl_input(void* r, const char* line) { + bool returnValue; + return returnValue; +} + +void pkpy_delete_repl(void* repl) { +} diff --git a/tests/dylib/CMakeLists.txt b/tests/dylib/CMakeLists.txt index 8e1474f0..0e17bfd2 100644 --- a/tests/dylib/CMakeLists.txt +++ b/tests/dylib/CMakeLists.txt @@ -2,19 +2,12 @@ cmake_minimum_required(VERSION 3.17) project(test) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_C_STANDARD 11) if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR- /EHsc /utf-8 /O2") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fexceptions -O2") - if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - endif() -endif() - -if (MSVC) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:UNRESOLVED") endif() include_directories( @@ -24,5 +17,19 @@ include_directories( add_library( ${PROJECT_NAME} SHARED - test.cpp -) \ No newline at end of file + test.c +) + + +if (WIN32) + add_library( + ${PROJECT_NAME}_stub + SHARED + ${CMAKE_CURRENT_LIST_DIR}/../../src2/pocketpy_c.cpp + ) + + target_link_libraries( + ${PROJECT_NAME} + ${PROJECT_NAME}_stub + ) +endif() \ No newline at end of file diff --git a/tests/dylib/main.py b/tests/dylib/main.py index f1bbb7e6..cd418a0a 100644 --- a/tests/dylib/main.py +++ b/tests/dylib/main.py @@ -1,6 +1,14 @@ import os +import sys +print('platform:', sys.platform) print(os.getcwd()) -test = __import__('build/libtest.so') + +if sys.platform == 'linux': + test = __import__('build/linux/libtest.so') +elif sys.platform == 'win32': + test = __import__('build/win32/test.dll') +else: + raise Exception('Unsupported platform') test.hello() \ No newline at end of file diff --git a/tests/dylib/test.c b/tests/dylib/test.c new file mode 100644 index 00000000..b1206164 --- /dev/null +++ b/tests/dylib/test.c @@ -0,0 +1,24 @@ +#include "pocketpy_c.h" +#include +#include + +static int hello(pkpy_vm* vm){ + printf("Hello from dylib!\n"); + return 0; +} + +PK_EXPORT +const char* platform_module__init__(pkpy_vm* vm, const char* version){ + printf("version: %s\n", version); + pkpy_push_function(vm, "hello()", hello); + pkpy_push_module(vm, "test"); + pkpy_setattr(vm, pkpy_name("hello")); + if(pkpy_check_error(vm)){ + char* err; + pkpy_clear_error(vm, &err); + printf("%s\n", err); + free(err); + exit(1); + } + return "test"; +} \ No newline at end of file diff --git a/tests/dylib/test.cpp b/tests/dylib/test.cpp deleted file mode 100644 index 1bda2734..00000000 --- a/tests/dylib/test.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "pocketpy.h" - -using namespace pkpy; - -extern "C" { - PK_EXPORT - PyObject* platform_module__init__(VM* vm, const char* version){ - PyObject* mod = vm->new_module("test"); - vm->_stdout(vm, "Hello from dylib!\n"); - - vm->bind(mod, "hello()", [](VM* vm, ArgsView args){ - vm->_stdout(vm, "Hello from dylib!\n"); - return vm->None; - }); - return mod; - } -} \ No newline at end of file