diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..7268642 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,58 @@ +FROM debian:bookworm + +# Users and passwords +ARG BUILD_USER=build-user +ARG UID=1000 +ARG GID=1000 +ARG BUILD_USER_PWD=pwd + +RUN rm -rf /var/lib/apt/lists/* + +# Generate and set locale +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y locales \ + && sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ + && dpkg-reconfigure --frontend=noninteractive locales + +RUN locale-gen --purge en_US.UTF-8 +RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 +ENV LC_ALL en_US.UTF-8 +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US.UTF-8 + +# Package installs +RUN apt-get update && apt-get install -y \ + sudo \ + cmake \ + clang \ + clang-format \ + ninja-build \ + g++ \ + gdb \ + git \ + libgtest-dev \ + libgmock-dev \ + && rm -rf /var/lib/apt/lists/* + +# some utilities for runtime +RUN apt-get update && apt-get install -y \ + vim \ + net-tools \ + curl \ + zsh \ + wget \ + && rm -rf /var/lib/apt/lists/* + +# Create group and user +RUN groupadd --gid=$GID $BUILD_USER +RUN useradd --create-home --shell /bin/bash $BUILD_USER --uid=$UID -g $BUILD_USER +RUN echo "$BUILD_USER:$BUILD_USER_PWD" | chpasswd +RUN usermod -aG sudo $BUILD_USER +RUN echo "$BUILD_USER ALL=(ALL) ALL" >> /etc/sudoers +RUN mkdir -p /home/$BUILD_USER/farbot + +USER $BUILD_USER:$BUILD_USER +WORKDIR /home/build-user/farbot + +RUN wget -qO- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh | zsh || true +RUN sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="gentoo"/g' ~/.zshrc diff --git a/.devcontainer/build_docker_image.sh b/.devcontainer/build_docker_image.sh new file mode 100755 index 0000000..a0c5206 --- /dev/null +++ b/.devcontainer/build_docker_image.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +source "$DIR/common.sh" + +docker build --tag $DOCKER_IMAGE_TAG \ + --build-arg UID=$(id -u) \ + --build-arg GID=$(id -g) \ + --build-arg BUILD_USER=$BUILD_USER \ + $DIR +ret=$? + +if [[ -n "$(docker ps --all -q -f status=exited)" ]] ; then + docker rm $(docker ps --all -q -f status=exited) +fi + +if [[ -n "$(docker images --filter "dangling=true" -q --no-trunc)" ]] ; then + docker rmi $(docker images --filter "dangling=true" -q --no-trunc) +fi + +exit $ret diff --git a/.devcontainer/common.sh b/.devcontainer/common.sh new file mode 100644 index 0000000..8f73687 --- /dev/null +++ b/.devcontainer/common.sh @@ -0,0 +1,2 @@ +DOCKER_IMAGE_TAG="farbot" +BUILD_USER="build-user" diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..988547d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +{ + "name": "farbot", + "build": { + "dockerfile": "Dockerfile" + }, + "runArgs" : ["--rm", + "--network=host" + ], + "workspaceMount": "source=${localWorkspaceFolder},target=/home/build-user/farbot,type=bind,consistency=delegated", + "workspaceFolder": "/home/build-user/farbot", + "settings": { + "terminal.integrated.shell.linux": "/bin/zsh", + "terminal.integrated.detectLocale": "off" + }, + "extensions": [ + "eamodio.gitlens", + "ms-vscode.cpptools", + "twxs.cmake", + "ms-vscode.cmake-tools", + "xaver.clang-format", + "sonarsource.sonarlint-vscode" + ] + } diff --git a/.devcontainer/run_docker_image.sh b/.devcontainer/run_docker_image.sh new file mode 100755 index 0000000..d2d3eb3 --- /dev/null +++ b/.devcontainer/run_docker_image.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +REPO_DIR=$(readlink -f $SCRIPT_DIR/..) + + + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +source "$DIR/common.sh" + +docker run \ + --rm \ + --network=host \ + --mount type=bind,source=$HOME/.gitconfig,target=/home/build-user/.gitconfig \ + --mount type=bind,source=$HOME/.local,target=/home/$BUILD_USER/.local \ + --mount type=bind,source=$REPO_DIR,target=/home/$BUILD_USER/farbot \ + -ti $DOCKER_IMAGE_TAG:latest /bin/zsh + +## logging in to a running container: +## get id with: docker ps +## docker exec -it /bin/bash diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 5927210..2533403 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,10 +57,32 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -latomic") endif() +set(TARGET_NAME ${PROJECT_NAME}) +add_library(${TARGET_NAME} INTERFACE) +target_include_directories(${TARGET_NAME} INTERFACE + $ + $ +) +add_library(${PROJECT_NAME}::${TARGET_NAME} ALIAS ${TARGET_NAME}) + +option(BUILD_TESTS "Build tests" ON) +if(BUILD_TESTS) add_executable(gtestrunner test/test.cpp include/farbot/AsyncCaller.hpp include/farbot/RealtimeTraits.hpp include/farbot/RealtimeObject.hpp include/farbot/detail/RealtimeObject.tcc include/farbot/fifo.hpp include/farbot/detail/fifo.tcc ${GTEST_DIR}/src/gtest_main.cc ${GTEST_DIR}/src/gtest-all.cc) target_include_directories(gtestrunner PRIVATE include ${GTEST_DIR} ${GTEST_DIR}/include) target_link_libraries(gtestrunner Threads::Threads) gtest_add_tests(TARGET gtestrunner SOURCES test/test.cpp) +endif() -install(DIRECTORY include/farbot DESTINATION ${CMAKE_INSTALL_PREFIX}/include) +include(GNUInstallDirs) +install(TARGETS ${TARGET_NAME} + EXPORT ${PROJECT_NAME}-targets +) +install(EXPORT ${PROJECT_NAME}-targets + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} +) +install(DIRECTORY include/farbot DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/cmake/farbot-config.cmake b/cmake/farbot-config.cmake new file mode 100644 index 0000000..48f40b8 --- /dev/null +++ b/cmake/farbot-config.cmake @@ -0,0 +1,5 @@ +get_filename_component(farbot_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + +if(NOT TARGET farbot::farbot) + include("${farbot_CMAKE_DIR}/farbot-targets.cmake") +endif() diff --git a/include/farbot/AsyncCaller.hpp b/include/farbot/AsyncCaller.hpp index bab30f8..26872a3 100644 --- a/include/farbot/AsyncCaller.hpp +++ b/include/farbot/AsyncCaller.hpp @@ -13,7 +13,8 @@ namespace farbot * * The non-realtime thread must call process() to process the lambdas. */ -template +template > class AsyncCaller { public: @@ -31,7 +32,7 @@ class AsyncCaller * * Return false if there was not enough room in the underlying fifo. */ - bool callAsync (std::function && lambda) + bool callAsync (function_type && lambda) { return ringbuffer.push (std::move (lambda)); } @@ -49,7 +50,7 @@ class AsyncCaller bool process() { auto didProcess = false; - std::function lambda; + function_type lambda; while (ringbuffer.pop (lambda)) { @@ -62,6 +63,6 @@ class AsyncCaller return didProcess; } private: - fifo, fifo_options::concurrency::single, caller_concurrency> ringbuffer; + fifo ringbuffer; }; -} \ No newline at end of file +}