Skip to content

Commit becec97

Browse files
authored
IT-1228: Refactor repo to use isxcore C++ API (#54)
1 parent 999ead9 commit becec97

29 files changed

+11994
-984
lines changed

.github/workflows/main.yml

-61
This file was deleted.

.github/workflows/pypi.yml

-48
This file was deleted.

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# secrets
22
.ideas-github-token
3+
apiTestResults.xml
34

45
# IDE
56
*.sublime-workspace

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "isxcore"]
2+
path = isxcore
3+
url = [email protected]:inscopix/isxcore.git

CMakeLists.txt

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
cmake_minimum_required(VERSION 3.5)
2+
3+
set(ISX_CMAKE_TOOLS_DIR ${CMAKE_CURRENT_LIST_DIR}/isxcore/tools/cmake)
4+
include(${ISX_CMAKE_TOOLS_DIR}/configure.cmake)
5+
include(${ISX_CMAKE_TOOLS_DIR}/core.cmake)
6+
7+
#
8+
# Public API
9+
#
10+
set(TARGET_NAME_PUBLIC_API "isxpublicapi")
11+
set(PUBLIC_API_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}/isxcore/wrapper/src)
12+
set(PUBLIC_API_API_DIR ${CMAKE_CURRENT_LIST_DIR}/isxcore/wrapper/api)
13+
set(PUBLIC_API_SRCS ${PUBLIC_API_SRC_DIR}/isxCoreC.cpp ${PUBLIC_API_SRC_DIR}/isxUtilsC.cpp)
14+
set(PUBLIC_API_HDRS ${PUBLIC_API_SRC_DIR}/isxUtilsC.h)
15+
set(PUBLIC_API_API_HDRS ${PUBLIC_API_API_DIR}/isxCoreC.h)
16+
17+
add_library(${TARGET_NAME_PUBLIC_API} SHARED ${PUBLIC_API_SRCS} ${PUBLIC_API_HDRS} ${PUBLIC_API_API_HDRS})
18+
19+
target_include_directories(${TARGET_NAME_PUBLIC_API} PUBLIC ${PUBLIC_API_API_DIR})
20+
target_include_directories(${TARGET_NAME_PUBLIC_API} PRIVATE
21+
${CORE_API_DIR}
22+
${OPENCV_HEADER_SEARCH_PATHS}
23+
${JSON_HEADER_SEARCH_PATHS})
24+
25+
set(API_DEST_DIR ${CMAKE_BINARY_DIR}/../bin)
26+
set(PYTHON_API_SRC_DIR ${CMAKE_CURRENT_LIST_DIR})
27+
set(APP_LIB_DIR ${API_DEST_DIR}/isx/lib)
28+
29+
if (${ISX_OS_MACOS})
30+
set(QT_CORE_SHARED_LIB_FILES ${QT_DIR}/lib/QtCore.framework/Versions/5/QtCore)
31+
installFiles(${TARGET_NAME_PUBLIC_API} ${APP_LIB_DIR}/QtCore.framework/Versions/5 "${QT_CORE_SHARED_LIB_FILES}")
32+
elseif (${ISX_OS_LINUX})
33+
set(QT_CORE_SHARED_LIB_FILES
34+
${QT_DIR}/lib/libQt5Core.so.5
35+
${QT_DIR}/lib/libicui18n.so.56
36+
${QT_DIR}/lib/libicuuc.so.56
37+
${QT_DIR}/lib/libicudata.so.56
38+
)
39+
installFiles(${TARGET_NAME_PUBLIC_API} ${APP_LIB_DIR} "${QT_CORE_SHARED_LIB_FILES}")
40+
elseif (${ISX_OS_WIN32})
41+
set(QT_CORE_SHARED_LIB_FILES
42+
${QT_DIR}/bin/Qt5Core.dll
43+
)
44+
installFiles(${TARGET_NAME_PUBLIC_API} ${APP_LIB_DIR} "${QT_CORE_SHARED_LIB_FILES}")
45+
endif()
46+
47+
installFfmpegSharedLibs(${TARGET_NAME_PUBLIC_API} ${APP_LIB_DIR})
48+
49+
set_target_properties(${TARGET_NAME_PUBLIC_API} PROPERTIES
50+
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${APP_LIB_DIR}
51+
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${APP_LIB_DIR}
52+
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${APP_LIB_DIR}
53+
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${APP_LIB_DIR}
54+
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${APP_LIB_DIR}
55+
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${APP_LIB_DIR}
56+
)
57+
setCommonCxxOptionsForTarget(${TARGET_NAME_PUBLIC_API})
58+
setOsDefinesForTarget(${TARGET_NAME_PUBLIC_API})
59+
disableVisualStudioWarnings(${TARGET_NAME_PUBLIC_API})
60+
61+
# OS-specific properties for shared lib
62+
# mac: change output lib name to *.so (default *.dylib)
63+
# mac & linux: set rpath
64+
if(${ISX_OS_MACOS})
65+
string(APPEND SO_NAME_PUBLIC_API ${TARGET_NAME_PUBLIC_API} ".so")
66+
67+
set_target_properties(${TARGET_NAME_PUBLIC_API} PROPERTIES
68+
PREFIX "lib"
69+
OUTPUT_NAME ${SO_NAME_PUBLIC_API}
70+
SUFFIX ""
71+
#SOVERSION "1.0.0.0"
72+
BUILD_WITH_INSTALL_RPATH TRUE
73+
INSTALL_RPATH "@loader_path"
74+
)
75+
elseif(${ISX_OS_LINUX})
76+
set_target_properties(${TARGET_NAME_PUBLIC_API} PROPERTIES
77+
BUILD_WITH_INSTALL_RPATH TRUE
78+
INSTALL_RPATH "$ORIGIN/"
79+
# Interposition of symbols from static libraries in MATLAB was causing
80+
# major problems, so we only export a few select symbols now.
81+
# We may want to do the same for macOS, which also exposes these
82+
# symbols (but hasn't caused a problem yet).
83+
LINK_FLAGS "-Wl,--version-script=${PUBLIC_API_API_DIR}/export_map"
84+
)
85+
endif()
86+
87+
target_link_libraries(${TARGET_NAME_PUBLIC_API} PRIVATE
88+
${TARGET_NAME_CORE}
89+
${QT_CORE_LINK_LIBRARIES}
90+
)
91+
92+
# Deploy Python files
93+
set(PYTHON_API_DEST_DIR ${API_DEST_DIR}/isx)
94+
file(COPY ${PYTHON_API_SRC_DIR}/isx/ DESTINATION ${PYTHON_API_DEST_DIR})
95+
file(COPY ${PYTHON_API_SRC_DIR}/setup.py DESTINATION ${API_DEST_DIR})
96+
file(COPY ${PYTHON_API_SRC_DIR}/MANIFEST.in DESTINATION ${API_DEST_DIR})
97+
file(COPY ${PYTHON_API_SRC_DIR}/README.md DESTINATION ${API_DEST_DIR})
98+
file(COPY ${PYTHON_API_SRC_DIR}/LICENSE.txt DESTINATION ${API_DEST_DIR})
99+
file(COPY ${PYTHON_API_SRC_DIR}/isx/test DESTINATION ${API_DEST_DIR}/../)

