From a02f26d387b45d19b8f4fa1abd14e059478d3920 Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 17:22:46 -0800 Subject: [PATCH 01/12] Add C++ dependencies to environment. --- environment.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/environment.yml b/environment.yml index 43d207e6..02cfe02c 100644 --- a/environment.yml +++ b/environment.yml @@ -26,10 +26,15 @@ dependencies: - psutil - protobuf - libprotobuf - - conda-forge:hcipy + - conda-forge::hcipy + - conda-forge::cppzmq==4.8.1 + - conda-forge::pybind11==2.13.6 + - conda-forge::eigen==3.4.0 + - conda-forge::nlohmann_json==3.9.1 + - conda-forge::pybind11_json==0.2.15 - pip - - conda-forge::cmake>=3.0.0 - - conda-forge::doxygen + - cmake>=3.0.0 + - doxygen - sphinx - conda-forge::sphinx-automodapi - conda-forge::breathe==4.32.0 From 009ed5d15f1c21ed10a1fbcc45a209b9c1054f7e Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 17:23:49 -0800 Subject: [PATCH 02/12] Link to C++ libraries in environment rather than extern directory. --- catkit_bindings/CMakeLists.txt | 6 ++++-- catkit_core/CMakeLists.txt | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/catkit_bindings/CMakeLists.txt b/catkit_bindings/CMakeLists.txt index 02533f21..89b459be 100644 --- a/catkit_bindings/CMakeLists.txt +++ b/catkit_bindings/CMakeLists.txt @@ -7,10 +7,12 @@ set(CMAKE_CXX_STANDARD_REQUIRED on) set(SOURCES "bindings.cpp") -add_subdirectory(../extern/pybind11 pybind11) +find_package(pybind11 REQUIRED) pybind11_add_module(catkit_bindings ${SOURCES}) -target_include_directories(catkit_bindings PUBLIC ../extern/pybind11_json-0.2.11/include) +find_package(pybind11_json REQUIRED) +target_include_directories(catkit_bindings PUBLIC pybind11_json_INCLUDE_DIRS) + target_include_directories(catkit_bindings PUBLIC ../catkit_core) target_link_libraries(catkit_bindings PUBLIC catkit_core) diff --git a/catkit_core/CMakeLists.txt b/catkit_core/CMakeLists.txt index 6258d432..780caa30 100644 --- a/catkit_core/CMakeLists.txt +++ b/catkit_core/CMakeLists.txt @@ -63,16 +63,16 @@ else() endif (WIN32) # Add includes for cppzmq -set(CPPZMQ_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../extern/cppzmq-4.8.1) +find_package(cppzmq REQUIRED) target_include_directories(catkit_core PUBLIC ${CPPZMQ_INCLUDE_DIR}) # Link Eigen -set(EIGEN_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../extern/eigen-3.4.0) -target_include_directories(catkit_core PUBLIC ${EIGEN_INCLUDE_DIR}) +find_package(Eigen3 REQUIRED NO_MODULE) +target_link_libraries (catkit_core PUBLIC Eigen3::Eigen) # Link nlohmann JSON -set (JSON_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/../extern/json-3.9.1/include) -target_include_directories(catkit_core PUBLIC ${JSON_INCLUDE_DIR}) +find_package(nlohmann_json) +target_include_directories(catkit_core PRIVATE ${JSON_INCLUDE_DIR}) # Link protobuf INCLUDE(FindProtobuf) From 571672be5c6465cbd7dd03d26ea0b57cee94fda1 Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 17:24:23 -0800 Subject: [PATCH 03/12] Build all C++ files in the catkit_core directory. --- catkit_core/CMakeLists.txt | 33 ++++----------------------------- catkit_core/LoggingProxy.cpp | 3 --- 2 files changed, 4 insertions(+), 32 deletions(-) delete mode 100644 catkit_core/LoggingProxy.cpp diff --git a/catkit_core/CMakeLists.txt b/catkit_core/CMakeLists.txt index 780caa30..29c4dd20 100644 --- a/catkit_core/CMakeLists.txt +++ b/catkit_core/CMakeLists.txt @@ -11,35 +11,10 @@ endif() add_compile_options($<$:/MP1>) -add_library(catkit_core STATIC - DataStream.cpp - SharedMemory.cpp - Synchronization.cpp - Timing.cpp - Log.cpp - LogConsole.cpp - LogFile.cpp - LogForwarder.cpp - HostName.cpp - Command.cpp - Property.cpp - Service.cpp - Server.cpp - Client.cpp - TestbedProxy.cpp - ServiceProxy.cpp - ServiceState.cpp - Tensor.cpp - Tracing.cpp - Types.cpp - Util.cpp - PoolAllocator.cpp - FreeListAllocator.cpp - proto/core.pb.cc - proto/logging.pb.cc - proto/testbed.pb.cc - proto/service.pb.cc - proto/tracing.pb.cc) +file(GLOB_RECURSE SOURCES "*.cpp") +file(GLOB_RECURSE HEADERS "*.h") + +add_library(catkit_core STATIC "${SOURCES}") set_property(TARGET catkit_core PROPERTY POSITION_INDEPENDENT_CODE ON) target_compile_definitions(catkit_core PUBLIC PROTOBUF_USE_DLLS) diff --git a/catkit_core/LoggingProxy.cpp b/catkit_core/LoggingProxy.cpp deleted file mode 100644 index 4f189fda..00000000 --- a/catkit_core/LoggingProxy.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "LoggingProxy.h" - -LoggingProxy::LoggingProxy(std::shared_ptr ) \ No newline at end of file From eafd8069493264abe0fde8f0045a2839d5b37e2b Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 17:25:44 -0800 Subject: [PATCH 04/12] Build proto files in CMake files. --- catkit_bindings/CMakeLists.txt | 22 ++++++++++++++++++++++ catkit_bindings/bindings.cpp | 2 +- catkit_core/CMakeLists.txt | 25 ++++++++++++++++++++++--- catkit_core/Service.cpp | 2 +- catkit_core/ServiceProxy.cpp | 2 +- catkit_core/ServiceState.h | 2 +- catkit_core/Tensor.h | 2 +- catkit_core/TestbedProxy.cpp | 2 +- catkit_core/TestbedProxy.h | 2 +- catkit_core/Tracing.cpp | 2 +- catkit_core/Types.h | 2 +- 11 files changed, 53 insertions(+), 12 deletions(-) diff --git a/catkit_bindings/CMakeLists.txt b/catkit_bindings/CMakeLists.txt index 89b459be..fe9840fe 100644 --- a/catkit_bindings/CMakeLists.txt +++ b/catkit_bindings/CMakeLists.txt @@ -17,4 +17,26 @@ target_include_directories(catkit_bindings PUBLIC ../catkit_core) target_link_libraries(catkit_bindings PUBLIC catkit_core) +# Compile protobuf files. +find_package(Protobuf REQUIRED) + +set(PROTO_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/core.proto + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/logging.proto + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/service.proto + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/testbed.proto + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/tracing.proto +) + +set(PYTHON_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../catkit2/proto) + +add_custom_target( + catkit2_python_protobuf ALL + COMMAND ${Protobuf_PROTOC_EXECUTABLE} + --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/../proto + --python_out=${PYTHON_OUT_DIR} + ${PROTO_FILES} + DEPENDS ${PROTO_FILES} +) + install(TARGETS catkit_bindings DESTINATION lib) diff --git a/catkit_bindings/bindings.cpp b/catkit_bindings/bindings.cpp index 00c0f8d3..3b7fadf7 100644 --- a/catkit_bindings/bindings.cpp +++ b/catkit_bindings/bindings.cpp @@ -21,7 +21,7 @@ #include "HostName.h" #include "Tracing.h" -#include "proto/testbed.pb.h" +#include "testbed.pb.h" #define STRINGIFY(x) #x #define MACRO_STRINGIFY(x) STRINGIFY(x) diff --git a/catkit_core/CMakeLists.txt b/catkit_core/CMakeLists.txt index 29c4dd20..7918da90 100644 --- a/catkit_core/CMakeLists.txt +++ b/catkit_core/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.21) project(catkit_core) @@ -55,15 +55,34 @@ find_package(Protobuf REQUIRED) target_include_directories(catkit_core PUBLIC ${PROTOBUF_INCLUDE_DIR}) target_link_libraries(catkit_core PUBLIC ${PROTOBUF_LIBRARY}) +set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/gen/") +file(MAKE_DIRECTORY "${PROTO_BINARY_DIR}") +protobuf_generate( + TARGET catkit_core + IMPORT_DIRS ../proto + PROTOC_OUT_DIR "${PROTO_BINARY_DIR}" + PROTOS + ../proto/core.proto + ../proto/logging.proto + ../proto/service.proto + ../proto/testbed.proto + ../proto/tracing.proto +) +target_include_directories(catkit_core PUBLIC "$") + # Add install files -install(TARGETS catkit_core DESTINATION lib) +install(TARGETS catkit_core + LIBRARY DESTINATION lib + PUBLIC_HEADER DESTINATION include +) + install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.inl" ) -install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../proto/gen/cpp/ +install(DIRECTORY "${PROTO_BINARY_DIR}" DESTINATION include/catkit_core FILES_MATCHING PATTERN "*.h" diff --git a/catkit_core/Service.cpp b/catkit_core/Service.cpp index e472d251..1d37b763 100644 --- a/catkit_core/Service.cpp +++ b/catkit_core/Service.cpp @@ -4,7 +4,7 @@ #include "Timing.h" #include "TestbedProxy.h" #include "Tracing.h" -#include "proto/service.pb.h" +#include "service.pb.h" #include #include diff --git a/catkit_core/ServiceProxy.cpp b/catkit_core/ServiceProxy.cpp index 53629f88..1eb3c122 100644 --- a/catkit_core/ServiceProxy.cpp +++ b/catkit_core/ServiceProxy.cpp @@ -4,7 +4,7 @@ #include "Timing.h" #include "Service.h" #include "Util.h" -#include "proto/service.pb.h" +#include "service.pb.h" #include diff --git a/catkit_core/ServiceState.h b/catkit_core/ServiceState.h index 5f3cacbe..2d7a9c76 100644 --- a/catkit_core/ServiceState.h +++ b/catkit_core/ServiceState.h @@ -1,7 +1,7 @@ #ifndef SERVICE_STATE_H #define SERVICE_STATE_H -#include "proto/testbed.pb.h" +#include "testbed.pb.h" enum ServiceState { diff --git a/catkit_core/Tensor.h b/catkit_core/Tensor.h index 228e4256..23c22284 100644 --- a/catkit_core/Tensor.h +++ b/catkit_core/Tensor.h @@ -2,7 +2,7 @@ #define TENSOR_H #include "ComplexTraits.h" -#include "proto/core.pb.h" +#include "core.pb.h" #include diff --git a/catkit_core/TestbedProxy.cpp b/catkit_core/TestbedProxy.cpp index de7ad885..596435f0 100644 --- a/catkit_core/TestbedProxy.cpp +++ b/catkit_core/TestbedProxy.cpp @@ -2,7 +2,7 @@ #include "Timing.h" #include "HostName.h" -#include "proto/testbed.pb.h" +#include "testbed.pb.h" #include #include diff --git a/catkit_core/TestbedProxy.h b/catkit_core/TestbedProxy.h index 032ee659..d54be6fb 100644 --- a/catkit_core/TestbedProxy.h +++ b/catkit_core/TestbedProxy.h @@ -5,7 +5,7 @@ #include "LoggingProxy.h" #include "DataStream.h" #include "Client.h" -#include "proto/testbed.pb.h" +#include "testbed.pb.h" #include "ServiceState.h" #include "Util.h" diff --git a/catkit_core/Tracing.cpp b/catkit_core/Tracing.cpp index 0807b63e..31c9903c 100644 --- a/catkit_core/Tracing.cpp +++ b/catkit_core/Tracing.cpp @@ -3,7 +3,7 @@ #include "Timing.h" #include "Util.h" #include "Log.h" -#include "proto/tracing.pb.h" +#include "tracing.pb.h" #include diff --git a/catkit_core/Types.h b/catkit_core/Types.h index 165929ea..1480df55 100644 --- a/catkit_core/Types.h +++ b/catkit_core/Types.h @@ -2,7 +2,7 @@ #define TYPES_H #include "Tensor.h" -#include "proto/core.pb.h" +#include "core.pb.h" #include #include From 60059c602c5d42ef028b7579c7315e7364994b3f Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 17:55:54 -0800 Subject: [PATCH 05/12] Remove all external libraries. --- extern/download.sh | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100755 extern/download.sh diff --git a/extern/download.sh b/extern/download.sh deleted file mode 100755 index 647adcf3..00000000 --- a/extern/download.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Download cppzmq -curl -L https://github.com/zeromq/cppzmq/archive/refs/tags/v4.8.1.tar.gz -O -tar xfz v4.8.1.tar.gz -rm -f v4.8.1.tar.gz - -# Download pybind11 -git clone -b v2.9.2 https://github.com/pybind/pybind11 - -# Download Eigen -curl -L https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz -O -tar xfz eigen-3.4.0.tar.gz -rm -f eigen-3.4.0.tar.gz - -# Download nlohmann JSON -curl -L https://github.com/nlohmann/json/archive/refs/tags/v3.9.1.tar.gz -O -tar xfz v3.9.1.tar.gz -rm -f v3.9.1.tar.gz - -# Download pybind11 to JSON converter -curl -L https://github.com/pybind/pybind11_json/archive/refs/tags/0.2.11.tar.gz -O -tar xfz 0.2.11.tar.gz -rm -f 0.2.11.tar.gz From 5892672800769a61a97176864f03f34dfebcd0ad Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 18:00:41 -0800 Subject: [PATCH 06/12] Use pyproject.toml file for installation. Instead of setup.py. --- catkit_bindings/CMakeLists.txt | 2 +- pyproject.toml | 95 +++++++++++++++ setup.py | 209 --------------------------------- 3 files changed, 96 insertions(+), 210 deletions(-) create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/catkit_bindings/CMakeLists.txt b/catkit_bindings/CMakeLists.txt index fe9840fe..dc7f0563 100644 --- a/catkit_bindings/CMakeLists.txt +++ b/catkit_bindings/CMakeLists.txt @@ -39,4 +39,4 @@ add_custom_target( DEPENDS ${PROTO_FILES} ) -install(TARGETS catkit_bindings DESTINATION lib) +install(TARGETS catkit_bindings LIBRARY DESTINATION catkit2/) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..8a10b90d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,95 @@ +[build-system] +requires = ["scikit-build-core"] +build-backend = "scikit_build_core.build" + +[tool.scikit-build] +build.verbose = true +logging.level = "INFO" + +[project] +name = "catkit2" +version = "0.0.1" +authors = [ + {name = "E.H. Por et al."}, +] +description = "A library for controlling testbed hardware" +requires-python = ">=3.7" +dependencies = [ +] +maintainers = [ + {name = "Emiel Por", email = "epor@ucsc.edu"}, + {name = "Remi Soummer", email = "soummer@stsci.edu"}, + {name = "Iva Laginja", email = "iva.laginja@obspm.fr"} +] +readme = "README.md" +license = {file = "LICENSE.rst"} +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", +] + +[project.urls] +Homepage = "https://spacetelescope.github.com/catkit2" +Documentation = "https://spacetelescope.github.io/catkit2" +Repository = "https://spacetelescope.github.com/catkit2.git" + +[project.entry-points."catkit2.services"] +aimtti_plp_device = "catkit2.services.aimtti_plp_device.aimtti_plp_device" +aimtti_plp_device_sim = "catkit2.services.aimtti_plp_device_sim.aimtti_plp_device_sim" +allied_vision_camera = "catkit2.services.allied_vision_camera.allied_vision_camera" +bmc_deformable_mirror_hardware = "catkit2.services.bmc_deformable_mirror_hardware.bmc_deformable_mirror_hardware" +bmc_deformable_mirror_sim = "catkit2.services.bmc_deformable_mirror_sim.bmc_deformable_mirror_sim" +bmc_dm = "catkit2.services.bmc_dm.bmc_dm" +bmc_dm_sim = "catkit2.services.bmc_dm_sim.bmc_dm_sim" +camera_sim = "catkit2.services.camera_sim.camera_sim" +dummy_camera = "catkit2.services.dummy_camera.dummy_camera" +empty_service = "catkit2.services.empty_service.empty_service" +flir_camera = "catkit2.services.flir_camera.flir_camera" +hamamatsu_camera = "catkit2.services.hamamatsu_camera.hamamatsu_camera" +newport_picomotor = "catkit2.services.newport_picomotor.newport_picomotor" +newport_picomotor_sim = "catkit2.services.newport_picomotor_sim.newport_picomotor_sim" +newport_xps_q8 = "catkit2.services.newport_xps_q8.newport_xps_q8" +newport_xps_q8_sim = "catkit2.services.newport_xps_q8_sim.newport_xps_q8_sim" +ni_daq = "catkit2.services.ni_daq.ni_daq" +ni_daq_sim = "catkit2.services.ni_daq_sim.ni_daq_sim" +nkt_superk = "catkit2.services.nkt_superk.nkt_superk" +nkt_superk_sim = "catkit2.services.nkt_superk_sim.nkt_superk_sim" +oceanoptics_spectrometer = "catkit2.services.oceanoptics_spectrometer.oceanoptics_spectrometer" +oceanoptics_spectrometer_sim = "catkit2.services.oceanoptics_spectrometer_sim.oceanoptics_spectrometer_sim" +omega_ithx_w3 = "catkit2.services.omega_ithx_w3.omega_ithx_w3" +omega_ithx_w3_sim = "catkit2.services.omega_ithx_w3_sim.omega_ithx_w3_sim" +safety_manual_check = "catkit2.services.safety_manual_check.safety_manual_check" +safety_monitor = "catkit2.services.safety_monitor.safety_monitor" +simple_simulator = "catkit2.services.simple_simulator.simple_simulator" +snmp_ups = "catkit2.services.snmp_ups.snmp_ups" +snmp_ups_sim = "catkit2.services.snmp_ups_sim.snmp_ups_sim" +thorlabs_cld101x = "catkit2.services.thorlabs_cld101x.thorlabs_cld101x" +thorlabs_cld101x_sim = "catkit2.services.thorlabs_cld101x_sim.thorlabs_cld101x_sim" +thorlabs_cube_motor_kinesis = "catkit2.services.thorlabs_cube_motor_kinesis.thorlabs_cube_motor_kinesis" +thorlabs_cube_motor_kinesis_sim = "catkit2.services.thorlabs_cube_motor_kinesis_sim.thorlabs_cube_motor_kinesis_sim" +thorlabs_fw102c = "catkit2.services.thorlabs_fw102c.thorlabs_fw102c" +thorlabs_mcls1 = "catkit2.services.thorlabs_mcls1.thorlabs_mcls1" +thorlabs_mcls1_sim = "catkit2.services.thorlabs_mcls1_sim.thorlabs_mcls1_sim" +thorlabs_mff101 = "catkit2.services.thorlabs_mff101.thorlabs_mff101" +thorlabs_mff101_sim = "catkit2.services.thorlabs_mff101_sim.thorlabs_mff101_sim" +thorlabs_pm = "catkit2.services.thorlabs_pm.thorlabs_pm" +thorlabs_pm_sim = "catkit2.services.thorlabs_pm_sim.thorlabs_pm_sim" +thorlabs_tsp01 = "catkit2.services.thorlabs_tsp01.thorlabs_tsp01" +thorlabs_tsp01_sim = "catkit2.services.thorlabs_tsp01_sim.thorlabs_tsp01_sim" +web_power_switch = "catkit2.services.web_power_switch.web_power_switch" +web_power_switch_sim = "catkit2.services.web_power_switch_sim.web_power_switch_sim" +zwo_camera = "catkit2.services.zwo_camera.zwo_camera" + +[project.entry-points."catkit2.proxies"] +bmc_dm = "catkit2.testbed.proxies.bmc_dm:BmcDmProxy" +camera = "catkit2.testbed.proxies.camera:CameraProxy" +deformable_mirror = "catkit2.testbed.proxies.deformable_mirror:DeformableMirrorProxy" +flip_mount = "catkit2.testbed.proxies.flip_mount:FlipMountProxy" +newport_picomotor = "catkit2.testbed.proxies.newport_picomotor:NewportPicomotorProxy" +newport_xps_q8 = "catkit2.testbed.proxies.newport_xps:NewportXpsQ8Proxy" +ni_daq = "catkit2.testbed.proxies.ni_daq:NiDaqProxy" +nkt_superk = "catkit2.testbed.proxies.nkt_superk:NktSuperkProxy" +oceanoptics_spectrometer = "catkit2.testbed.proxies.oceanoptics_spectrometer:OceanopticsSpectroProxy" +thorlabs_cube_motor_kinesis = "catkit2.testbed.proxies.thorlabs_cube_motor_kinesis:ThorlabsCubeMotorKinesisProxy" +thorlabs_mcls1 = "catkit2.testbed.proxies.thorlabs_mcls1:ThorlabsMcls1" +web_power_switch = "catkit2.testbed.proxies.web_power_switch:WebPowerSwitchProxy" diff --git a/setup.py b/setup.py deleted file mode 100644 index 450a651f..00000000 --- a/setup.py +++ /dev/null @@ -1,209 +0,0 @@ -import setuptools -import os -import re -import sys -import glob -import shutil -import platform -import subprocess - -from distutils.version import LooseVersion -from setuptools import setup, Extension -from setuptools.command.build_ext import build_ext -from distutils.spawn import find_executable - -# Find the Protocol Compiler. -if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']): - protoc = os.environ['PROTOC'] -else: - protoc = find_executable("protoc") - -if protoc is None: - sys.stderr.write( - "protoc is not installed nor found in ../src. Please compile it " - "or install the binary package.\n") - sys.exit(-1) - -def generate_protos(source_dir): - '''Invokes the Protobuf Compiler to generate C++ and Python source files - from all .proto files in the proto directory. Does nothing if the output - already exists and is newer than the input. - ''' - proto_path = os.path.join(source_dir, 'proto') - - files = glob.glob(os.path.join(proto_path, '**.proto')) - files = [os.path.relpath(f, proto_path) for f in files] - - python_path = os.path.join(source_dir, 'catkit2', 'proto') - cpp_path = os.path.join(source_dir, 'catkit_core', 'proto') - - os.makedirs(python_path, exist_ok=True) - os.makedirs(cpp_path, exist_ok=True) - - for f in files: - src_time = os.path.getmtime(os.path.join(proto_path, f)) - - python_output = os.path.splitext(os.path.join(python_path, f))[0] + '_pb2.py' - cpp_h_output = os.path.splitext(os.path.join(cpp_path, f))[0] + '.pb.h' - cpp_cc_output = os.path.splitext(os.path.join(cpp_path, f))[0] + '.pb.cc' - - try: - dest_time_python = os.path.getmtime(python_output) - dest_time_cpp_h = os.path.getmtime(cpp_h_output) - dest_time_cpp_cc = os.path.getmtime(cpp_cc_output) - - should_compile = min(dest_time_python, dest_time_cpp_h, dest_time_cpp_cc) < src_time - except OSError: - # Either the Python or C++ did not exist. - should_compile = True - - if should_compile: - protoc_command = [ - protoc, - '--proto_path', proto_path, - '--python_out', python_path, - '--cpp_out', cpp_path, - f] - - if subprocess.run(protoc_command).returncode != 0: - sys.exit(-1) - -class CMakeExtension(Extension): - def __init__(self, name, sourcedir=''): - Extension.__init__(self, name, sources=[]) - self.sourcedir = os.path.abspath(sourcedir) - -class CMakeBuild(build_ext): - def run(self): - try: - out = subprocess.check_output(['cmake', '--version']) - except OSError: - raise RuntimeError( - "CMake must be installed to build the following extensions: " + - ", ".join(e.name for e in self.extensions)) - - if platform.system() == "Windows": - cmake_version = LooseVersion(re.search(r'version\s*([\d.]+)', - out.decode()).group(1)) - if cmake_version < '3.1.0': - raise RuntimeError("CMake >= 3.1.0 is required on Windows") - - for ext in self.extensions: - self.build_extension(ext) - - def build_extension(self, ext): - cmake_args = ['-DPYTHON_EXECUTABLE=' + sys.executable] - - cfg = 'Debug' if self.debug else 'Release' - build_args = ['--config', cfg] - - if platform.system() == "Windows": - if sys.maxsize > 2**32: - cmake_args += ['-A', 'x64'] - else: - cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] - build_args += ['-j', '4'] - - env = os.environ.copy() - env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format(env.get('CXXFLAGS', ''), self.distribution.get_version()) - - install_dir = os.path.join(ext.sourcedir, 'build') - - os.makedirs(self.build_temp, exist_ok=True) - os.makedirs(install_dir, exist_ok=True) - - print('Compiling protobuffers...') - generate_protos(ext.sourcedir) - - subprocess.check_call(['cmake', ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env) - subprocess.check_call(['cmake', '--build', '.'] + build_args, cwd=self.build_temp) - subprocess.check_call(['cmake', '--install', '.', '--prefix', install_dir], cwd=self.build_temp) - - for f in glob.glob(os.path.join(install_dir, 'lib', 'catkit_bindings*')): - shutil.copy(f, os.path.join(ext.sourcedir, 'catkit2')) - -with open("README.md", "r") as f: - long_description = f.read() - -setup( - name="catkit2", - version="0.0.1", - author="Emiel Por", - author_email="epor@stsci.edu", - description="A library for controlling testbed hardware", - long_description=long_description, - long_description_content_type="text/markdown", - packages=setuptools.find_packages(), - package_data={'catkit2': ['user_interface/assets/*']}, - classifiers=[ - "Programming Language :: Python :: 3" - ], - ext_modules=[CMakeExtension('catkit_bindings')], - python_requires='>=3.6', - cmdclass=dict(build_ext=CMakeBuild), - zip_safe=False, - install_requires=[], - entry_points={ - 'catkit2.services': [ - 'aimtti_plp_device = catkit2.services.aimtti_plp_device.aimtti_plp_device', - 'aimtti_plp_device_sim = catkit2.services.aimtti_plp_device_sim.aimtti_plp_device_sim', - 'allied_vision_camera = catkit2.services.allied_vision_camera.allied_vision_camera', - 'bmc_deformable_mirror_hardware = catkit2.services.bmc_deformable_mirror_hardware.bmc_deformable_mirror_hardware', - 'bmc_deformable_mirror_sim = catkit2.services.bmc_deformable_mirror_sim.bmc_deformable_mirror_sim', - 'bmc_dm = catkit2.services.bmc_dm.bmc_dm', - 'bmc_dm_sim = catkit2.services.bmc_dm_sim.bmc_dm_sim', - 'camera_sim = catkit2.services.camera_sim.camera_sim', - 'dummy_camera = catkit2.services.dummy_camera.dummy_camera', - 'empty_service = catkit2.services.empty_service.empty_service', - 'flir_camera = catkit2.services.flir_camera.flir_camera', - 'hamamatsu_camera = catkit2.services.hamamatsu_camera.hamamatsu_camera', - 'newport_picomotor = catkit2.services.newport_picomotor.newport_picomotor', - 'newport_picomotor_sim = catkit2.services.newport_picomotor_sim.newport_picomotor_sim', - 'newport_xps_q8 = catkit2.services.newport_xps_q8.newport_xps_q8', - 'newport_xps_q8_sim = catkit2.services.newport_xps_q8_sim.newport_xps_q8_sim', - 'ni_daq = catkit2.services.ni_daq.ni_daq', - 'ni_daq_sim = catkit2.services.ni_daq_sim.ni_daq_sim', - 'nkt_superk = catkit2.services.nkt_superk.nkt_superk', - 'nkt_superk_sim = catkit2.services.nkt_superk_sim.nkt_superk_sim', - 'oceanoptics_spectrometer = catkit2.services.oceanoptics_spectrometer.oceanoptics_spectrometer', - 'oceanoptics_spectrometer_sim = catkit2.services.oceanoptics_spectrometer_sim.oceanoptics_spectrometer_sim', - 'omega_ithx_w3 = catkit2.services.omega_ithx_w3.omega_ithx_w3', - 'omega_ithx_w3_sim = catkit2.services.omega_ithx_w3_sim.omega_ithx_w3_sim', - 'safety_manual_check = catkit2.services.safety_manual_check.safety_manual_check', - 'safety_monitor = catkit2.services.safety_monitor.safety_monitor', - 'simple_simulator = catkit2.services.simple_simulator.simple_simulator', - 'snmp_ups = catkit2.services.snmp_ups.snmp_ups', - 'snmp_ups_sim = catkit2.services.snmp_ups_sim.snmp_ups_sim', - 'thorlabs_cld101x = catkit2.services.thorlabs_cld101x.thorlabs_cld101x', - 'thorlabs_cld101x_sim = catkit2.services.thorlabs_cld101x_sim.thorlabs_cld101x_sim', - 'thorlabs_cube_motor_kinesis = catkit2.services.thorlabs_cube_motor_kinesis.thorlabs_cube_motor_kinesis', - 'thorlabs_cube_motor_kinesis_sim = catkit2.services.thorlabs_cube_motor_kinesis_sim.thorlabs_cube_motor_kinesis_sim', - 'thorlabs_fw102c = catkit2.services.thorlabs_fw102c.thorlabs_fw102c', - 'thorlabs_mcls1 = catkit2.services.thorlabs_mcls1.thorlabs_mcls1', - 'thorlabs_mcls1_sim = catkit2.services.thorlabs_mcls1_sim.thorlabs_mcls1_sim', - 'thorlabs_mff101 = catkit2.services.thorlabs_mff101.thorlabs_mff101', - 'thorlabs_mff101_sim = catkit2.services.thorlabs_mff101_sim.thorlabs_mff101_sim', - 'thorlabs_pm = catkit2.services.thorlabs_pm.thorlabs_pm', - 'thorlabs_pm_sim = catkit2.services.thorlabs_pm_sim.thorlabs_pm_sim', - 'thorlabs_tsp01 = catkit2.services.thorlabs_tsp01.thorlabs_tsp01', - 'thorlabs_tsp01_sim = catkit2.services.thorlabs_tsp01_sim.thorlabs_tsp01_sim', - 'web_power_switch = catkit2.services.web_power_switch.web_power_switch', - 'web_power_switch_sim = catkit2.services.web_power_switch_sim.web_power_switch_sim', - 'zwo_camera = catkit2.services.zwo_camera.zwo_camera', - ], - 'catkit2.proxies': [ - 'bmc_dm = catkit2.testbed.proxies.bmc_dm:BmcDmProxy', - 'camera = catkit2.testbed.proxies.camera:CameraProxy', - 'deformable_mirror = catkit2.testbed.proxies.deformable_mirror:DeformableMirrorProxy', - 'flip_mount = catkit2.testbed.proxies.flip_mount:FlipMountProxy', - 'newport_picomotor = catkit2.testbed.proxies.newport_picomotor:NewportPicomotorProxy', - 'newport_xps_q8 = catkit2.testbed.proxies.newport_xps:NewportXpsQ8Proxy', - 'ni_daq = catkit2.testbed.proxies.ni_daq:NiDaqProxy', - 'nkt_superk = catkit2.testbed.proxies.nkt_superk:NktSuperkProxy', - 'oceanoptics_spectrometer = catkit2.testbed.proxies.oceanoptics_spectrometer:OceanopticsSpectroProxy', - 'thorlabs_cube_motor_kinesis = catkit2.testbed.proxies.thorlabs_cube_motor_kinesis:ThorlabsCubeMotorKinesisProxy', - 'thorlabs_mcls1 = catkit2.testbed.proxies.thorlabs_mcls1:ThorlabsMcls1', - 'web_power_switch = catkit2.testbed.proxies.web_power_switch:WebPowerSwitchProxy' - ] - } -) From 046b87b459ae6ba7e75df0f19937a78a40fda12f Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 18:02:31 -0800 Subject: [PATCH 07/12] Update CI with new installation command. --- .github/workflows/docs.yml | 5 +---- .github/workflows/testing.yml | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7165c981..4c7470ff 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -30,12 +30,9 @@ jobs: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10 - name: Install dependencies run: | - cd extern/ - bash ./download.sh - cd ../ conda env create --name build-env --file environment.yml conda activate build-env - python setup.py develop + pip install . shell: bash -l {0} - name: Build documentation run: | diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1d116c44..72c7a87b 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -32,9 +32,6 @@ jobs: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10 - name: Install dependencies run: | - cd extern/ - bash ./download.sh - cd ../ conda env create --name ci-env --file environment.yml shell: bash -l {0} - name: Print debugging information @@ -45,7 +42,7 @@ jobs: - name: Install catkit2 run: | conda activate ci-env - python setup.py develop + pip install -v -e . shell: bash -l {0} - name: Run tests run: | From 8a1f860ebc76732d4b2fc40d3e611144bb1a87cf Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Mon, 23 Dec 2024 18:07:15 -0800 Subject: [PATCH 08/12] Update installation instructions. --- README.md | 30 +++++++++++------------------- docs/installation.rst | 16 +++------------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 949b1268..ce197e20 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ The Control and Automation for Testbeds Kit 2 (CATKit2) --------------------- -CATKit2 is a toolkit for hardware controls that has been developed at the Space Telescope Science Institute. -It provides a general infrastructure to control hardware and synchronize devices. +CATKit2 is a toolkit for hardware controls that has been developed at the Space Telescope Science Institute. +It provides a general infrastructure to control hardware and synchronize devices. -This package was developed for use on the High-contrast Imager for Complex Apertures Testbed (HiCAT) for +This package was developed for use on the High-contrast Imager for Complex Apertures Testbed (HiCAT) for developing technologies relevant to direct imaging of exoplanets in astronomy in the laboratory. This is an open-source package, but it is not actively supported. Use at your own risk. @@ -66,27 +66,19 @@ Installation This procedure requires a pre-installed C++ compiler. - On Windows, you can for example install the Visual Studio Compiler, either by installing the Build Tools, or by installing the full IDE with compiler (the community edition is free). -- On MacOS, nothing should be needed, but some machines require Xcode to be installed. It does install components on first startup, so it is recommended to start XCode on your mac if you have never used it (and accept the license agreement of XCode, which is required). -- XCode 15 (Sonoma and higher) introduced some changes in the compiler location, which require the following environment variable update: +- On MacOS, nothing should be needed, but some machines require Xcode to be installed. It does install components on first startup, so it is recommended to start XCode on your mac if you have never used it (and accept the license agreement of XCode, which is required). +- XCode 15 (Sonoma and higher) introduced some changes in the compiler location, which require the following environment variable update: ``` export SDKROOT=$(xcrun --sdk macosx --show-sdk-path) ``` -The following will download all third-party C++ dependencies and create a new Conda environment with the required Python packages. The download can be performed on a separate machine with internet connectivity and the resulting folders can be copy-pasted in the extern folder on the machine without internet connectivity. +The following will create a new Conda environment with the required C++ and Python packages. You will need to install drivers and SDKs for some devices yourself to use those devices. -You will need to install drivers and SDKs for some devices yourself to use those devices. - -``` -cd catkit2 -cd extern -./download.sh -cd .. -``` For installation on Apple Silicon with python=3.7, you need to follow these steps: ``` -conda create --name catkit2 -conda activate catkit2 -conda config --env --set subdir osx-64 +conda create --name catkit2 +conda activate catkit2 +conda config --env --set subdir osx-64 conda env update --file environment.yml ``` @@ -96,8 +88,8 @@ conda env create --file environment.yml conda activate catkit2 ``` -Finally install the package using: +Finally install the package using: ``` python setup.py develop cd .. -``` \ No newline at end of file +``` diff --git a/docs/installation.rst b/docs/installation.rst index c9163f2d..7ddb001f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,19 +1,9 @@ Installation ============ -Catkit2 consists of a core C++ library and a Python package that wraps this library. It also requires a number of C++ third party libraries to facilitate JSON encoding and decoding, Python bindings, linear algebra and high-speed communication over sockets. Compilation requires a C++ compiler conforming to the C++20 standard. Catkit2 provides scripts to automate downloading and installation of its dependencies and main library. +Catkit2 consists of a core C++ library and a Python package that wraps this library. It also requires a number of C++ third party libraries to facilitate JSON encoding and decoding, Python bindings, linear algebra and high-speed communication over sockets. Compilation requires a C++ compiler conforming to the C++20 standard. Catkit2 performs installation of the core library and Python package using CMake and Conda. -The following will download all third-party C++ dependencies: - -.. code-block:: bash - - cd catkit2 - cd extern - ./download.sh - -These downloads can be performed on a separate machine with internet connectivity, in case the machine on which the testbed is run does not have an (unfirewalled) internet connection. After downloading, the resulting folders can be copy-pasted in the extern folder on the machine without internet connectivity. - -The following will install all downloaded dependencies and create the Conda environment for catkit2. +The following will install all dependencies and create the Conda environment for catkit2. .. code-block:: bash @@ -25,7 +15,7 @@ At this point, all C++ and Python dependencies of catkit2 should have been downl .. code-block:: bash - python setup.py develop + pip install -e . This will use the default CMake generator to compile catkit_core and its Python bindings. If the default generator doesn't support 64bit compilation, this step will return an error and you will need to specify a default generator to use by setting the CMAKE_GENERATOR environment variable to your preferred generator. You can list all generators installed on your machine with cmake --help. You will have to restart your terminal after changing your environment variables as usual. From 31ead8699d28c79eaddb7f2b40cd1f38916d2a2d Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Tue, 24 Dec 2024 23:12:58 -0800 Subject: [PATCH 09/12] Move bindings to catkit2 directory. --- CMakeLists.txt | 2 +- {catkit_bindings => catkit2}/CMakeLists.txt | 6 +++--- {catkit_bindings => catkit2}/bindings.cpp | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename {catkit_bindings => catkit2}/CMakeLists.txt (83%) rename {catkit_bindings => catkit2}/bindings.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 837b3fc5..e2e48a2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,5 +14,5 @@ list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}") list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}/Library") add_subdirectory(catkit_core) -add_subdirectory(catkit_bindings) +add_subdirectory(catkit2) add_subdirectory(benchmarks) diff --git a/catkit_bindings/CMakeLists.txt b/catkit2/CMakeLists.txt similarity index 83% rename from catkit_bindings/CMakeLists.txt rename to catkit2/CMakeLists.txt index dc7f0563..8968a036 100644 --- a/catkit_bindings/CMakeLists.txt +++ b/catkit2/CMakeLists.txt @@ -28,15 +28,15 @@ set(PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../proto/tracing.proto ) -set(PYTHON_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../catkit2/proto) +set(PYTHON_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/./proto/) add_custom_target( catkit2_python_protobuf ALL COMMAND ${Protobuf_PROTOC_EXECUTABLE} - --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/../proto + --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/../proto/ --python_out=${PYTHON_OUT_DIR} ${PROTO_FILES} DEPENDS ${PROTO_FILES} ) -install(TARGETS catkit_bindings LIBRARY DESTINATION catkit2/) +install(TARGETS catkit_bindings LIBRARY DESTINATION "${SKBUILD_PLATLIB_DIR}/catkit2/") diff --git a/catkit_bindings/bindings.cpp b/catkit2/bindings.cpp similarity index 100% rename from catkit_bindings/bindings.cpp rename to catkit2/bindings.cpp From 46b38ceaab6648f7a5c2c8fe073aa0a2da446c0c Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Tue, 24 Dec 2024 23:14:34 -0800 Subject: [PATCH 10/12] Update CMake minimum version requirement. --- CMakeLists.txt | 2 +- benchmarks/CMakeLists.txt | 2 +- catkit2/CMakeLists.txt | 2 +- catkit_core/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e2e48a2b..25bb2178 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.21) project(catkit2) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index a76ebf1e..a345f76e 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.21) project(catkit2) diff --git a/catkit2/CMakeLists.txt b/catkit2/CMakeLists.txt index 8968a036..eec0dcac 100644 --- a/catkit2/CMakeLists.txt +++ b/catkit2/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.21) project(catkit_bindings) diff --git a/catkit_core/CMakeLists.txt b/catkit_core/CMakeLists.txt index 7918da90..df475cbe 100644 --- a/catkit_core/CMakeLists.txt +++ b/catkit_core/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.21) +cmake_minimum_required(VERSION 3.5) project(catkit_core) From 13ba399526dabcffc45f0f59c73db5b6ef865563 Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Tue, 24 Dec 2024 23:15:30 -0800 Subject: [PATCH 11/12] Add CMake config and targets file. --- catkit_core/CMakeLists.txt | 30 +++++++++++++++++---- catkit_core/cmake/CatkitCoreConfig.cmake.in | 2 ++ 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 catkit_core/cmake/CatkitCoreConfig.cmake.in diff --git a/catkit_core/CMakeLists.txt b/catkit_core/CMakeLists.txt index df475cbe..c70e6351 100644 --- a/catkit_core/CMakeLists.txt +++ b/catkit_core/CMakeLists.txt @@ -69,21 +69,41 @@ protobuf_generate( ../proto/tracing.proto ) target_include_directories(catkit_core PUBLIC "$") +# Generate and install CatkitCoreConfig.cmake +include(CMakePackageConfigHelpers) -# Add install files -install(TARGETS catkit_core +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CatkitCoreConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/CatkitCoreConfig.cmake" + INSTALL_DESTINATION lib/cmake/catkit_core +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/CatkitCoreConfig.cmake" + DESTINATION "${SKBUILD_PLATLIB_DIR}/cmake/catkit_core" +) + +install( + TARGETS catkit_core + EXPORT CatkitCoreTargets LIBRARY DESTINATION lib - PUBLIC_HEADER DESTINATION include +) + +# Generate and install CatkitCoreTargets.cmake +install( + EXPORT CatkitCoreTargets + FILE CatkitCoreTargets.cmake + DESTINATION "${SKBUILD_PLATLIB_DIR}/cmake/catkit_core" ) install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - DESTINATION include + DESTINATION "${SKBUILD_HEADERS_DIR}" FILES_MATCHING PATTERN "*.h" PATTERN "*.inl" ) install(DIRECTORY "${PROTO_BINARY_DIR}" - DESTINATION include/catkit_core + DESTINATION "${SKBUILD_HEADERS_DIR}/catkit_core" FILES_MATCHING PATTERN "*.h" ) diff --git a/catkit_core/cmake/CatkitCoreConfig.cmake.in b/catkit_core/cmake/CatkitCoreConfig.cmake.in new file mode 100644 index 00000000..3f3e1e38 --- /dev/null +++ b/catkit_core/cmake/CatkitCoreConfig.cmake.in @@ -0,0 +1,2 @@ +@PACKAGE_INIT@ +include("${CMAKE_CURRENT_LIST_DIR}/CatkitCoreTargets.cmake") From dc7e1ee6464c405b7a0e530eff2817f0df6ef73f Mon Sep 17 00:00:00 2001 From: Emiel Por Date: Tue, 24 Dec 2024 23:25:13 -0800 Subject: [PATCH 12/12] Remove version pin on pybind11_json. --- environment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 02cfe02c..3de5fd88 100644 --- a/environment.yml +++ b/environment.yml @@ -31,7 +31,7 @@ dependencies: - conda-forge::pybind11==2.13.6 - conda-forge::eigen==3.4.0 - conda-forge::nlohmann_json==3.9.1 - - conda-forge::pybind11_json==0.2.15 + - conda-forge::pybind11_json - pip - cmake>=3.0.0 - doxygen