diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..a98e6213 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,43 @@ +name: libuca tests + +on: + push: + +permissions: + contents: read + +jobs: + build: + strategy: + matrix: + os: [ubuntu-22.04, ubuntu-20.04, windows-latest] + fail-fast: false + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - name: get conan + uses: turtlebrowser/get-conan@v1.0 + - name: create conan profile + run: | + pip install --force-reinstall -v "conan==1.59.0" + conan profile new default --detect + - name: build + run: | + mkdir build + cd build + conan install .. -o libuca:shared=True --build missing + cmake .. + cmake --build . + cmake --install . + - name: build + uses: actions/upload-artifact@v3 + with: + name: build_folder + path: build + - name: run test-mock + run: | + build\bin\test-mock.exe + - name: run test-ring-buffer + run: | + build\bin\test-ring-buffer diff --git a/CMakeLists.txt b/CMakeLists.txt index 350091a4..0d811d8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,12 @@ -cmake_minimum_required(VERSION 2.6) - -if (POLICY CMP0053) -cmake_policy(SET CMP0053 OLD) -endif () +cmake_minimum_required(VERSION 3.11) +project(uca C) -if (POLICY CMP0054) -cmake_policy(SET CMP0054 OLD) -endif () +if (NOT EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) + message(FATAL_ERROR "Please run 'conan install' first!") +endif() +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -project(uca C) +conan_basic_setup(TARGETS) #{{{ CMake list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") @@ -35,7 +33,7 @@ set(UCA_ABI_VERSION "2") macro(create_enums prefix template_prefix header_list) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.h - COMMAND ${GLIB2_MKENUMS} + COMMAND python ${GLIB2_MKENUMS} ARGS --template ${template_prefix}.h.template ${header_list} > ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.h @@ -44,7 +42,7 @@ macro(create_enums prefix template_prefix header_list) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.c - COMMAND ${GLIB2_MKENUMS} + COMMAND python ${GLIB2_MKENUMS} ARGS --template ${template_prefix}.c.template ${header_list} > ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.c @@ -55,7 +53,7 @@ macro(create_enums prefix template_prefix header_list) endmacro() #}}} #{{{ Configure -include(PkgConfigVars) +#include(PkgConfigVars) include(GNUInstallDirs) set(CMAKE_INSTALL_GIRDIR "${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0") @@ -67,39 +65,24 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/package.sh.in ${CMAKE_CURRENT_BINARY_DIR}/package.sh) #}}} #{{{ Common dependencies -find_package(PkgConfig) find_program(GLIB2_MKENUMS glib-mkenums REQUIRED) -pkg_check_modules(GLIB2 glib-2.0>=2.38 REQUIRED) -pkg_check_modules(GOBJECT2 gobject-2.0>=2.38 REQUIRED) -pkg_check_modules(GMODULE2 gmodule-2.0>=2.38 REQUIRED) -pkg_check_modules(GIO2 gio-2.0>=2.38 REQUIRED) set(GLIB_VERSION_MIN_REQUIRED "GLIB_VERSION_2_38") set(GLIB_VERSION_MAX_ALLOWED "GLIB_VERSION_2_38") link_directories(${GLIB2_LIBRARY_DIRS}) #}}} -#{{{ Common includes -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${GLIB2_INCLUDE_DIRS} - ${GOBJECT2_INCLUDE_DIRS} - ${GMODULE2_INCLUDE_DIRS} - ${GIO2_INCLUDE_DIRS}) -#}}} + #{{{ Common variables -set(UCA_DEPS - ${GLIB2_LIBRARIES} - ${GOBJECT2_LIBRARIES} - ${GMODULE2_LIBRARIES} - ${GIO2_LIBRARIES}) set(UCA_ENUM_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/src/uca-camera.h ${CMAKE_CURRENT_SOURCE_DIR}/plugins/pco/uca-pco-camera.h) #}}} #{{{ Common definitions -add_definitions("-std=c99 -Wall -fPIC") +if (GNU) + add_definitions("-std=c99 -Wall -fPIC") +endif() #}}} #{{{ Subdirectories add_subdirectory(src) diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index cb2d9207..7f139872 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -1,4 +1,2 @@ -cmake_minimum_required(VERSION 2.6) - -add_subdirectory(gui) +#add_subdirectory(gui) add_subdirectory(tools) diff --git a/bin/tools/CMakeLists.txt b/bin/tools/CMakeLists.txt index 3f0044b8..c17a7723 100644 --- a/bin/tools/CMakeLists.txt +++ b/bin/tools/CMakeLists.txt @@ -1,5 +1,3 @@ -cmake_minimum_required(VERSION 2.6) - #{{{ Variables set(libs uca) #}}} @@ -23,11 +21,16 @@ set(BINARIES "benchmark" "gen-doc" "info") foreach (BINARY ${BINARIES}) add_executable(uca-${BINARY} ${BINARY}.c common.c) - target_link_libraries(uca-${BINARY} ${libs}) + target_link_libraries(uca-${BINARY} PUBLIC ${libs}) endforeach () add_executable(uca-grab grab.c common.c) -target_link_libraries(uca-grab ${libs} m) +target_link_libraries(uca-grab PUBLIC ${libs}) + +if (GNU) + target_link_libraries(uca-grab PUBLIC m) +endif() + install(TARGETS uca-benchmark uca-grab uca-gen-doc uca-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 00000000..ab1624d0 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,35 @@ +from conans import ConanFile, CMake, tools + + +class UcaConan(ConanFile): + name = "libuca" + version = "2.3.0" + license = "LGPL-2.1" + author = "Marius Elvert marius.elvert@softwareschneiderei.de" + url = "https://github.com/ufo-kit/libuca" + description = "GLib-based C library for unified camera access ." + topics = ("utilities",) + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False]} + default_options = "shared=False" + generators = "cmake" + exports_sources = "src/*", "include/*", "test/*", "bin/*", "CMakeLists.txt", "package.sh.in" + requires = "glib/2.68.1", + + def _configured_cmake(self): + cmake = CMake(self) + cmake.configure(source_folder=".") + return cmake + + def build(self): + self._configured_cmake().build() + + def package(self): + self._configured_cmake().install() + + def package_info(self): + self.cpp_info.libs = ["uca"] + + def imports(self): + self.copy("*.dll", "bin", "bin") + self.copy("*.dylib", "lib", "lib") diff --git a/plugins/mock/CMakeLists.txt b/plugins/mock/CMakeLists.txt index 48a11beb..8236bbd5 100644 --- a/plugins/mock/CMakeLists.txt +++ b/plugins/mock/CMakeLists.txt @@ -13,7 +13,10 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../package-plugin.sh.in add_library(ucamock SHARED uca-mock-camera.c) -target_link_libraries(ucamock uca m ${UCA_DEPS}) +target_link_libraries(ucamock uca ${UCA_DEPS}) +if (NOT WIN32) + target_link_libraries(ucamock m) +endif() install(TARGETS ucamock LIBRARY DESTINATION ${CMAKE_INSTALL_PLUGINDIR} diff --git a/plugins/mock/uca-mock-camera.c b/plugins/mock/uca-mock-camera.c index 8d7aed5d..e49ff3c6 100644 --- a/plugins/mock/uca-mock-camera.c +++ b/plugins/mock/uca-mock-camera.c @@ -19,7 +19,6 @@ #include #include #include -#include #include "uca-mock-camera.h" #define UCA_MOCK_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_MOCK_CAMERA, UcaMockCameraPrivate)) @@ -262,13 +261,6 @@ mock_grab_func(gpointer data) return NULL; } -static void -handle_sigusr1 (int signum) -{ - g_mutex_lock (&signal_mutex); - g_cond_signal (&signal_cond); - g_mutex_unlock (&signal_mutex); -} static void uca_mock_camera_start_recording(UcaCamera *camera, GError **error) @@ -278,7 +270,6 @@ uca_mock_camera_start_recording(UcaCamera *camera, GError **error) g_return_if_fail(UCA_IS_MOCK_CAMERA(camera)); priv = UCA_MOCK_CAMERA_GET_PRIVATE(camera); - signal (SIGUSR1, handle_sigusr1); /* TODO: check that roi_x + roi_width < priv->width */ priv->dummy_data = (guint8 *) g_malloc0(priv->roi_width * priv->roi_height * priv->bytes); @@ -356,12 +347,6 @@ uca_mock_camera_grab (UcaCamera *camera, gpointer data, GError **error) if (trigger_source == UCA_CAMERA_TRIGGER_SOURCE_SOFTWARE) g_free (g_async_queue_pop (priv->trigger_queue)); - if (trigger_source == UCA_CAMERA_TRIGGER_SOURCE_EXTERNAL) { - /* wait for signal to arrive */ - g_mutex_lock (&signal_mutex); - g_cond_wait (&signal_cond, &signal_mutex); - g_mutex_unlock (&signal_mutex); - } g_usleep (G_USEC_PER_SEC * exposure_time); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2d047003..76a6bca1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,3 @@ -cmake_minimum_required(VERSION 2.6) -project(uca C) - #{{{ Sources set(uca_SRCS uca-camera.c @@ -24,26 +21,40 @@ if (CI_INSTALL_PREFIX) endif() #}}} #{{{ Target -include_directories(${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}) - -add_library(uca SHARED - ${uca_SRCS} - ${CMAKE_CURRENT_BINARY_DIR}/uca-enums.c) +add_library(uca STATIC + ${uca_SRCS} + ${CMAKE_CURRENT_BINARY_DIR}/uca-enums.c) set_target_properties(uca PROPERTIES - VERSION ${UCA_VERSION_STRING} - SOVERSION ${UCA_ABI_VERSION}) + VERSION ${UCA_VERSION_STRING} + SOVERSION ${UCA_ABI_VERSION}) + +target_include_directories(uca + PUBLIC . + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries(uca + PUBLIC CONAN_PKG::glib) -target_link_libraries(uca ${UCA_DEPS}) #}}} #{{{ Python -pkg_check_modules(PYTHON python3-embed) - -if (NOT PYTHON_FOUND) - pkg_check_modules(PYTHON python3) -endif () +#TODO: Reenable +#option(WITH_PYTHON_MULTITHREADING "Enable Python multithreading support" ON) +#pkg_check_modules(PYTHON python) +# +#if (PYTHON_FOUND) +# +# if (WITH_PYTHON_MULTITHREADING) +# include_directories(${PYTHON_INCLUDE_DIRS}) +# target_link_libraries(uca ${PYTHON_LIBRARIES}) +# endif () +#endif () +#pkg_check_modules(PYTHON python3-embed) + +#if (NOT PYTHON_FOUND) + # pkg_check_modules(PYTHON python3) +#endif () if (PYTHON_FOUND) option(WITH_PYTHON_MULTITHREADING "Enable Python multithreading support" ON) @@ -56,54 +67,54 @@ endif () #}}} #{{{ GObject introspection -pkg_check_modules(GOBJECT_INTROSPECTION gobject-introspection-1.0) - -if (GOBJECT_INTROSPECTION_FOUND) - option(WITH_GIR "Build introspection files" ON) - - if (WITH_GIR) - pkg_check_variable(gobject-introspection-1.0 g_ir_scanner) - pkg_check_variable(gobject-introspection-1.0 g_ir_compiler) - - set(GIR_PREFIX "Uca-${UCA_ABI_VERSION}.0") - set(GIR_XML "${GIR_PREFIX}.gir") - set(GIR_TYPELIB "${GIR_PREFIX}.typelib") - set(_gir_input) - - foreach(_src ${uca_SRCS} ${uca_HDRS}) - list(APPEND _gir_input "${CMAKE_CURRENT_SOURCE_DIR}/${_src}") - endforeach() - - list(APPEND _gir_input "${CMAKE_CURRENT_BINARY_DIR}/uca-enums.h") - list(APPEND _gir_input "${CMAKE_CURRENT_BINARY_DIR}/uca-enums.c") - - add_custom_command(OUTPUT ${GIR_XML} - COMMAND ${GOBJECT_INTROSPECTION_1.0_G_IR_SCANNER} - --namespace=Uca - --nsversion=${UCA_ABI_VERSION}.0 - --library=uca - --no-libtool - --include=GObject-2.0 - --include=GModule-2.0 - --output ${GIR_XML} - --warn-all - --quiet - ${_gir_input} - DEPENDS ${uca_SRCS} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - - add_custom_command(OUTPUT ${GIR_TYPELIB} - COMMAND ${GOBJECT_INTROSPECTION_1.0_G_IR_COMPILER} - -o ${GIR_TYPELIB} - ${GIR_XML} - DEPENDS ${GIR_XML} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - - add_custom_target(gir ALL DEPENDS ${GIR_XML} ${GIR_TYPELIB}) - add_dependencies(gir uca) - - endif() -endif() +#pkg_check_modules(GOBJECT_INTROSPECTION gobject-introspection-1.0) +# +#if (GOBJECT_INTROSPECTION_FOUND) +# option(WITH_GIR "Build introspection files" ON) +# +# if (WITH_GIR) +# pkg_check_variable(gobject-introspection-1.0 g_ir_scanner) +# pkg_check_variable(gobject-introspection-1.0 g_ir_compiler) +# +# set(GIR_PREFIX "Uca-${UCA_ABI_VERSION}.0") +# set(GIR_XML "${GIR_PREFIX}.gir") +# set(GIR_TYPELIB "${GIR_PREFIX}.typelib") +# set(_gir_input) +# +# foreach(_src ${uca_SRCS} ${uca_HDRS}) +# list(APPEND _gir_input "${CMAKE_CURRENT_SOURCE_DIR}/${_src}") +# endforeach() +# +# list(APPEND _gir_input "${CMAKE_CURRENT_BINARY_DIR}/uca-enums.h") +# list(APPEND _gir_input "${CMAKE_CURRENT_BINARY_DIR}/uca-enums.c") +# +# add_custom_command(OUTPUT ${GIR_XML} +# COMMAND ${GOBJECT_INTROSPECTION_1.0_G_IR_SCANNER} +# --namespace=Uca +# --nsversion=${UCA_ABI_VERSION}.0 +# --library=uca +# --no-libtool +# --include=GObject-2.0 +# --include=GModule-2.0 +# --output ${GIR_XML} +# --warn-all +# --quiet +# ${_gir_input} +# DEPENDS ${uca_SRCS} +# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +# +# add_custom_command(OUTPUT ${GIR_TYPELIB} +# COMMAND ${GOBJECT_INTROSPECTION_1.0_G_IR_COMPILER} +# -o ${GIR_TYPELIB} +# ${GIR_XML} +# DEPENDS ${GIR_XML} +# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +# +# add_custom_target(gir ALL DEPENDS ${GIR_XML} ${GIR_TYPELIB}) +# add_dependencies(gir uca) +# +# endif() +#endif() #}}} #{{{ Installation install(TARGETS uca diff --git a/src/uca-camera.h b/src/uca-camera.h index 7fcd632b..438d35b9 100644 --- a/src/uca-camera.h +++ b/src/uca-camera.h @@ -172,13 +172,11 @@ void uca_camera_write (UcaCamera *camera, GError **error); gboolean uca_camera_grab (UcaCamera *camera, gpointer data, - GError **error) - __attribute__((nonnull (2))); + GError **error); gboolean uca_camera_readout (UcaCamera *camera, gpointer data, guint index, - GError **error) - __attribute__((nonnull (2))); + GError **error); void uca_camera_set_grab_func (UcaCamera *camera, UcaCameraGrabFunc func, gpointer user_data); diff --git a/src/uca-plugin-manager.c b/src/uca-plugin-manager.c index b4c70487..105e2dd2 100644 --- a/src/uca-plugin-manager.c +++ b/src/uca-plugin-manager.c @@ -48,7 +48,11 @@ struct _UcaPluginManagerPrivate { GList *funcs; }; -static const gchar *MODULE_PATTERN = "libuca([A-Za-z0-9]+)"; +#ifdef _WIN32 + static const gchar *MODULE_PATTERN = "uca([A-Za-z0-9]+)"; +#else + static const gchar *MODULE_PATTERN = "libuca([A-Za-z0-9]+)"; +#endif typedef GType (*GetTypeFunc) (void); @@ -199,7 +203,7 @@ find_camera_module_path (GList *search_paths, const gchar *name) GList *paths; #ifdef _WIN32 - modname = g_strdup_printf ("libuca%s.dll", name); + modname = g_strdup_printf ("uca%s.dll", name); #else modname = g_strdup_printf ("libuca%s.so", name); #endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0e8cfadd..952c00a1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,10 +1,8 @@ -cmake_minimum_required(VERSION 2.6) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gtester.xsl ${CMAKE_CURRENT_BINARY_DIR}/gtester.xsl) add_executable(test-mock test-mock.c) add_executable(test-ring-buffer test-ring-buffer.c) -target_link_libraries(test-mock uca ${UCA_DEPS}) -target_link_libraries(test-ring-buffer uca ${UCA_DEPS}) +target_link_libraries(test-mock PUBLIC uca) +target_link_libraries(test-ring-buffer PUBLIC uca)