Skip to content

Commit 170ee7d

Browse files
committed
Divorce C++ from Rust Python bindings.
Signed-off-by: Timothy Bess <[email protected]>
1 parent 559623b commit 170ee7d

File tree

50 files changed

+962
-511
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+962
-511
lines changed

.github/actions/install-deps/action.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,10 @@ runs:
199199

200200
- name: manylinux deps
201201
shell: bash
202-
run: dnf install wget -y
202+
run: |
203+
if [ -x "$(command -v dnf)" ]; then
204+
dnf install wget -y
205+
fi
203206
if: ${{ runner.os == 'Linux' && inputs.cpp == 'true' && inputs.javascript == 'false' }}
204207

205208
# TODO do this earlier?

.github/workflows/build.yaml

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,18 +190,82 @@ jobs:
190190

191191
- name: Python Build
192192
run: pnpm run build
193+
if: ${{ !contains(matrix.os, 'windows') }}
193194
env:
195+
PACKAGE: "perspective-python"
196+
PSP_ARCH: ${{ matrix.arch }}
197+
PSP_ROOT_DIR: ${{ github.workspace }}
198+
PSP_BUILD_WHEEL: 1
199+
200+
- name: Python Build (Windows)
201+
run: |
202+
New-Item -ItemType Directory -Path $env:CARGO_TARGET_DIR -Force
203+
pnpm run build
204+
if: ${{ contains(matrix.os, 'windows') }}
205+
env:
206+
CARGO_TARGET_DIR: D:\psp-rust
207+
PSP_ROOT_DIR: ${{ github.workspace }}
194208
VCPKG_ROOT: ${{ steps.init-step.outputs.VCPKG_INSTALLATION_ROOT }}
195209
PACKAGE: "perspective-python"
196-
# PSP_USE_CCACHE: 1
197210
PSP_ARCH: ${{ matrix.arch }}
198211
PSP_BUILD_WHEEL: 1
199212

