{"id":15136988,"url":"https://github.com/robosdk/flow","last_synced_at":"2025-09-12T07:41:19.251Z","repository":{"id":49274758,"uuid":"294958451","full_name":"RoboSDK/Flow","owner":"RoboSDK","description":"Flow is a  software framework focused on ease of use while maximizing performance in closed closed loop systems (e.g. robots). Flow is built on top of C++ 20 coroutines and utilizes modern C++ techniques.","archived":false,"fork":false,"pushed_at":"2022-10-02T23:57:11.000Z","size":742,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-25T02:22:42.135Z","etag":null,"topics":["cmake","communication","conan","consumer","coroutine","coroutines","cpp","cpp20","flow","framework","library","linux","modern","network","producer","robotics","robotics-competition","ros","ros2","visual-studio"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RoboSDK.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"manuelmeraz","patreon":"manuelmeraz"}},"created_at":"2020-09-12T14:20:54.000Z","updated_at":"2024-09-14T08:20:46.000Z","dependencies_parsed_at":"2023-01-19T00:05:13.267Z","dependency_job_id":null,"html_url":"https://github.com/RoboSDK/Flow","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":"cpp-best-practices/gui_starter_template","purl":"pkg:github/RoboSDK/Flow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoboSDK%2FFlow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoboSDK%2FFlow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoboSDK%2FFlow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoboSDK%2FFlow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RoboSDK","download_url":"https://codeload.github.com/RoboSDK/Flow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RoboSDK%2FFlow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274777587,"owners_count":25347648,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-12T02:00:09.324Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cmake","communication","conan","consumer","coroutine","coroutines","cpp","cpp20","flow","framework","library","linux","modern","network","producer","robotics","robotics-competition","ros","ros2","visual-studio"],"created_at":"2024-09-26T06:42:30.864Z","updated_at":"2025-09-12T07:41:19.201Z","avatar_url":"https://github.com/RoboSDK.png","language":"C++","readme":"[![Build status](https://ci.appveyor.com/api/projects/status/ro4lbfoa7n0sy74c/branch/master?svg=true)](https://ci.appveyor.com/project/manuelmeraz/flow/branch/master)\n\n![CMake](https://github.com/manuelmeraz/flow/workflows/CMake/badge.svg)\n\n# Flow\n\nThe ideal autonomous system is able to react and adapt to its environment without delay. \nTo facilitate this behavior data flow from the moment it's captured from it's environment to \nthe moment of actuation must be as close to instantaneous as possible. The transformation from \nperception data to execution should be performed without overhead, while being correct. Flow \naims to provide this framework.\n\n#### Quick Start\n\n##### Docker\n\nDocker image: `manuelmeraz/flow:dev`\n\n##### Building\n\nRequires Ubuntu 20.04 for GCC \u003e= 10.2 to install. \n\n```bash\n# Install GCC \u003e= 10.2 and make it the default\nsudo apt install build-essential gcc-10 g++-10 \nsudo 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\n\n# install conan\nsudo apt install python-pip \npip install --user conan\n\n# install Flow\ngit clone https://github.com/ManuelMeraz/Flow.git \u0026\u0026 cd Flow\nsudo ./scripts/install_libraries.sh\nmkdir build \u0026\u0026 cd build\ncmake -DENABLE_TESTING=ON -DENABLE_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release ..\nmake -j\nctest -j\nsudo make install \n```\n\nAlternatively use the build script:\n\n```bash\n./scripts/build.py --enable-testing --enable-examples\n```\n\nIf the build script doesn't build the project because of a crash try using the `--clear-cache` flash. \n\nUse the `--help` option for more information.\n\n## Table of Contents\n\n1. [Core Concepts](#core-concepts)\n   1. [Overview](#1-overview)\n      1. [Functions](#1-1-functions)\n      2. [Communication](#1-2-communication)\n   2. [Examples](#2-examples)\n2. [Milestones](#milestones)\n3. [Dependencies](#dependencies)\n    1. [Necessary Dependencies ](#1-necessary-dependencies)\n    2. [Library Dependencies ](#2-library-dependencies)\n    3. [Optional Dependencies ](#3-optional-dependencies)\n       1. [Tools](#3-1-tools\")\n4. [Build Instructions](#build-instructions)\n    1. [Build Directory](#1-build-directory)\n    2. [Environment Variables](#2-environment-variables)\n    3. [Configure](#3-configure)\n        1. [Via GUI](#3-1-configure-via-gui)\n        2. [Via CCmake](#3-2-configure-via-ccmake)\n    4. [Build](#4-build)\n5. [Troubleshooting](#troubleshooting)\n    1. [Update Conan](#1-update-conan)\n    2. [Clear Conan Cache](#2-clear-conan-cache)\n    3. [Misconfiguration](#2-misconfiguration)\n6. [Testing](#testing)\n\n\n\n\u003ca name=\"core-concepts\"\u003e\u003c/a\u003e\n## Core Concepts\n\n**Note on the current state of the project**: Right now this is an pre-pre-pre-alpha. I've been working on this in my spare time\nover the last few months. I've had to make a couple of redesigns, but I think this is the one that will work to server\nas a base.\n\nI have many more additions I want to add, such as support for TCP/IP and UDP, performance optimizations, and ergonomics\nsuch as adding in a when_all to subscribe to multiple channels at once with a subscriber or transformer.\n\n\u003ca name=\"1-overview\"\u003e\u003c/a\u003e\n### Overview\n\nThe philosophy behind this framework is dependency management by preventing cyclical dependencies and creating\nmaximum flow in a network and thereby minimizing latency in the system (and probably increase throughput). This is \nmeant to be used for closed feedback systems.\n\n\u003ca name=\"1-1-functions\"\u003e\u003c/a\u003e\n### Functions\nEach node in this graph represents an function, and the specific type of function is defined by the dependencies it\nhas.\n\n1. *Spinner* - A spinner is an function with no dependencies and nothing depends on it. it's a closed system. \n    - Notation:  `()`\n    - Example: In C++ this is a `()-\u003evoid` function, or any other process that emulates it\n    \n2. *Publisher* - A publisher is an function with no dependencies and some other function must depend on it. \n    - Notation:  `()-\u003eR`\n    - Example: In C++ this is a `()-\u003eR` function, or any other process that emulates the behavior\n    \n3. *Subscriber* - A subscriber is an function with at least one dependency and nothing depends on it.\n    - Notation:  `(A)`\n    - Example: In C++ this is a `(A\u0026\u0026... a)-\u003evoid` function, or any other process that emulates the behavior\n    \n3. *Transformer* - A transformer is an function with at least one dependency and at least one function depends on it.\n    - Notation:  `(A)-\u003eR`\n    - Example: In C++ this is a `(A\u0026\u0026... a)-\u003eR` function, or any other process that emulates the behavior\n    \nThe flow network is composed of these 4 types of functions, and any functions where the dependencies are not satisfied\nis an invalid network.\n\n\u003ca name=\"1-2-communication\"\u003e\u003c/a\u003e\n### Communication\nEach of these functions are connected to each other through a `channel`. Each channel needs to have\nat least one publisher and one subscriber on the other end. A transformer doubles as a publisher and subscriber, \nso a path through the network may look something like this\n\n`{()-\u003eA , (A)-\u003eB, (B)-\u003eC, (C)}` This network contains a publisher, two transformers, and a subscriber. It is complete \nand and closed. There will be three channels in between; each with its own channel name. If no channel name is provided,\nthen an empty string will be used; you can think of this as a *global channel*. \n\nA global channel is a channel that is available globally for that specific message type. Publishing an\n`int` without a channel name will publish to the global `int` channel.\n\nEach of the functions in the network will begin and start to process data and eventually reach a frequency.\n\nLooking at the original example: `{()-\u003eA , (A)-\u003eB, (B)-\u003eC, (C)}`\n\nAt t0 the two transformers and subscriber at the end will be waiting for messages and the publisher will begin to \npublish data. This could be through a network socket that has no local dependencies (e.g. sensor data). \n\nAt t1 The first transformer receives the first message and transforms it, and at the same time the publisher begins\npublishing a second piece of data. \n\nThis keeps going until all 4 functions are constantly communicating information to the final subscriber with some\nfrequency.\n\n\u003ca name=\"1-3-Cancellation\"\u003e\u003c/a\u003e\n### Cancellation\n\nCancellation of coroutines is tricky, but there is a logical way to cancel this large network. \n\nThe publishers begin the chain of functions, and the way to end the chain is by beginning with the subscriber\nat the end of the chain. when a cancellation request is performed the subscribers at the end of the\nnetwork flow will begin by exiting their main loop. \n\nAt this point, transformers and publishers down the chain will be awaiting compute time for their coroutine. The subscriber\nwill then `flush` out the waiting transformer or publisher that is next in line, once that transformer is free the \nsubscriber will end. Then the transformer will repeat this until the publisher is reached at the beginning of the chain \nand then the publisher coroutines will end and exit their scope.\n\n\n\u003ca name=\"2-examples\"\u003e\u003c/a\u003e\n### Examples\n\n`example/minimal_publisher_subscriber`\n```c++\n#include \u003cflow/flow.hpp\u003e\n\n// This is a publisher\nstd::string hello_world() { return \"Hello World\"; }\n\n// This is a subscriber. Values are passed in by rvalue, \n// implying that the caller is now the owner of the data.\nvoid subscribe_hello(std::string\u0026\u0026 message){  }\n\nint main()\n{\n  using namespace flow::literals;\n\n  /**\n   * The publisher hello_world creates a private channel to \n   * subscribe_hello and sends messsages at 10hz\n   */\n  auto net = flow::network(flow::chain(10_q_hz) | hello_world | subscribe_hello);\n\n  /**\n   * Note: cancellation begins in 1 ms, but cancellation\n   * is non-deterministic. \n   */\n  net.cancel_after(1ms);\n\n  flow::spin(std::move(net));\n}\n```\n\n\nExample with transformers and multiple chains\n```c++\n#include \u003crandom\u003e\n\n#include \u003cflow/flow.hpp\u003e\n\nstatic std::random_device m_random_device{};\nstatic std::mt19937 m_random_engine{ m_random_device() };\nstatic std::uniform_int_distribution\u003cint\u003e m_distribution{ 1, 100 };\n\nstruct Data {\n  int data{};\n};\n\nclass Sensor {\npublic:\n  Data operator()()\n  {\n    auto data = m_distribution(m_random_engine);\n    return Data{ data };\n  }\n\n  std::string publish_to() { return \"sensor\"; }\n\nprivate:\n};\n\nData low_pass_filter(Data\u0026\u0026 msg)\n{\n  static int limit = 30;\n  msg.data = std::min(msg.data, limit);\n  return std::move(msg);\n}\n\nData high_pass_filter(Data\u0026\u0026 msg)\n{\n  static int limit = 70;\n  msg.data = std::max(msg.data, limit);\n  return std::move(msg);\n}\n\nvoid consume_data(Data\u0026\u0026 data) {}\n\n\nint main()\n{\n  using namespace flow::literals;\n\n  auto sensor_chain = flow::chain(10_q_Hz) | Sensor{};\n  auto low_pass = flow::chain() | flow::transform(low_pass_filter, \"sensor\") | consume_data;\n  auto high_pass = flow::chain() | flow::transform(high_pass_filter, \"sensor\") | consume_data;\n\n  auto network = flow::network(std::move(sensor, std::move(low_pass), std::move(high_pass));\n\n  network.cancel_after(5s);\n  flow::spin(std::move(network));\n}\n```\n\n\u003ca name=\"milestones\"\u003e\u003c/a\u003e\n## Milestones\n| Version | Description                                                                  | ETA                    |\n|---------|------------------------------------------------------------------------------|------------------------|\n| 0.1.0   | Ability to create in-memory network, send messages, and shut down reliably. Single publisher single subscribe channels. | Completed 1/25/2021  |\n| 0.1.1   | Ability to set frequency of routines using mp-units at compile time.         | Completed 6/20/2021    |\n| 0.1.2   | DDS communication support using Cyclone DDS (probably)                       | September 2021         |\n| 0.1.3   | Modulating frequncies of system depending on flow of information             | December 2021      |\n| 0.1.4   | Collect performance metrics and show in documentation                        | January 2022       |\n| 0.1.5   | Create tools to tweak performance                                            | February 2022         |\n| 0.1.6   | Optimization of implementation and add memory pool/allocator options         | 2022           |\n| 0.2     | All Major features complete                                                  | 2022           |  \n| 0.2.1   | Compose functions, when_all, when_any                                        | 2022|\n| 1.0.0   | Embedded support (single-threaded, no heap allocatinons), security           | 2022           |\n\n\u003ca name=\"dependencies\"\u003e\u003c/a\u003e\n## Dependencies\n\n**Note**: Flow has only been tested on Ubuntu 20.04 with GCC 10.2\n\n\u003ca name=\"1-necessary-dependencies\"\u003e\u003c/a\u003e\n### Necessary Dependencies\n1. GCC \u003e= 10.2 (Even the latest clang does not work)\nSee [cppreference.com](https://en.cppreference.com/w/cpp/compiler_support)\nto see which features are supported by each compiler.\nThe following compilers should work:\n\n  * [gcc 10.2+](https://gcc.gnu.org/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall command\u003c/summary\u003e\n\n    - Ubuntu 20.04:\n\n        sudo apt install build-essential gcc-10 g++-10\n        \n        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\n      \n    \u003c/details\u003e\n\n2. [Conan](https://conan.io/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall Command\u003c/summary\u003e\n    \n    - Via pip - https://docs.conan.io/en/latest/installation.html#install-with-pip-recommended\n        \n            pip install --user conan\n    \n     - Windows:\n\n        choco install conan -y\n\n    - MacOS:\n\n        brew install conan\n\n   \u003c/details\u003e\n\n3. [CMake 3.15+](https://cmake.org/)\n   \u003cdetails\u003e\n   \u003csummary\u003eInstall Command\u003c/summary\u003e\n\n    - Debian/Ubuntu:\n\n        sudo apt-get install cmake\n\n    - Windows:\n\n        choco install cmake -y\n\n    - MacOS:\n\n        brew install cmake\n\n   \u003c/details\u003e\n\n\u003ca name=\"2-library-dependencies\"\u003e\u003c/a\u003e\n### Library Dependencies\n1. [liburing](https://github.com/axboe/liburing)\n   \u003cdetails\u003e\n   \u003csummary\u003eInstall Command\u003c/summary\u003e\n        sudo ./scripts/install_liburing.sh\n   \u003c/details\u003e\n2. [cppcoro](https://github.com/Garcia6l20/cppcoro)\n   \u003cdetails\u003e\n   \u003csummary\u003eInstall Command\u003c/summary\u003e\n        sudo ./scripts/install_libcppcoro.sh\n   \u003c/details\u003e\n\n\u003ca name=\"3-optional-dependencies\"\u003e\u003c/a\u003e\n### Optional Dependencies\n\n\u003ca name=\"3-1-tools\"\u003e\u003c/a\u003e\n#### C++ Tools\n  * [Doxygen](http://doxygen.nl/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall Command\u003c/summary\u003e\n\n    - Debian/Ubuntu:\n        \n            sudo apt-get install doxygen\n            sudo apt-get install graphviz\n\n    - Windows:\n        \n            choco install doxygen.install -y\n            choco install graphviz -y\n\n    - MacOS:\n        \n            brew install doxygen\n            brew install graphviz\n\n    \u003c/details\u003e\n\n\n  * [ccache](https://ccache.dev/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall Command\u003c/summary\u003e\n\n    - Debian/Ubuntu:\n        \n            sudo apt-get install ccache\n\n    - Windows:\n        \n            choco install ccache -y\n\n    - MacOS:\n        \n            brew install ccache\n\n    \u003c/details\u003e\n\n\n  * [Cppcheck](http://cppcheck.sourceforge.net/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall Command\u003c/summary\u003e\n\n    - Debian/Ubuntu:\n        \n            sudo apt-get install cppcheck\n\n    - Windows:\n        \n            choco install cppcheck -y\n\n    - MacOS:\n        \n            brew install cppcheck\n\n    \u003c/details\u003e\n\n\n  * [include-what-you-use](https://include-what-you-use.org/)\n    \u003cdetails\u003e\n    \u003csummary\u003eInstall Command\u003c/summary\u003e\n\n    Follow instructions here:\n    https://github.com/include-what-you-use/include-what-you-use#how-to-install\n    \u003c/details\u003e\n\n\n\u003ca name=\"build-instructions\"\u003e\u003c/a\u003e\n## Build Instructions\n\n\u003ca name=\"1-build-directory\"\u003e\u003c/a\u003e\n### Build directory\nMake a build directory:\n```bash\nmkdir build\n```\n\u003ca name=\"2-environment-variables\"\u003e\u003c/a\u003e\n### Specify the compiler using environment variables\n\nBy default (if you don't set environment variables `CC` and `CXX`), the system default compiler will be used.\n\nConan and CMake use the environment variables CC and CXX to decide which compiler to use. So to avoid the conflict issues only specify the compilers using these variables.\n\nCMake will detect which compiler was used to build each of the Conan targets. If you build all of your Conan targets with one compiler, and then build your CMake targets with a different compiler, the project may fail to build.\n\n\u003cdetails\u003e\n\u003csummary\u003eCommands for setting the compilers \u003c/summary\u003e\n\n- Debian/Ubuntu/MacOS:\n    \n    Set your desired compiler (`clang`, `gcc`, etc):\n        \n    - Temporarily (only for the current shell)\n    \n        Run one of the followings in the terminal:\n    \n        - clang\n        \n                CC=clang CXX=clang++\n            \n        - gcc\n        \n                CC=gcc CXX=g++\n    \n    - Permanent:\n\n        Open `~/.bashrc` using your text editor:\n            \n            gedit ~/.bashrc\n            \n        Add `CC` and `CXX` to point to the compilers:\n            \n            export CC=clang\n            export CXX=clang++\n            \n        Save and close the file.\n\n- Windows:\n\n    - Permanent:\n    \n        Run one of the followings in PowerShell:\n                \n        - Visual Studio generator and compiler (cl)\n            \n                [Environment]::SetEnvironmentVariable(\"CC\", \"cl.exe\", \"User\")\n                [Environment]::SetEnvironmentVariable(\"CXX\", \"cl.exe\", \"User\")\n                refreshenv\n            \n          Set the architecture using [vsvarsall](https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=vs-2019#vcvarsall-syntax):\n            \n                vsvarsall.bat x64\n\n        - clang\n\n                [Environment]::SetEnvironmentVariable(\"CC\", \"clang.exe\", \"User\")\n                [Environment]::SetEnvironmentVariable(\"CXX\", \"clang++.exe\", \"User\")\n                refreshenv\n     \n        - gcc\n\n                [Environment]::SetEnvironmentVariable(\"CC\", \"gcc.exe\", \"User\")\n                [Environment]::SetEnvironmentVariable(\"CXX\", \"g++.exe\", \"User\")\n                refreshenv\n     \n\n  - Temporarily (only for the current shell):\n        \n            $Env:CC=\"clang.exe\"\n            $Env:CXX=\"clang++.exe\"\n            \n\u003c/details\u003e\n\n\u003ca name=\"3-configure\"\u003e\u003c/a\u003e\n### Configure your build\n\nTo configure the project and write makefiles, you could use `cmake` with a bunch of command line options.\nThe easier option is to run cmake interactively:\n\n\u003ca name=\"3-1-configure-via-gui\"\u003e\u003c/a\u003e\n#### **Configure via cmake-gui**:\n\n1) Open cmake-gui from the project directory:\n```\ncmake-gui .\n```\n2) Set the build directory:\n\n![build_dir](https://user-images.githubusercontent.com/16418197/82524586-fa48e380-9af4-11ea-8514-4e18a063d8eb.jpg)\n\n3) Configure the generator:\n\nIn cmake-gui, from the upper menu select `Tools/Configure`.\n\n**Warning**: if you have set `CC` and `CXX` always choose the `use default native compilers` option. This picks `CC` and `CXX`. Don't change the compiler at this stage!\n\n\u003cdetails\u003e\n\u003csummary\u003eWindows - MinGW Makefiles\u003c/summary\u003e\n\nChoose MinGW Makefiles as the generator:\n\n\u003cimg src=\"https://user-images.githubusercontent.com/16418197/82769479-616ade80-9dfa-11ea-899e-3a8c31d43032.png\" alt=\"mingw\"\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWindows - Visual Studio generator and compiler\u003c/summary\u003e\n\nYou should have already set `C` and `CXX` to `cl.exe`.\n\nChoose \"Visual Studio 16 2019\" as the generator:\n\n\u003cimg src=\"https://user-images.githubusercontent.com/16418197/82524696-32502680-9af5-11ea-9697-a42000e900a6.jpg\" alt=\"default_vs\"\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eWindows - Visual Studio generator and Clang Compiler\u003c/summary\u003e\n\nYou should have already set `C` and `CXX` to `clang.exe` and `clang++.exe`.\n\nChoose \"Visual Studio 16 2019\" as the generator. To tell Visual studio to use `clang-cl.exe`:\n- If you use the LLVM that is shipped with Visual Studio: write `ClangCl` under \"optional toolset to use\". \n\n\u003cimg src=\"https://user-images.githubusercontent.com/16418197/82781142-ae60ac00-9e1e-11ea-8c77-222b005a8f7e.png\" alt=\"visual_studio\"\u003e\n\n- If you use an external LLVM: write [`LLVM_v142`](https://github.com/zufuliu/llvm-utils#llvm-for-visual-studio-2017-and-2019)\n under \"optional toolset to use\".\n\n\u003cimg src=\"https://user-images.githubusercontent.com/16418197/82769558-b3136900-9dfa-11ea-9f73-02ab8f9b0ca4.png\" alt=\"visual_studio\"\u003e\n\n\u003c/details\u003e\n\u003cbr/\u003e\n\n4) Choose the Cmake options and then generate:\n\n![generate](https://user-images.githubusercontent.com/16418197/82781591-c97feb80-9e1f-11ea-86c8-f2748b96f516.png)\n\n\u003ca name=\"3-2-configure-via-ccmake\"\u003e\u003c/a\u003e\n#### **Configure via ccmake**:\nwith the Cmake Curses Dialog Command Line tool:  \n\n    ccmake .\n\nOnce `ccmake` has finished setting up, press 'c' to configure the project, \npress 'g' to generate, and 'q' to quit.\n\n\u003ca name=\"4-build\"\u003e\u003c/a\u003e\n### Build\nOnce you have selected all the options you would like to use, you can build the \nproject (all targets):\n\n    cmake --build ./build\n\nFor Visual Studio, give the build configuration (Release, RelWithDeb, Debug, etc) like the following:\n\n    cmake --build ./build -- /p:configuration=Release\n\n\u003ca name=\"troubleshooting\"\u003e\u003c/a\u003e\n## Troubleshooting\n\n\u003ca name=\"1-update-conan\"\u003e\u003c/a\u003e\n### Update Conan\nMany problems that users have can be resolved by updating Conan, so if you are \nhaving any trouble with this project, you should start by doing that.\n\nTo update conan: \n\n    $ pip install --user --upgrade conan \n\nYou may need to use `pip3` instead of `pip` in this command, depending on your \nplatform.\n\n\u003ca name=\"2-clear-conan-cache\"\u003e\u003c/a\u003e\n### Clear Conan cache\nIf you continue to have trouble with your Conan dependencies, you can try \nclearing your Conan cache:\n\n    $ conan remove -f '*'\n    \nThe next time you run `cmake` or `cmake --build`, your Conan dependencies will\nbe rebuilt. If you aren't using your system's default compiler, don't forget to \nset the CC, CXX, CMAKE_C_COMPILER, and CMAKE_CXX_COMPILER variables, as \ndescribed in the 'Build using an alternate compiler' section above.\n\n\u003ca name=\"3-misconfiguration\"\u003e\u003c/a\u003e\n### Identifying misconfiguration of Conan dependencies\n\nIf you have a dependency 'A' that requires a specific version of another \ndependency 'B', and your project is trying to use the wrong version of \ndependency 'B', Conan will publish warnings about this configuration error \nwhen you run CMake. These warnings can easily get lost between a couple \nhundred or thousand lines of output, depending on the size of your project. \n\nIf your project has a Conan configuration error, you can use `conan info` to \nfind it. `conan info` displays information about the dependency graph of your \nproject, with colorized output in some terminals.\n\n    $ cd build\n    $ conan info .\n\nIn my terminal, the first couple lines of `conan info`'s output show all of the\nproject's configuration warnings in a bright yellow font. \n\nFor example, the package `spdlog/1.5.0` depends on the package `fmt/6.1.2`.\nIf you were to modify the file `cmake/Conan.cmake` so that it requires an \nearlier version of `fmt`, such as `fmt/6.0.0`, and then run:\n\n    $ conan remove -f '*'       # clear Conan cache\n    $ rm -rf build              # clear previous CMake build\n    $ mkdir build \u0026\u0026 cd build\n    $ cmake ..                  # rebuild Conan dependencies\n    $ conan info .\n\n...the first line of output would be a warning that `spdlog` needs a more recent\nversion of `fmt`.\n\n\u003ca name=\"testing\"\u003e\u003c/a\u003e\n## Testing\nSee [Catch2 tutorial](https://github.com/catchorg/Catch2/blob/master/docs/tutorial.md)\n\nTo run the tests execute the `ctest` command from within the `build` directory\n","funding_links":["https://github.com/sponsors/manuelmeraz","https://patreon.com/manuelmeraz"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobosdk%2Fflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobosdk%2Fflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobosdk%2Fflow/lists"}