MANIFEST.in

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
recursive-include isx/lib *
2+
include README.md
3+
include LICENSE.txt

Makefile

+100-30
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,113 @@
1-
repo=$(shell basename $(CURDIR))
1+
.PHONY: build test
22

3-
.PHONY: test coverage-report jupyter
3+
BUILD_DIR_ROOT=build
4+
BUILD_DIR_MODULES=modules
5+
BUILD_TYPE=Release
6+
BUILD_DIR_CMAKE=cmake
7+
BUILD_DIR_BIN=bin
8+
BUILD_PATH=$(BUILD_DIR_ROOT)/$(BUILD_TYPE)/$(BUILD_DIR_CMAKE)
9+
BUILD_PATH_BIN=$(BUILD_DIR_ROOT)/$(BUILD_TYPE)/$(BUILD_DIR_BIN)
410

5-
jupyter:
6-
@echo "Installing kernel $(repo) in jupyter"
7-
-yes | jupyter kernelspec uninstall $(repo)
8-
poetry run python -m ipykernel install --user --name $(repo)
11+
API_TEST_RESULTS_PATH=$(PWD)/apiTestResults.xml
12+
PYTHON_TEST_DIR=$(BUILD_DIR_ROOT)/$(BUILD_TYPE)/bin/isx
913

14+
ifndef TEST_DATA_DIR
15+
TEST_DATA_DIR=test_data
16+
endif
1017

11-
install-poetry:
12-
@bash install-poetry.sh
18+
ifndef THIRD_PARTY_DIR
19+
THIRD_PARTY_DIR=third_party
20+
endif
1321