213+
# Windows sucks lol
214+
- uses: actions/upload-artifact@v4
215+
if: ${{ runner.os == 'Windows' }}
216+
with:
217+
name: perspective-python-dist-${{ matrix.arch}}-${{ matrix.os }}-${{ matrix.python-version }}
218+
path: D:\psp-rust\wheels\*.whl
219+
200220
- uses: actions/upload-artifact@v4
221+
# if: ${{ runner.os != 'Windows' }}
201222
with:
202223
name: perspective-python-dist-${{ matrix.arch}}-${{ matrix.os }}-${{ matrix.python-version }}
203224
path: rust/target/wheels/*.whl
204225

226+
build_emscripten_wheel:
227+
runs-on: ${{ matrix.os }}
228+
strategy:
229+
fail-fast: false
230+
matrix:
231+
os:
232+
- ubuntu-22.04
233+
arch:
234+
- x86_64
235+
python-version:
236+
- 3.9
237+
node-version: [20.x]
238+
steps:
239+
- name: Checkout
240+
uses: actions/checkout@v4
241+
242+
- name: Config
243+
id: config-step
244+
uses: ./.github/actions/config
245+
246+
- name: Initialize Build
247+
id: init-step
248+
uses: ./.github/actions/install-deps
249+
with:
250+
javascript: "false"
251+
arch: ${{ matrix.arch }}
252+
manylinux: ${{ matrix.container && 'true' || 'false' }}
253+
skip_cache: ${{ steps.config-step.outputs.SKIP_CACHE }}
254+
255+
- name: Python Build Pyodide
256+
run: pnpm install && pnpm run build
257+
if: ${{ runner.os == 'Linux' && matrix.arch == 'x86_64' }}
258+
env:
259+
PSP_PYODIDE: 1
260+
PACKAGE: "perspective-python"
261+
CI: 1
262+
263+
- uses: actions/upload-artifact@v4
264+
# if: ${{ runner.os != 'Windows' }}
265+
with:
266+
name: perspective-python-dist-wasm32-emscripten-${{ matrix.python-version }}
267+
path: rust/target/wheels/*.whl
268+
205269
# ,-,---. . . . ,--,--' .
206270
# '|___/ . . . | ,-| ,-. ,-. ,-| `- | ,-. ,-. |-
207271
# ,| \ | | | | | | ,-| | | | | , | |-' `-. |

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ rust/perspective/src/ts/ts-rs
238238
rust/perspective-viewer/src/ts/ts-rs
239239
rust/perspective-js/build
240240
rust/perspective-js/src/ts/ts-rs
241+
rust/perspective-python/cpp
242+
rust/perspective-python/cmake
241243
rust/perspective-server/cpp
242244
rust/perspective-server/cmake
243245
rust/perspective-js/docs

Cargo.lock

Lines changed: 13 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ members = [
2323
"rust/perspective-js",
2424
"rust/perspective-python",
2525
"rust/perspective-server",
26-
"examples/rust-axum",
26+
"examples/rust-axum",
2727
]
2828

2929
[profile.dev]

cpp/perspective/CMakeLists.txt

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ elseif(PSP_PYTHON_BUILD)
131131
if(NOT DEFINED PSP_PYTHON_VERSION)
132132
set(PSP_PYTHON_VERSION 3.10)
133133
endif()
134-
if($ENV{PYODIDE})
134+
if(PSP_WASM_BUILD)
135135
set(PSP_PYODIDE 1)
136136
else()
137137
set(PSP_PYODIDE 0)
@@ -223,14 +223,6 @@ if(NOT DEFINED PSP_WASM_EXCEPTIONS AND NOT PSP_PYTHON_BUILD)
223223
set(PSP_WASM_EXCEPTIONS ON)
224224
endif()
225225

226-
if(PSP_PYODIDE)
227-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
228-
-s RELOCATABLE=1 \
229-
-s SIDE_MODULE=2 \
230-
")
231-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
232-
endif()
233-
234226
# if(NOT WIN32)
235227
# set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
236228
# set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
@@ -418,6 +410,14 @@ set(CMAKE_CXX_FLAGS " \
418410
-O3 \
419411
")
420412

413+
if(PSP_PYODIDE)
414+
set(RELOCATABLE_FLAGS "-sRELOCATABLE=1 -sSIDE_MODULE=2 -sWASM_BIGINT=1")
415+
416+
string(APPEND CMAKE_EXE_LINKER_FLAGS "${RELOCATABLE_FLAGS}")
417+
string(APPEND CMAKE_C_FLAGS "${RELOCATABLE_FLAGS}")
418+
string(APPEND CMAKE_CXX_FLAGS "${RELOCATABLE_FLAGS}")
419+
endif()
420+
421421

422422
# Build header-only dependencies from external source
423423
psp_build_dep("date" "${PSP_CMAKE_MODULE_PATH}/date.txt.in")
@@ -559,7 +559,7 @@ set(SOURCE_FILES
559559
${PSP_CPP_SRC}/src/cpp/vocab.cpp
560560
${PSP_CPP_SRC}/src/cpp/arrow_csv.cpp
561561
${PSP_CPP_SRC}/src/cpp/server.cpp
562-
${PSP_CPP_SRC}/src/cpp/proto_api.cpp
562+
${PSP_CPP_SRC}/src/cpp/binding_api.cpp
563563
)
564564

565565
set(PYTHON_SOURCE_FILES ${SOURCE_FILES})
@@ -574,27 +574,36 @@ else()
574574
endif()
575575

576576
# Common flags for WASM/JS build and Pyodide
577-
set(PSP_WASM_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
578-
--no-entry \
579-
--closure=1 \
580-
-s NO_FILESYSTEM=1 \
581-
-s ALLOW_MEMORY_GROWTH=1 \
582-
-s MODULARIZE=1 \
583-
-s WASM_BIGINT=1 \
584-
-s INCOMING_MODULE_JS_API=locateFile,psp_heap_size,psp_stack_trace,HEAPU8,HEAPU32,instantiateWasm \
585-
-s TEXTDECODER=2 \
586-
-s STANDALONE_WASM=1 \
587-
-s DYNAMIC_EXECUTION=0 \
588-
-s BINARYEN_EXTRA_PASSES=--one-caller-inline-max-function-size=19306 \
589-
-s EXPORT_NAME=\"load_perspective\" \
590-
-s MAXIMUM_MEMORY=4gb \
591-
-s ERROR_ON_UNDEFINED_SYMBOLS=0 \
592-
-s NODEJS_CATCH_EXIT=0 \
593-
-s NODEJS_CATCH_REJECTION=0 \
594-
-s USE_ES6_IMPORT_META=1 \
595-
-s EXPORT_ES6=1 \
596-
-s EXPORTED_FUNCTIONS=_js_poll,_js_new_server,_js_free,_js_alloc,_js_handle_request,_js_new_session,_js_close_session \
597-
")
577+
if(PSP_PYODIDE)
578+
set(PSP_WASM_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
579+
--no-entry \
580+
-s EXPORTED_FUNCTIONS=_psp_poll,_psp_new_server,_psp_free,_psp_alloc,_psp_handle_request,_psp_new_session,_psp_close_session,_psp_delete_server \
581+
-s SIDE_MODULE=2 \
582+
")
583+
else()
584+
set(PSP_WASM_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} \
585+
--no-entry \
586+
--closure=1 \
587+
-s NO_FILESYSTEM=1 \
588+
-s ALLOW_MEMORY_GROWTH=1 \
589+
-s MODULARIZE=1 \
590+
-s WASM_BIGINT=1 \
591+
-s INCOMING_MODULE_JS_API=locateFile,psp_heap_size,psp_stack_trace,HEAPU8,HEAPU32,instantiateWasm \
592+
-s TEXTDECODER=2 \
593+
-s STANDALONE_WASM=1 \
594+
-s DYNAMIC_EXECUTION=0 \
595+
-s BINARYEN_EXTRA_PASSES=--one-caller-inline-max-function-size=19306 \
596+
-s EXPORT_NAME=\"load_perspective\" \
597+
-s MAXIMUM_MEMORY=4gb \
598+
-s ERROR_ON_UNDEFINED_SYMBOLS=0 \
599+
-s NODEJS_CATCH_EXIT=0 \
600+
-s NODEJS_CATCH_REJECTION=0 \
601+
-s USE_ES6_IMPORT_META=1 \
602+
-s EXPORT_ES6=1 \
603+
-s EXPORTED_FUNCTIONS=_psp_poll,_psp_new_server,_psp_free,_psp_alloc,_psp_handle_request,_psp_new_session,_psp_close_session,_psp_delete_server \
604+
")
605+
endif()
606+
598607
if (PSP_WASM_EXCEPTIONS)
599608
set(PSP_WASM_LINKER_FLAGS "${PSP_WASM_LINKER_FLAGS} -s EXCEPTION_STACK_TRACES=1 ")
600609
endif()
@@ -609,15 +618,15 @@ else()
609618
set(PSP_SANITIZE_FLAGS)
610619
endif()
611620

612-
if(PSP_WASM_BUILD)
621+
if(PSP_WASM_BUILD AND NOT PSP_PYTHON_BUILD)
613622
set(CMAKE_EXE_LINKER_FLAGS "${PSP_WASM_LINKER_FLAGS} --pre-js \"${PSP_CPP_SRC}/env.js\" ")
614623

615624
add_library(psp ${WASM_SOURCE_FILES})
616625
target_compile_definitions(psp PRIVATE PSP_ENABLE_WASM=1)
617626
set_target_properties(psp PROPERTIES COMPILE_FLAGS "")
618627
target_link_libraries(psp PRIVATE arrow re2 protos)
619628

620-
add_executable(perspective_esm src/cpp/emscripten_api.cpp)
629+
add_executable(perspective_esm src/cpp/binding_api.cpp)
621630
target_link_libraries(perspective_esm psp protos)
622631
target_compile_definitions(perspective_esm PRIVATE PSP_ENABLE_WASM=1)
623632
target_link_options(perspective_esm PUBLIC -sENVIRONMENT="web" ${PSP_SANITIZE_FLAGS})
@@ -644,25 +653,25 @@ elseif(PSP_CPP_BUILD OR PSP_PYTHON_BUILD)
644653
set(CMAKE_SHARED_LIBRARY_PREFIX lib)
645654
endif()
646655

647-
if(PSP_PYODIDE)
648-
add_library(psppy SHARED)
649-
set(PSP_PYTHON_DEFS PSP_ENABLE_WASM=1)
650-
target_compile_definitions(psppy PRIVATE ${PSP_PYTHON_DEFS})
651-
include_directories(${PSP_PYTHON_SRC}/include)
652-
target_compile_definitions(psppy PRIVATE PSP_ENABLE_PYTHON=1)
653-
target_compile_options(psppy PRIVATE -fvisibility=hidden)
654-
target_link_libraries(psppy arrow re2)
655-
add_custom_command(TARGET psppy POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:psppy> ${PSP_PYTHON_SRC}/table/)
656-
elseif(PSP_PYTHON_BUILD)
656+
if(PSP_PYTHON_BUILD)
657657
# #######################
658658
# Python extra targets #
659659
# #######################
660-
add_library(psp STATIC ${PYTHON_SOURCE_FILES})
660+
if(PSP_WASM_BUILD)
661+
set(CMAKE_EXECUTABLE_SUFFIX ".wasm")
662+
set(CMAKE_EXE_LINKER_FLAGS "${PSP_WASM_LINKER_FLAGS} --pre-js \"${PSP_CPP_SRC}/env.js\" ")
663+
add_library(psp ${PYTHON_SOURCE_FILES})
664+
add_executable(psppy ${PSP_CPP_SRC}/src/cpp/binding_api.cpp)
665+
target_compile_definitions(psppy PRIVATE PSP_ENABLE_PYTHON=1 PSP_ENABLE_WASM=1)
666+
target_link_libraries(psppy PRIVATE psp protos)
667+
else()
668+
add_library(psp SHARED ${PYTHON_SOURCE_FILES})
669+
target_compile_definitions(psp PRIVATE PSP_ENABLE_PYTHON=1 PSP_PARALLEL_FOR=1)
670+
endif()
661671
# add_library(psppy SHARED ${PYTHON_BINDING_SOURCE_FILES})
662672

663673
include_directories(${PSP_PYTHON_SRC}/include)
664674

665-
target_compile_definitions(psp PRIVATE PSP_ENABLE_PYTHON=1 PSP_PARALLEL_FOR=1)
666675
# target_compile_definitions(psppy PRIVATE PSP_ENABLE_PYTHON=1 PSP_PARALLEL_FOR=1)
667676

668677
if(WIN32)
@@ -678,7 +687,9 @@ elseif(PSP_CPP_BUILD OR PSP_PYTHON_BUILD)
678687

679688
target_compile_options(psp PRIVATE -fvisibility=hidden)
680689
# target_compile_options(psppy PRIVATE -fvisibility=hidden)
690+
elseif(MANYLINUX)
681691
else()
692+
target_compile_options(psp PRIVATE -fvisibility=hidden)
682693
# target_compile_options(psppy PRIVATE -Wdeprecated-declarations)
683694
endif()
684695

0 commit comments

Comments
 (0)