diff --git a/.gitignore b/.gitignore index 9fbfccca6dfda997d8a0dbfc4b373590feeecad8..81fde16c8c8788938fa26601506a6b9b12c68217 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ install*/ __pycache__ *.pyc *.egg-info +aidge_backend_opencv/_version.py +wheelhouse/* # Mermaid *.mmd @@ -18,4 +20,4 @@ __pycache__ xml*/ # ONNX -*.onnx \ No newline at end of file +*.onnx diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index daf98cc7335244eb29b1197b200a08743a3b43fd..b1ea60538290ca4d7631af4ae07b8c4d00e8b099 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,42 +1,28 @@ -################################################################################ -# Pre-configured CI/CD for your Aidge module. -# -# Three stages are already pre-configured to run on Eclipse Aidge CI: -# - build: ubuntu_cpp, ubuntu_python and windows_cpp; -# - test: ubuntu_cpp, ubuntu_python and windows_cpp; -# - coverage: ubuntu_cpp and ubuntu_python. -# -# If your project is pure C++ or pure Python, you can remove the "_python" or -# "_cpp" jobs respectively. -# "ubuntu" jobs require an Ubuntu runner with a docker executor with tag -# "docker". -# "windows" jobs require a Windows runner with a docker-windows executor with -# tag "windows". -# -# You can change the docker images in the YML scripts directly. The default -# images are: -# - nvidia/cuda:12.2.0-devel-ubuntu22.04 for Ubuntu jobs; -# - buildtools for Windows jobs, built on top of -# mcr.microsoft.com/windows/servercore:ltsc2022 with Microsoft Visual Studio -# 2022 BuildTools installed. -# -# See Aidge project wiki for more details on how to setup your own docker images -# and Gitlab runners. -################################################################################ +############################################################################### +# Aidge Continuous Integration and Deployment # +# # +############################################################################### stages: - # Analyse code - static_analysis - # Build Aidge - build - # Unit test stage - test - # Code coverage - coverage + - release + - deploy include: - - local: '/.gitlab/ci/_global.gitlab-ci.yml' - # - local: '/.gitlab/ci/static_analysis.gitlab-ci.yml' - - local: '/.gitlab/ci/build.gitlab-ci.yml' - - local: '/.gitlab/ci/test.gitlab-ci.yml' - # - local: '/.gitlab/ci/coverage.gitlab-ci.yml' + - project: 'eclipse/aidge/gitlab_shared_files' + ref: 'main' + file: + #Â choose which jobs to run by including the corresponding files. + - '.gitlab/ci/ubuntu_cpp.gitlab-ci.yml' + + - '.gitlab/ci/ubuntu_python.gitlab-ci.yml' + - '.gitlab/ci/release/cibuildwheel_ubuntu.gitlab-ci.yml' + + # - '.gitlab/ci/windows_cpp.gitlab-ci.yml' + + # - '.gitlab/ci/windows_python.gitlab-ci.yml' + # - '.gitlab/ci/release/cibuildwheel_windows.gitlab-ci.yml' + diff --git a/.gitlab/ci/_global.gitlab-ci.yml b/.gitlab/ci/_global.gitlab-ci.yml deleted file mode 100644 index 0dda8ee7b1b8fb8a2c35ca2a1787c477ca2a5053..0000000000000000000000000000000000000000 --- a/.gitlab/ci/_global.gitlab-ci.yml +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Centralized definitions of common job parameter values. # -# Parameters with many optional configurations may be in separate files. # -# # -################################################################################ -variables: - GIT_SUBMODULE_STRATEGY: recursive - OMP_NUM_THREADS: 4 - GIT_SSL_NO_VERIFY: 1 - DEBIAN_FRONTEND: noninteractive - -# See https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines -workflow: - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS - when: never - - if: $CI_COMMIT_BRANCH - -default: - image: nvidia/cuda:12.2.0-devel-ubuntu22.04 - before_script: - - apt update - - apt install -y cmake cppcheck python-is-python3 pip git gcovr unzip curl libopencv-dev diff --git a/.gitlab/ci/build.gitlab-ci.yml b/.gitlab/ci/build.gitlab-ci.yml deleted file mode 100644 index 061f77df382632b863570c44ee5e95fb9eec4ab9..0000000000000000000000000000000000000000 --- a/.gitlab/ci/build.gitlab-ci.yml +++ /dev/null @@ -1,219 +0,0 @@ -include: - - remote: 'https://gitlab.eclipse.org/eclipse/aidge/gitlab_shared_files/-/raw/main/.gitlab/ci/shared_script.gitlab-ci.yml' - -build:ubuntu_cpp: - stage: build - needs: [] - tags: - - docker - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_cpp" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - # Build current module - - export CMAKE_PREFIX_PATH=../install_cpp - - mkdir -p build_cpp - - cd build_cpp - - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON .. - - make -j4 all install - - artifacts: - expire_in: 1 week - paths: - - build_cpp/ - - install_cpp/ -build:ubuntu_cpp_g++10: - stage: build - needs: [] - tags: - - docker - - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_cpp" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - # Build current module - - export CMAKE_PREFIX_PATH=../install_cpp - - apt install -y g++-10 - - mkdir -p build_cpp - - mkdir -p install_cpp - - cd build_cpp - - export CXX=/usr/bin/g++-10 - - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON .. - - make -j4 all install - -build:ubuntu_cpp_g++12: - stage: build - needs: [] - tags: - - docker - - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_cpp" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - # Build current module - - export CMAKE_PREFIX_PATH=../install_cpp - - apt install -y g++-12 - - mkdir -p build_cpp - - mkdir -p install_cpp - - cd build_cpp - - export CXX=/usr/bin/g++-12 - - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON .. - - make -j4 all install - -build:ubuntu_cpp_clang12: - stage: build - needs: [] - tags: - - docker - - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_cpp" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - # Build current module - - export CMAKE_PREFIX_PATH=../install_cpp - - apt install -y clang-12 - - mkdir -p build_cpp - - mkdir -p install_cpp - - cd build_cpp - - export CXX=/usr/bin/clang++-12 - - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON .. - - make -j4 all install - -build:ubuntu_cpp_clang15: - stage: build - needs: [] - tags: - - docker - - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_cpp" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - # Build current module - - export CMAKE_PREFIX_PATH=../install_cpp - - apt install -y clang-15 - - mkdir -p build_cpp - - mkdir -p install_cpp - - cd build_cpp - - export CXX=/usr/bin/clang++-15 - - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug -DWERROR=ON -DCOVERAGE=ON .. - - make -j4 all install - -build:ubuntu_python: - stage: build - needs: [] - tags: - - docker - - script: - # Download dependencies - - DEPENDENCY_JOB="build:ubuntu_python" - # aidge_core - - DEPENDENCY_NAME="aidge_core" - - !reference [.download_dependency, script] - - - python3 -m pip install virtualenv - - virtualenv venv - - source venv/bin/activate - - python3 -m pip install -r requirements.txt - - python3 -m pip install . - - artifacts: - expire_in: 1 week - paths: - - venv/ - -# build:windows_cpp: -# stage: build -# needs: [] -# tags: -# - windows - -# image: buildtools -# before_script: -# # Install Chocolatey -# - Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) -# # Install dependencies -# - choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y -# - choco install git -Y -# - choco install python -Y -# - choco install cuda -Y -# # Update PATH -# - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") -# script: -# # Download dependencies -# # aidge_core -# - 'curl "https://gitlab.eclipse.org/api/v4/projects/5139/jobs/artifacts/main/download?job=build:windows_cpp" -o build_artifacts.zip' -# - Expand-Archive -Path .\build_artifacts.zip -DestinationPath . -Force -# - Remove-Item .\build_cpp\ -Recurse -# # aidge_backend_cpu -# - 'curl "https://gitlab.eclipse.org/api/v4/projects/5140/jobs/artifacts/main/download?job=build:windows_cpp" -o build_artifacts.zip' -# - Expand-Archive -Path .\build_artifacts.zip -DestinationPath . -Force -# - Remove-Item .\build_cpp\ -Recurse - -# - $env:CMAKE_PREFIX_PATH = '../install_cpp' -# - mkdir -p build_cpp -# - cd build_cpp -# - cmake -DCMAKE_INSTALL_PREFIX:PATH=../install_cpp -DCMAKE_BUILD_TYPE=Debug .. -# - cmake --build . -j2 -# - cmake --install . --config Debug - -# artifacts: -# expire_in: 1 week -# paths: -# - build_cpp/ -# - install_cpp/ - -# build:windows_python: -# stage: build -# needs: [] -# tags: -# - windows - -# image: buildtools -# before_script: -# # Install Chocolatey -# - Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) -# # Install dependencies -# - choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y -# - choco install git -Y -# - choco install python -Y -# - choco install cuda -Y -# # Update PATH -# - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") -# script: -# # Download dependencies -# # aidge_core (Python) -# - 'curl "https://gitlab.eclipse.org/api/v4/projects/5139/jobs/artifacts/main/download?job=build:windows_python" -o build_artifacts.zip' -# - Expand-Archive -Path .\build_artifacts.zip -DestinationPath . -Force -# # aidge_backend_cpu (Python) -# - 'curl "https://gitlab.eclipse.org/api/v4/projects/5140/jobs/artifacts/main/download?job=build:windows_python" -o build_artifacts.zip' -# - Expand-Archive -Path .\build_artifacts.zip -DestinationPath . -Force - -# - python -m pip install virtualenv -# - virtualenv venv -# - venv\Scripts\Activate.ps1 -# - python -m pip install -r requirements.txt -# - python -m pip install . -# artifacts: -# expire_in: 1 week -# paths: -# - venv/ diff --git a/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.ps1 b/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..c2715ea5550432838d3cc8692e97204b278d2c85 --- /dev/null +++ b/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.ps1 @@ -0,0 +1,23 @@ +$ErrorActionPreference = "Stop" + +# Retrieve and clean the dependencies string from the environment variable +$AIDGE_DEPENDENCIES = $env:AIDGE_DEPENDENCIES -split ' ' +Write-Host "Aidge dependencies : $AIDGE_DEPENDENCIES" +if ( $($AIDGE_DEPENDENCIES.Length) -eq 0) { + Write-Host "- No dependencies provided for current repsitory" + New-Item -ItemType Directory -Force -Path ".\build" | Out-Null + Remove-Item -Path ".\build\*" -Recurse -Force + } else { + Write-Host "Retrieving given dependencies to build current package : $AIDGE_DEPENDENCIES" + foreach ($dep in $($AIDGE_DEPENDENCIES -split " ")) { + Write-Host "Retrieving : $dep" + $curr_loc=$(Get-Location) + Set-Location ../$dep + Get-Location + Get-ChildItem . + New-Item -Path ".\build" -ItemType Directory -Force | Out-Null + Get-ChildItem -Path ".\build" -File | Remove-Item -Force + python -m pip install . -v + Set-Location $curr_loc + } +} diff --git a/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh b/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh new file mode 100644 index 0000000000000000000000000000000000000000..e621675c67832c9c6301ed1322c290f4f4c00716 --- /dev/null +++ b/.gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e +if [[ "$1" == "" ]]; then + echo "build aidge deps in cibuildwheel container before building wheel." + echo "search path defines where the dependencies will be searched." + echo "Hint : In wheel containers, files are mounted on /host by default." + echo "\nusage : ./cibuildwheel_build_deps_before_build_wheel.sh $search_path" +fi +set -x +if [[ $AIDGE_DEPENDENCIES == "" ]]; then # case for aidge_ core + mkdir -p build # creating build if its not already there to hold the build of cpp files + rm -rf build/* # build from scratch +else + for repo in $AIDGE_DEPENDENCIES ; do # case for other projects + search_path=$1 + REPO_PATH=$(find $search_path ! -writable -prune -o -type d \ + -name "$repo" \ + -not -path "*${AIDGE_INSTALL//"../"}*" \ + -not -path "*/install/*" \ + -not -path "*/.git/*" \ + -not -path "*/miniconda/*" \ + -not -path "*/conda/*" \ + -not -path "*/.local/*" \ + -not -path "*/lib/*" \ + -not -path "*/lib*" \ + -not -path "*/INSTALL*" \ + -not -path "*/$repo/$repo/*" \ + -not -path "*/proc/*" \ + -print -quit) + if [[ -z "$REPO_PATH" ]]; then + echo "ERROR : dependency $repo not found in search_path \"$search_path\". ABORTING." + exit -1 + fi + + cd $REPO_PATH + mkdir -p build # creating build if its not already there to hold the build of cpp files + rm -rf build/* # build from scratch + pip install . -v + cd - + done +fi +set +x +set +e diff --git a/.gitlab/ci/cibuildwheel_install_opencv.sh b/.gitlab/ci/cibuildwheel_install_opencv.sh new file mode 100644 index 0000000000000000000000000000000000000000..5fc00298a3ad9625f6e5ac6be0ec3378f75f92d8 --- /dev/null +++ b/.gitlab/ci/cibuildwheel_install_opencv.sh @@ -0,0 +1,23 @@ +git clone https://github.com/opencv/opencv.git +cd opencv +git checkout 4.9.0 +mkdir build +cd build +cmake .. \ + -DENABLE_SOLUTION_FOLDERS=OFF\ + -DBUILD_TESTS=OFF \ + -DBUILD_opencv_ml=ON \ + -DBUILD_opencv_java_bindings_generator=OFF \ + -DBUILD_opencv_js=OFF \ + -DBUILD_opencv_js_bindings_generator=OFF \ + -DBUILD_opencv_objc_bindings_generator=OFF \ + -DBUILD_opencv_python_bindings_generator=OFF \ + -DBUILD_opencv_apps=OFF \ + -DBUILD_opencv_calib3d=OFF \ + -DBUILD_opencv_videoio=OFF \ + -DBUILD_opencv_highgui=OFF \ + -DBUILD_opencv_gapi=OFF \ + + -DBUI +make -j8 +make install diff --git a/.gitlab/ci/coverage.gitlab-ci.yml b/.gitlab/ci/coverage.gitlab-ci.yml deleted file mode 100644 index 33547fc3f52771c456fba3d34a6e8d96eebafd8a..0000000000000000000000000000000000000000 --- a/.gitlab/ci/coverage.gitlab-ci.yml +++ /dev/null @@ -1,41 +0,0 @@ -coverage:ubuntu_cpp: - stage: coverage - needs: ["build:ubuntu_cpp"] - tags: - - docker - script: - - cd build_cpp - - ctest --output-on-failure - # HTML report for visualization - - gcovr --html-details --exclude-unreachable-branches -o coverage.html --root ${CI_PROJECT_DIR} --filter '\.\./include/' --filter '\.\./src/' - # Coberta XML report for Gitlab integration - - gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR} --filter '\.\./include/' --filter '\.\./src/' - coverage: /^\s*lines:\s*\d+.\d+\%/ - artifacts: - name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA} - expire_in: 2 days - reports: - coverage_report: - coverage_format: cobertura - path: build_cpp/coverage.xml - -coverage:ubuntu_python: - stage: coverage - needs: ["build:ubuntu_python"] - tags: - - docker - script: - - source venv/bin/activate - - python3 -m pip install numpy coverage - - cd ${CI_PROJECT_NAME} - # Retrieve the installation path of the module, since it is installed with pip. - - export MODULE_LOCATION=`python -c "import ${CI_PROJECT_NAME} as _; print(_.__path__[0])"` - - python3 -m coverage run --source=$MODULE_LOCATION -m unittest discover -s unit_tests/ -v -b - - python3 -m coverage report - - python3 -m coverage xml - coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' - artifacts: - reports: - coverage_report: - coverage_format: cobertura - path: ${CI_PROJECT_NAME}/coverage.xml diff --git a/.gitlab/ci/test.gitlab-ci.yml b/.gitlab/ci/test.gitlab-ci.yml deleted file mode 100644 index 5176feb0a2834f85fdea1b9a0922d0cf334e5d5e..0000000000000000000000000000000000000000 --- a/.gitlab/ci/test.gitlab-ci.yml +++ /dev/null @@ -1,49 +0,0 @@ -test:ubuntu_cpp: - stage: test - needs: ["build:ubuntu_cpp"] - tags: - - docker - script: - - cd build_cpp - - ctest --output-junit ctest-results.xml --output-on-failure - artifacts: - reports: - junit: build_cpp/ctest-results.xml - -test:ubuntu_python: - stage: test - needs: ["build:ubuntu_python"] - tags: - - docker - script: - - source venv/bin/activate - - cd ${CI_PROJECT_NAME} - - python3 -m pip install numpy unittest-xml-reporting - - python3 -m pip list - # Run on discovery all tests located in core/unit_tests/python - - python3 -m xmlrunner discover -s unit_tests/ -v -b --output-file xmlrunner-results.xml - artifacts: - reports: - junit: ${CI_PROJECT_NAME}/xmlrunner-results.xml - -# test:windows_cpp: -# stage: test -# needs: ["build:windows_cpp"] -# tags: -# - windows -# image: buildtools -# before_script: -# # Install Chocolatey -# - Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) -# # Install dependencies -# - choco install cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"' -Y -# - choco install python -Y -# # Update PATH -# - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") -# script: -# - cd build_cpp -# - ctest --output-junit ctest-results.xml --output-on-failure -# artifacts: -# reports: -# junit: build_cpp/ctest-results.xml - diff --git a/CMakeLists.txt b/CMakeLists.txt index 89926eaae69899c9d01874d3759e6cef52961a9c..e27b11e53a7973c7d0eba0ed3050053e453b5948 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,20 +1,21 @@ cmake_minimum_required(VERSION 3.15) -file(READ "${CMAKE_SOURCE_DIR}/version.txt" version) -file(READ "${CMAKE_SOURCE_DIR}/project_name.txt" project) +file(STRINGS "${CMAKE_SOURCE_DIR}/version.txt" version) -message(STATUS "Project name: ${project}") +project(aidge_backend_opencv + VERSION ${version} + DESCRIPTION "Opencv implementations of the operators and tensor of aidge framework" + LANGUAGES CXX) + +message(STATUS "Project name: ${CMAKE_PROJECT_NAME}") message(STATUS "Project version: ${version}") # Note : project name is {project} and python module name is also {project} -set(module_name _${project}) # target name - - -project(${project}) +set(module_name _${CMAKE_PROJECT_NAME}) # target name ############################################## # Define options -option(PYBIND "python binding" ON) +option(PYBIND "python binding" OFF) option(WERROR "Warning as error" OFF) option(TEST "Enable tests" ON) option(COVERAGE "Enable coverage" OFF) @@ -22,7 +23,6 @@ option(COVERAGE "Enable coverage" OFF) ############################################## # Import utils CMakeLists set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") -include(PybindModuleCreation) if(CMAKE_COMPILER_IS_GNUCXX AND COVERAGE) Include(CodeCoverage) @@ -63,14 +63,15 @@ target_include_directories(${module_name} # PYTHON BINDING if (PYBIND) - generate_python_binding(${project} ${module_name}) - # Handles Python + pybind11 headers dependencies + include(PybindModuleCreation) + generate_python_binding(${CMAKE_PROJECT_NAME} ${module_name}) + target_link_libraries(${module_name} - PUBLIC + PUBLIC pybind11::pybind11 PRIVATE - Python::Python + Python::Module ) endif() @@ -92,9 +93,9 @@ endif() # Installation instructions include(GNUInstallDirs) -set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${project}) +set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}) -install(TARGETS ${module_name} EXPORT ${project}-targets +install(TARGETS ${module_name} EXPORT ${CMAKE_PROJECT_NAME}-targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -105,8 +106,8 @@ install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) #Export the targets to a script -install(EXPORT ${project}-targets - FILE "${project}-targets.cmake" +install(EXPORT ${CMAKE_PROJECT_NAME}-targets + FILE "${CMAKE_PROJECT_NAME}-targets.cmake" DESTINATION ${INSTALL_CONFIGDIR} COMPONENT ${module_name} ) @@ -115,32 +116,35 @@ install(EXPORT ${project}-targets include(CMakePackageConfigHelpers) write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config-version.cmake" VERSION ${version} COMPATIBILITY AnyNewerVersion ) -configure_package_config_file("${project}-config.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake" +configure_package_config_file("${CMAKE_PROJECT_NAME}-config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake" INSTALL_DESTINATION ${INSTALL_CONFIGDIR} ) #Install the config, configversion and custom find modules install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/${project}-config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/${project}-config-version.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-config-version.cmake" DESTINATION ${INSTALL_CONFIGDIR} ) ############################################## ## Exporting from the build tree -export(EXPORT ${project}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/${project}-targets.cmake") +export(EXPORT ${CMAKE_PROJECT_NAME}-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}-targets.cmake") ############################################## ## Add test if(TEST) + if(PYBIND) + message(FATAL_ERROR "PYBIND and TEST are both enabled. But cannot compile with catch_2.\nChoose between pybind and Catch2 for compilation.") + endif() enable_testing() add_subdirectory(unit_tests) endif() diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..c08fcf0df6a64564c7036402b71435bd40fded0b --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,7 @@ +recursive-include aidge_backend_opencv *.py +recursive-exclude aidge_backend_opencv/unit_tests *.py + +recursive-include include * +recursive-include src * +recursive-exclude unit_tests * + diff --git a/README.md b/README.md index 682f507220fb168a44f94033b91f1502e0cde5e8..312ac11b245d84f02e7ea020e85298be579b4c61 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,30 @@ -# Aidge CPU library +# Aidge backend OpenCV library You can find in this folder the library that implements : - Computer vision databases - The OpenCV tensor, operators and stimulis So far be sure to have the correct requirements to use this library -- GCC -- OpenCV >= 3.0 -- Make -- CMake -- aidge_core -- aidge_backend_cpu -- Python (optional, if you have no intend to use this library in python with pybind) +[TOC] -## Pip installation +## Installation +### Dependencies +- `GCC` +- `OpenCV` >= 3.0 +- `Make` +- `CMake` +- `Python` (optional, if you have no intend to use this library in python with pybind) -You will need to install first the aidge_core and aidge_backend_cpu libraries before installing aidge_backend_opencv. -Then run in your python environnement : +#### aidge dependencies + - `aidge_core` + - `aidge_backend_cpu`. + +### Pip installation ``` bash pip install . -v -``` \ No newline at end of file +``` +> **TIPS :** Use environment variables to change compilation options : +> - `AIDGE_INSTALL` : to set the installation folder. Defaults to /usr/local/lib. :warning: This path must be identical to aidge_core install path. +> - `AIDGE_PYTHON_BUILD_TYPE` : to set the compilation mode to **Debug** or **Release** +> - `AIDGE_BUILD_GEN` : to set the build backend with + diff --git a/aidge_backend_opencv/__init__.py b/aidge_backend_opencv/__init__.py index c98e9dcce9341681089d79478b2d6b9d5540a030..8900ab01c3175b7747471760a61bfe7d40a3dbd1 100644 --- a/aidge_backend_opencv/__init__.py +++ b/aidge_backend_opencv/__init__.py @@ -1,2 +1,3 @@ # Example 1: import .so generated by PyBind +import aidge_core from aidge_backend_opencv.aidge_backend_opencv import * diff --git a/cmake/PybindModuleCreation.cmake b/cmake/PybindModuleCreation.cmake index 18f4abc38e2537c3f4d949f08772a57b90758cb0..8f386bef59ed86dfa366eca5d4fccae24b28d24e 100644 --- a/cmake/PybindModuleCreation.cmake +++ b/cmake/PybindModuleCreation.cmake @@ -1,23 +1,25 @@ -function(generate_python_binding name target_to_bind) - if (PYBIND) - add_definitions(-DPYBIND) - Include(FetchContent) +function(generate_python_binding pybind_module_name target_to_bind) + add_definitions(-DPYBIND) + Include(FetchContent) - FetchContent_Declare( + set(PYBIND_VERSION v2.10.4) + set(PYBIND11_FINDPYTHON ON) + message(STATUS "Retrieving pybind ${PYBIND_VERSION} from git") + + FetchContent_Declare( PyBind11 GIT_REPOSITORY https://github.com/pybind/pybind11.git - GIT_TAG v2.10.4 # or a later release - ) + GIT_TAG ${PYBIND_VERSION} # or a later release + ) - # Use the New FindPython mode, recommanded. Requires CMake 3.15+ - find_package(Python COMPONENTS Interpreter Development) - FetchContent_MakeAvailable(PyBind11) + # Use the New FindPython mode, recommanded. Requires CMake 3.15+ + find_package(Python COMPONENTS Interpreter Development.Module) + FetchContent_MakeAvailable(PyBind11) - message(STATUS "Creating binding for module ${name}") - file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp") + message(STATUS "Creating binding for module ${pybind_module_name}") + file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp") - pybind11_add_module(${name} MODULE ${pybind_src_files} "NO_EXTRAS") # NO EXTRA recquired for pip install - target_include_directories(${name} PUBLIC "python_binding") - target_link_libraries(${name} PUBLIC ${target_to_bind}) - endif() + pybind11_add_module(${pybind_module_name} MODULE ${pybind_src_files} "NO_EXTRAS") # NO EXTRA recquired for pip install + target_include_directories(${pybind_module_name} PUBLIC "python_binding") + target_link_libraries(${pybind_module_name} PUBLIC ${target_to_bind}) endfunction() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..485d2315edc7dfedbabc826efb1c0dd3a2887db0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,69 @@ +[project] +name = "aidge_backend_opencv" +description="Opencv implementations of the operators and tensor of aidge framework" +dependencies = [ + "numpy>=1.21.6", +] +requires-python = ">= 3.7" +dynamic = ["version"] # defined in tool.setuptools_scm +readme = "README.md" +license = { file = "LICENSE" } +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Programming Language :: Python :: 3" + ] + +[build-system] +requires = [ + "setuptools>=64", + "setuptools_scm[toml]==7.1.0", + "cmake>=3.15.3.post1", + "toml", + "opencv-python>=4.9.0.80", +] +build-backend = "setuptools.build_meta" + +##################################################### +# SETUPTOOLS +[tool.setuptools] +[tool.setuptools.packages.find] +where = ["."] # list of folders that contain the packages (["."] by default) +include = ["aidge_backend_opencv*"] # package names should match these glob patterns (["*"] by default) +exclude = ["aidge_backend_opencv.unit_tests*"] # exclude packages matching these glob patterns (empty by default) +namespaces = false # to disable scanning PEP 420 namespaces (true by default) +# SETUPTOOLS_SCM +[tool.setuptools_scm] +write_to = "aidge_backend_opencv/_version.py" + +##################################################### +# CIBUILDWHEEL +[tool.cibuildwheel] +build-frontend = "build" +test-requires = "pytest" +test-command = "pytest {package}/aidge_backend_opencv/unit_tests" +# uncomment to run cibuildwheel locally on selected distros +# build=[ +# "cp38-manylinux_x86_64", +# "cp39-manylinux_x86_64", +# "cp310-manylinux_x86_64" +# ] + +### AIDGE DEPENDENCIES DECLARATION +# aidge_core do not rely on any aidge dependency, hence this string is empty +[tool.cibuildwheel.environment] +AIDGE_DEPENDENCIES = "aidge_core" # format => "dep_1 dep_2 ... dep_n" +AIDGE_INSTALL="/host/AIDGE_INSTALL_CIBUILDWHEEL" +[tool.cibuildwheel.linux] +before-build = [ + "bash .gitlab/ci/cibuildwheel_install_opencv.sh /host && bash .gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh /host" +] +before-test = [ + "bash .gitlab/ci/cibuildwheel_install_opencv.sh /host && bash .gitlab/ci/cibuildwheel_build_deps_before_build_wheel.sh /host" +] +[tool.cibuildwheel.windows] +before-build = [ + "powershell -File .\\.gitlab\\ci\\cibuildwheel_build_deps_before_build_wheel.ps1" +] +before-test = [ + "powershell -File .\\.gitlab\\ci\\cibuildwheel_build_deps_before_build_wheel.ps1" +] diff --git a/setup.py b/setup.py index 168007e3367e7785054acc13c7a722339d94fea3..1af040be23e6e40b459a4957a5172eab86abf0b1 100644 --- a/setup.py +++ b/setup.py @@ -1,50 +1,31 @@ -#!/usr/bin/env python3 -""" Aidge - -#TODO To change -POC of the next framework named Aidge -""" - -DOCLINES = (__doc__ or '').split("\n") - import sys import os - -# Python supported version checks -if sys.version_info[:2] < (3, 7): - raise RuntimeError("Python version >= 3.7 required.") - - -CLASSIFIERS = """\ -Development Status :: 2 - Pre-Alpha -""" - import shutil import pathlib -import subprocess import multiprocessing +import sysconfig + from math import ceil +import toml + from setuptools import setup, Extension -from setuptools import find_packages from setuptools.command.build_ext import build_ext -def get_project_name() -> str: - return open(pathlib.Path().absolute() / "project_name.txt", "r").read() -def get_project_version() -> str: - aidge_root = pathlib.Path().absolute() - version = open(aidge_root / "version.txt", "r").read().strip() - return version +def get_project_name() -> str: + with open(pathlib.Path().absolute() / "pyproject.toml", "r") as file: + project_toml = toml.load(file) + return project_toml["project"]["name"] class CMakeExtension(Extension): def __init__(self, name): super().__init__(name, sources=[]) -class CMakeBuild(build_ext): +class CMakeBuild(build_ext): def run(self): # This lists the number of processors available on the machine # The compilation will use half of them @@ -64,15 +45,45 @@ class CMakeBuild(build_ext): # Impose to use the executable of the python # used to launch setup.py to setup PythonInterp - param_py = "-DPYTHON_EXECUTABLE=" + sys.executable + python_executable = sys.executable + print(f"python executable :\t{python_executable}") + compile_type = ( + "Release" + if "AIDGE_PYTHON_BUILD_TYPE" not in os.environ + else os.environ["AIDGE_PYTHON_BUILD_TYPE"] + ) + + install_path = ( + os.path.join(sys.prefix, "lib", "libAidge") + if "AIDGE_INSTALL" not in os.environ + else os.environ["AIDGE_INSTALL"] + ) + + build_gen = ( + ["-G", os.environ["AIDGE_BUILD_GEN"]] + if "AIDGE_BUILD_GEN" in os.environ + else [] + ) + + self.spawn( + [ + "cmake", + *build_gen, + str(cwd), + "-DTEST=OFF", + f"-DCMAKE_INSTALL_PREFIX:PATH={install_path}", + f"-DCMAKE_BUILD_TYPE={compile_type}", + "-DPYBIND=ON", + "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON", + "-DCOVERAGE=OFF", + ] + ) - compile_type = 'Debug' - install_path = os.path.join(sys.prefix, "lib", "libAidge") if "AIDGE_INSTALL" not in os.environ else os.environ["AIDGE_INSTALL"] - - self.spawn(['cmake', str(cwd), param_py, '-DTEST=OFF', f'-DCMAKE_INSTALL_PREFIX:PATH={install_path}', f'-DCMAKE_BUILD_TYPE={compile_type}']) if not self.dry_run: - self.spawn(['cmake', '--build', '.', '--config', compile_type, '-j', max_jobs]) - self.spawn(['cmake', '--install', '.', '--config', compile_type]) + self.spawn( + ["cmake", "--build", ".", "--config", compile_type, "-j", max_jobs] + ) + self.spawn(["cmake", "--install", ".", "--config", compile_type]) os.chdir(str(cwd)) aidge_package = build_lib / (get_project_name()) @@ -83,32 +94,19 @@ class CMakeBuild(build_ext): # Copy all shared object files from build_temp/lib to aidge_package for root, _, files in os.walk(build_temp.absolute()): for file in files: - if (file.endswith('.so') or file.endswith('.pyd')) and (root != str(aidge_package.absolute())): - currentFile=os.path.join(root, file) + if (file.endswith(".so") or file.endswith(".pyd")) and ( + root != str(aidge_package.absolute()) + ): + currentFile = os.path.join(root, file) shutil.copy(currentFile, str(aidge_package.absolute())) - # Copy version.txt in aidge_package - os.chdir(os.path.dirname(__file__)) - shutil.copy("version.txt", str(aidge_package.absolute())) - - -if __name__ == '__main__': +if __name__ == "__main__": setup( - name=get_project_name(), - version=get_project_version(), - python_requires='>=3.7', - description=DOCLINES[0], - long_description_content_type="text/markdown", - long_description="\n".join(DOCLINES[2:]), - classifiers=[c for c in CLASSIFIERS.split('\n') if c], - packages=find_packages(where="."), include_package_data=True, ext_modules=[CMakeExtension(get_project_name())], cmdclass={ - 'build_ext': CMakeBuild, + "build_ext": CMakeBuild, }, - install_requires=['aidge_core'], zip_safe=False, - ) diff --git a/version.txt b/version.txt index bcab45af15a0f1b0166daf8cbf18b17cd8649277..b1e80bb2480a6db3c4b252661ac61ed945409b32 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.0.3 +0.1.3