14-
install: install-poetry
15-
@echo "Installing py_isx..."
16-
poetry check --lock || poetry lock
17-
poetry install --verbose
22+
PYTHON_VERSION=$(shell python -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')
1823

19-
install-test: install-poetry
20-
@echo "Installing py_isx & dependencies for testing..."
21-
poetry check --lock || poetry lock
22-
poetry install --extras "test" --verbose
24+
ifeq ($(OS), Windows_NT)
25+
DETECTED_OS = windows
26+
else
27+
UNAME_S = $(shell uname -s)
28+
ifeq ($(UNAME_S), Linux)
29+
DETECTED_OS = linux
30+
else ifeq ($(UNAME_S), Darwin)
31+
DETECTED_OS = mac
32+
33+
ifeq ($(PYTHON_VERSION), 3.9)
34+
_MACOSX_DEPLOYMENT_TARGET=10.11
35+
else ifeq ($(PYTHON_VERSION), 3.10)
36+
_MACOSX_DEPLOYMENT_TARGET=10.11
37+
else ifeq ($(PYTHON_VERSION), 3.11)
38+
_MACOSX_DEPLOYMENT_TARGET=10.11
39+
else ifeq ($(PYTHON_VERSION), 3.12)
40+
_MACOSX_DEPLOYMENT_TARGET=10.15
41+
endif
42+
endif
43+
endif
2344

24-
test: install-test
25-
poetry run pytest -sx --failed-first
45+
VERSION_MAJOR=2
46+
VERSION_MINOR=0
47+
VERSION_PATCH=0
48+
VERSION_BUILD=0
49+
IS_BETA=1
50+
WITH_CUDA=0
51+
ASYNC_API=1
52+
WITH_ALGOS=0
2653

27-
test-pip:
28-
@echo "Testing code installed on base env using pip..."
29-
pytest -s
54+
CMAKE_OPTIONS=\
55+
-DCMAKE_BUILD_TYPE=$(BUILD_TYPE)\
56+
-DISX_VERSION_MAJOR=${VERSION_MAJOR}\
57+
-DISX_VERSION_MINOR=${VERSION_MINOR}\
58+
-DISX_VERSION_PATCH=${VERSION_PATCH}\
59+
-DISX_VERSION_BUILD=${VERSION_BUILD}\
60+
-DISX_IS_BETA=${IS_BETA}\
61+
-DISX_WITH_CUDA=${WITH_CUDA}\
62+
-DISX_ASYNC_API=${ASYNC_API} \
63+
-DISX_WITH_ALGOS=${WITH_ALGOS} \
3064

65+
ifeq ($(DETECTED_OS), windows)
66+
CMAKE_GENERATOR = Visual Studio 14 2015 Win64
67+
else ifeq ($(DETECTED_OS), linux)
68+
CMAKE_GENERATOR = Unix Makefiles
69+
CMAKE_OPTIONS += -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
70+
else ifeq ($(DETECTED_OS), mac)
71+
CMAKE_GENERATOR = Xcode
72+
endif
3173

32-
serve: install-poetry
33-
@echo "Serving docs locally..."
34-
poetry run mkdocs serve
74+
check_os:
75+
@echo "Verifying detected OS"
76+
ifndef DETECTED_OS
77+
@echo "Failed to detect supported OS"; exit 1
78+
else
79+
@echo "Detected OS: ${DETECTED_OS}"
80+
endif
81+
ifeq ($(DETECTED_OS), mac)
82+
@echo "Detected python version: ${PYTHON_VERSION}, using mac osx deployment target: ${MACOSX_DEPLOYMENT_TARGET}"
83+
endif
3584

36-
setup.py: pyproject.toml README.md
37-
poetry run poetry2setup > setup.py
85+
clean:
86+
@rm -rf build
3887

88+
ifeq ($(DETECTED_OS), mac)
89+
build: export MACOSX_DEPLOYMENT_TARGET=${_MACOSX_DEPLOYMENT_TARGET}
90+
endif
91+
build: check_os
92+
mkdir -p $(BUILD_PATH) && \
93+
cd $(BUILD_PATH) && \
94+
THIRD_PARTY_DIR=$(THIRD_PARTY_DIR) cmake $(CMAKE_OPTIONS) -G "$(CMAKE_GENERATOR)" ../../../
95+
ifeq ($(DETECTED_OS), windows)
96+
cd $(BUILD_PATH) && \
97+
"/c/Program Files (x86)/MSBuild/14.0/Bin/MSBuild.exe" Project.sln //p:Configuration=$(BUILD_TYPE) //maxcpucount:8
98+
else ifeq ($(DETECTED_OS), linux)
99+
cd $(BUILD_PATH) && \
100+
make -j2
101+
else ifeq ($(DETECTED_OS), mac)
102+
cd $(BUILD_PATH) && \
103+
xcodebuild -alltargets -configuration $(BUILD_TYPE) -project Project.xcodeproj CODE_SIGN_IDENTITY=""
104+
endif
105+
cd $(BUILD_PATH_BIN) && \
106+
python -m build
39107

40-
deploy: install-poetry
41-
@echo "Deploying documentation to GitHub pages..."
42-
poetry run mkdocs build
43-
poetry run mkdocs gh-deploy
108+
rebuild: clean build
109+
110+
test: build
111+
cd $(BUILD_PATH_BIN)/dist && pip install --force-reinstall isx-*.whl
112+
cd build/Release && \
113+
ISX_TEST_DATA_PATH=$(TEST_DATA_DIR) python -m pytest --disable-warnings -v -s --junit-xml=$(API_TEST_RESULTS_PATH) test $(TEST_ARGS)

0 commit comments

Comments
 (0)