Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions applications/daqiri_raw_ethernet_bench/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ target_link_libraries(daqiri_raw_ethernet_bench
)
holohub_link_daqiri(daqiri_raw_ethernet_bench)

# Configure manager support through compile definitions
if(NOT DEFINED DAQIRI_MGR)
set(DAQIRI_MGR "dpdk" CACHE STRING "DAQIRI manager type(s) list")
# Configure engine support through compile definitions
if(NOT DEFINED DAQIRI_ENGINE)
set(DAQIRI_ENGINE "dpdk" CACHE STRING "DAQIRI engine type(s) list")
endif()
separate_arguments(DAQIRI_MGR_LIST UNIX_COMMAND ${DAQIRI_MGR})
foreach(MGR IN LISTS DAQIRI_MGR_LIST)
string(TOUPPER "${MGR}" MGR_UPPER)
message(STATUS "Adding DAQIRI manager ${MGR} to the application configuration")
target_compile_definitions(${PROJECT_NAME} PUBLIC "DAQIRI_MGR_${MGR_UPPER}=1")
separate_arguments(DAQIRI_ENGINE_LIST UNIX_COMMAND ${DAQIRI_ENGINE})
foreach(ENGINE IN LISTS DAQIRI_ENGINE_LIST)
string(TOUPPER "${ENGINE}" ENGINE_UPPER)
message(STATUS "Adding DAQIRI engine ${ENGINE} to the application configuration")
target_compile_definitions(${PROJECT_NAME} PUBLIC "DAQIRI_ENGINE_${ENGINE_UPPER}=1")
endforeach()

# Copy config file
Expand Down Expand Up @@ -117,7 +117,7 @@ if(BUILD_TESTING)
include(add_python_tests)
add_python_tests(
INPUT "testing"
ENVIRONMENT "DAQIRI_MANAGER_LIST=${DAQIRI_MGR_LIST}"
ENVIRONMENT "DAQIRI_ENGINE_LIST=${DAQIRI_ENGINE_LIST}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if the Python test's environment variable parsing matches CMake's list format

# 1. Check how CMake list is passed to environment
rg -n "DAQIRI_ENGINE_LIST" applications/daqiri_raw_ethernet_bench/cpp/CMakeLists.txt -A2 -B2

# 2. Check how Python parses the environment variable
rg -n "DAQIRI_ENGINE_LIST" applications/daqiri_raw_ethernet_bench/cpp/testing/test_daqiri_raw_ethernet_bench.py -A2 -B2

# 3. Look for any list(JOIN) operations that might convert format
rg -n "list\(JOIN.*DAQIRI_ENGINE" applications/daqiri_raw_ethernet_bench/cpp/

Repository: nvidia-holoscan/holohub

Length of output: 1246


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find where add_python_tests is defined/used
rg -n "function\\(add_python_tests\\)|macro\\(add_python_tests\\)|add_python_tests\\(" -S . -g'*.cmake' -g'*.txt'

# Inspect the definition(s) around ENVIRONMENT handling
# (Limit output to the most relevant sections)
rg -n "ENVIRONMENT" -S . -g'*.cmake' | head -n 50

Repository: nvidia-holoscan/holohub

Length of output: 903


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="cmake/modules/add_python_tests.cmake"
nl -ba "$FILE" | sed -n '1,220p'

Repository: nvidia-holoscan/holohub

Length of output: 110


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="cmake/modules/add_python_tests.cmake"
cat -n "$FILE" | sed -n '1,220p'

Repository: nvidia-holoscan/holohub

Length of output: 7079


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show relevant CMake block (including separate_arguments and call to add_python_tests)
cat -n applications/daqiri_raw_ethernet_bench/cpp/CMakeLists.txt | sed -n '35,140p'

# Show relevant Python test block(s)
cat -n applications/daqiri_raw_ethernet_bench/cpp/testing/test_daqiri_raw_ethernet_bench.py | sed -n '1,140p'

Repository: nvidia-holoscan/holohub

Length of output: 9661


🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n "add_python_tests\\([\\s\\S]*ENVIRONMENT" applications operators cmake -g'*.cmake'

Repository: nvidia-holoscan/holohub

Length of output: 49


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n "add_python_tests\\(" -S applications operators cmake -g'*.cmake'
rg -n "\\bENVIRONMENT\\b" applications operators cmake -g'*.cmake' | head -n 200

Repository: nvidia-holoscan/holohub

Length of output: 321


Fix CMake/CTest ENVIRONMENT formatting for DAQIRI_ENGINE_LIST (semicolon vs whitespace)

DAQIRI_ENGINE_LIST is built as a CMake list (separate_arguments(...)), but it’s passed to CTest as ENVIRONMENT "DAQIRI_ENGINE_LIST=${DAQIRI_ENGINE_LIST}". CTest/set_tests_properties(ENVIRONMENT ...) treats semicolons as separators between environment variable entries, so multi-engine values like dpdk;socket won’t reach Python as a single DAQIRI_ENGINE_LIST string. The Python test then does os.environ.get(...).split() (whitespace), so it won’t parse semicolon-delimited engines correctly. This isn’t currently exercised because the test parametrizes engine as ["dpdk"], but it will break as soon as other engines are added.

Fix by joining the CMake list before exporting (e.g., list(JOIN DAQIRI_ENGINE_LIST_STR " " DAQIRI_ENGINE_LIST) then ENVIRONMENT "DAQIRI_ENGINE_LIST=${DAQIRI_ENGINE_LIST_STR}") or by updating Python to split on both ; and whitespace.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@applications/daqiri_raw_ethernet_bench/cpp/CMakeLists.txt` at line 120, The
CTest ENVIRONMENT line is passing the CMake list DAQIRI_ENGINE_LIST directly
which lets semicolons break into separate env entries; to fix, join the list
into a single string before exporting (e.g., use list(JOIN DAQIRI_ENGINE_LIST "
" DAQIRI_ENGINE_LIST_STR) and then set ENVIRONMENT
"DAQIRI_ENGINE_LIST=${DAQIRI_ENGINE_LIST_STR}" in the set_tests_properties call)
or alternatively update the Python test that reads
os.environ.get("DAQIRI_ENGINE_LIST") to split on both semicolons and whitespace
(e.g., split on re.split(r"[;\s]+", ...)) so multi-engine values like
"dpdk;socket" are preserved as a single environment variable.

PYTEST_ARGS "-v" "-s" "--log-cli-level=DEBUG" "--show-capture=no"
)
endif()
24 changes: 12 additions & 12 deletions applications/daqiri_raw_ethernet_bench/cpp/CMakeLists.txt.install
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,13 @@ find_package(daqiri REQUIRED CONFIG)

function(link_daqiri target_name)
set(_daqiri_targets daqiri::daqiri)
foreach(_daqiri_manager IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_manager}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_manager}")
foreach(_daqiri_engine IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_engine}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_engine}")
endif()
endforeach()

# DAQIRI static packages can contain cross-references between core and manager archives.
# DAQIRI static packages can contain cross-references between core and engine archives.
string(JOIN "," _daqiri_link_group ${_daqiri_targets})
target_link_libraries("${target_name}" PRIVATE "$<LINK_GROUP:RESCAN,${_daqiri_link_group}>")
endfunction()
Expand All @@ -53,15 +53,15 @@ target_link_libraries(daqiri_raw_ethernet_bench
)
link_daqiri(daqiri_raw_ethernet_bench)

# Configure manager support through compile definitions
if(NOT DEFINED DAQIRI_MGR)
set(DAQIRI_MGR "dpdk" CACHE STRING "DAQIRI manager type(s) list")
# Configure engine support through compile definitions
if(NOT DEFINED DAQIRI_ENGINE)
set(DAQIRI_ENGINE "dpdk" CACHE STRING "DAQIRI engine type(s) list")
endif()
separate_arguments(DAQIRI_MGR_LIST UNIX_COMMAND ${DAQIRI_MGR})
foreach(MGR IN LISTS DAQIRI_MGR_LIST)
string(TOUPPER "${MGR}" MGR_UPPER)
message(STATUS "Adding DAQIRI manager ${MGR} to the application configuration")
target_compile_definitions(${PROJECT_NAME} PUBLIC "DAQIRI_MGR_${MGR_UPPER}=1")
separate_arguments(DAQIRI_ENGINE_LIST UNIX_COMMAND ${DAQIRI_ENGINE})
foreach(ENGINE IN LISTS DAQIRI_ENGINE_LIST)
string(TOUPPER "${ENGINE}" ENGINE_UPPER)
message(STATUS "Adding DAQIRI engine ${ENGINE} to the application configuration")
target_compile_definitions(${PROJECT_NAME} PUBLIC "DAQIRI_ENGINE_${ENGINE_UPPER}=1")
endforeach()

# Copy config files
Expand Down
47 changes: 20 additions & 27 deletions applications/daqiri_raw_ethernet_bench/cpp/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if DAQIRI_MGR_DPDK
#if DAQIRI_ENGINE_DPDK
#include "default_bench_op_rx.h"
#include "default_bench_op_tx.h"
#endif
Expand All @@ -29,35 +29,28 @@ class App : public holoscan::Application {
using namespace holoscan;

const auto [rx_en, tx_en] = daqiri::get_rx_tx_configs_enabled(config());
const auto mgr_type = daqiri::get_manager_type();

HOLOSCAN_LOG_INFO("Using DAQIRI manager {}", daqiri::manager_type_to_string(mgr_type));

if (mgr_type == daqiri::ManagerType::DPDK) {
#if DAQIRI_MGR_DPDK
if (rx_en) {
auto bench_rx = make_operator<ops::DaqiriRawEthernetBenchDefaultRxOp>(
"bench_rx",
from_config("bench_rx"),
make_condition<BooleanCondition>("is_alive", true));
add_operator(bench_rx);
}
if (tx_en) {
auto bench_tx = make_operator<ops::DaqiriRawEthernetBenchDefaultTxOp>(
"bench_tx",
from_config("bench_tx"),
make_condition<BooleanCondition>("is_alive", true));
add_operator(bench_tx);
}
// The raw Ethernet benchmark only runs on the DPDK engine, so there is no
// need to query or branch on the engine type at runtime.
#if DAQIRI_ENGINE_DPDK
if (rx_en) {
auto bench_rx = make_operator<ops::DaqiriRawEthernetBenchDefaultRxOp>(
"bench_rx",
from_config("bench_rx"),
make_condition<BooleanCondition>("is_alive", true));
add_operator(bench_rx);
}
if (tx_en) {
auto bench_tx = make_operator<ops::DaqiriRawEthernetBenchDefaultTxOp>(
"bench_tx",
from_config("bench_tx"),
make_condition<BooleanCondition>("is_alive", true));
add_operator(bench_tx);
}
#else
HOLOSCAN_LOG_ERROR("DPDK manager/backend is disabled");
exit(1);
HOLOSCAN_LOG_ERROR("DPDK engine is disabled; rebuild with -DDAQIRI_ENGINE=dpdk");
exit(1);
#endif
Comment on lines 50 to 53

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Calling exit(1) in compose() bypasses cleanup and may leak resources.

compose() is invoked after daqiri_init() (line 71) has allocated resources. Calling exit(1) here skips app->run(), daqiri::print_stats(), and daqiri::shutdown() (lines 81-82), potentially leaving DAQIRI in an inconsistent state.

Move the DAQIRI_ENGINE_DPDK check earlier in main() before daqiri_init(), or use an exception-based approach so cleanup handlers run.

🔄 Proposed fix: validate engine support before initialization
 int main(int argc, char** argv) {
   using namespace holoscan;
+
+#if !DAQIRI_ENGINE_DPDK
+  HOLOSCAN_LOG_ERROR("DPDK engine is disabled; rebuild with -DDAQIRI_ENGINE=dpdk");
+  return 1;
+#endif
+
   auto app = make_application<App>();
 
   // Get the configuration

And remove the #else block from compose():

 void compose() override {
   using namespace holoscan;
 
   const auto [rx_en, tx_en] = daqiri::get_rx_tx_configs_enabled(config());
 
   // The raw Ethernet benchmark only runs on the DPDK engine, so there is no
   // need to query or branch on the engine type at runtime.
 `#if` DAQIRI_ENGINE_DPDK
   if (rx_en) {
     auto bench_rx = make_operator<ops::DaqiriRawEthernetBenchDefaultRxOp>(
         "bench_rx",
         from_config("bench_rx"),
         make_condition<BooleanCondition>("is_alive", true));
     add_operator(bench_rx);
   }
   if (tx_en) {
     auto bench_tx = make_operator<ops::DaqiriRawEthernetBenchDefaultTxOp>(
         "bench_tx",
         from_config("bench_tx"),
         make_condition<BooleanCondition>("is_alive", true));
     add_operator(bench_tx);
   }
-#else
-  HOLOSCAN_LOG_ERROR("DPDK engine is disabled; rebuild with -DDAQIRI_ENGINE=dpdk");
-  exit(1);
 `#endif`
 }
🧰 Tools
🪛 Cppcheck (2.20.0)

[error] 53-53: There is an unknown macro here somewhere. Configuration is required. If HOLOSCAN_OPERATOR_FORWARD_ARGS is a macro then please configure it.

(unknownMacro)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@applications/daqiri_raw_ethernet_bench/cpp/main.cpp` around lines 50 - 53,
The compose() function currently calls exit(1) when DAQIRI_ENGINE_DPDK is not
enabled which bypasses later cleanup (daqiri_init(), app->run(),
daqiri::print_stats(), daqiri::shutdown()); move the DAQIRI_ENGINE_DPDK
capability check out of compose() and perform it early in main() before calling
daqiri_init(), or replace the exit call with throwing an exception so upstream
callers can run cleanup handlers; update callers and error-handling in main() to
either abort before initialization or catch the exception and ensure
daqiri::shutdown()/print_stats() and app->run() behavior remain consistent
(reference compose(), main(), daqiri_init(), daqiri::shutdown(),
daqiri::print_stats(), and app->run()).


} else {
HOLOSCAN_LOG_ERROR("Unsupported DAQIRI manager/backend");
exit(1);
}
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,10 +305,10 @@ def _extract_metric(pattern, text) -> int:
return 0 # Return 0 if no match found


def parse_benchmark_results(log: str, manager_type: str) -> BenchmarkResults:
if manager_type == "dpdk":
def parse_benchmark_results(log: str, engine_type: str) -> BenchmarkResults:
if engine_type == "dpdk":
return parse_dpdk_benchmark_results(log)
raise ValueError(f"Unsupported manager type: {manager_type}")
raise ValueError(f"Unsupported engine type: {engine_type}")


def parse_dpdk_benchmark_results(log: str) -> BenchmarkResults:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,18 +46,18 @@ def executable(work_dir):
return os.path.join(work_dir, "daqiri_raw_ethernet_bench")


def skip_if_manager_unavailable(manager):
"""Skip the current test if the given manager is not in DAQIRI_MANAGER_LIST."""
manager_list = os.environ.get("DAQIRI_MANAGER_LIST", "").split()
if manager not in manager_list:
pytest.skip(f"{manager} manager not available in this build")
def skip_if_engine_unavailable(engine):
"""Skip the current test if the given engine is not in DAQIRI_ENGINE_LIST."""
engine_list = os.environ.get("DAQIRI_ENGINE_LIST", "").split()
if engine not in engine_list:
pytest.skip(f"{engine} engine not available in this build")


@pytest.fixture(autouse=True)
def _skip_unavailable_manager(request):
"""Auto-skip parametrized tests whose manager is not in DAQIRI_MANAGER_LIST."""
if hasattr(request.node, "callspec") and "manager" in request.node.callspec.params:
skip_if_manager_unavailable(request.node.callspec.params["manager"])
def _skip_unavailable_engine(request):
"""Auto-skip parametrized tests whose engine is not in DAQIRI_ENGINE_LIST."""
if hasattr(request.node, "callspec") and "engine" in request.node.callspec.params:
skip_if_engine_unavailable(request.node.callspec.params["engine"])


@pytest.mark.parametrize(
Expand All @@ -69,12 +69,12 @@ def _skip_unavailable_manager(request):
(9000, 96.0, 0.1, 0.0),
],
)
@pytest.mark.parametrize("manager", ["dpdk"])
@pytest.mark.parametrize("engine", ["dpdk"])
def test_multi_if_loopback(
executable,
work_dir,
nvidia_nics,
manager,
engine,
packet_size,
avg_throughput_threshold,
missed_pkts_threshold,
Expand All @@ -96,7 +96,7 @@ def test_multi_if_loopback(
payload_size = packet_size - header_size
in_config_file = os.path.join(work_dir, "daqiri_raw_ethernet_bench_default_tx_rx.yaml")
out_config_file = os.path.join(
work_dir, "testing", f"daqiri_raw_ethernet_bench_{manager}_tx_rx_{packet_size}.yaml"
work_dir, "testing", f"daqiri_raw_ethernet_bench_{engine}_tx_rx_{packet_size}.yaml"
)
update_yaml_file(
in_config_file,
Expand All @@ -116,7 +116,7 @@ def test_multi_if_loopback(
# Run the application until completion and parse the results
command = f"{executable} {out_config_file}"
result = run_command(command, stream_output=True)
results = parse_benchmark_results(result.stdout + result.stderr, manager)
results = parse_benchmark_results(result.stdout + result.stderr, engine)

# Validate some expected metrics
port_map = {0: 1} # Port 0 (TX) sends to Port 1 (RX), matching daqiri.cfg.interfaces
Expand Down
8 changes: 4 additions & 4 deletions applications/daqiri_socket_ping/cpp/CMakeLists.txt.install
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ find_package(daqiri REQUIRED CONFIG)

function(link_daqiri target_name)
set(_daqiri_targets daqiri::daqiri)
foreach(_daqiri_manager IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_manager}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_manager}")
foreach(_daqiri_engine IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_engine}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_engine}")
endif()
endforeach()

# DAQIRI static packages can contain cross-references between core and manager archives.
# DAQIRI static packages can contain cross-references between core and engine archives.
string(JOIN "," _daqiri_link_group ${_daqiri_targets})
target_link_libraries("${target_name}" PRIVATE "$<LINK_GROUP:RESCAN,${_daqiri_link_group}>")
endfunction()
Expand Down
10 changes: 3 additions & 7 deletions applications/daqiri_socket_ping/daqiri_socket_ping.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ daqiri:
cfg:
version: 1
stream_type: "socket"
protocol: "udp"
master_core: 3
debug: false
log_level: "info"
Expand All @@ -40,8 +39,7 @@ daqiri:
address: "127.0.0.1"
socket_config:
mode: server
local_ip: "127.0.0.1"
local_port: 5001
local_addr: "udp://127.0.0.1:5001"
max_payload_size: 2048
rx:
queues:
Expand All @@ -63,10 +61,8 @@ daqiri:
address: "127.0.0.1"
socket_config:
mode: client
local_ip: "127.0.0.1"
local_port: 5002
remote_ip: "127.0.0.1"
remote_port: 5001
local_addr: "udp://127.0.0.1:5002"
remote_addr: "udp://127.0.0.1:5001"
max_payload_size: 2048
rx:
queues:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,9 @@ void AdvConnectorOpTx::initialize() {
mr.second.kind_ == MemoryKind::DEVICE)
gpu_direct_ = true;
}
mgr_ = manager_type_to_string(cfg_.get().common_.manager_type);
engine_ = engine_type_to_string(cfg_.get().common_.engine_type);

HOLOSCAN_LOG_INFO("mgr_: {}", mgr_.c_str());
HOLOSCAN_LOG_INFO("engine_: {}", engine_.c_str());
HOLOSCAN_LOG_INFO("gpu_direct_: {}", gpu_direct_);
HOLOSCAN_LOG_INFO("hds_: {}", hds_);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class AdvConnectorOpTx : public Operator {
uint32_t batch_size_;
int hds_;
bool gpu_direct_;
std::string mgr_;
std::string engine_;

char eth_dst_[6];
uint32_t ip_src_;
Expand Down
10 changes: 3 additions & 7 deletions applications/simple_pdw_pipeline/simple_pdw_pipeline.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ daqiri:
cfg:
version: 1
stream_type: "socket"
protocol: "udp"
master_core: 3
debug: false
log_level: "info"
Expand All @@ -41,8 +40,7 @@ daqiri:
address: "0.0.0.0"
socket_config:
mode: server
local_ip: "0.0.0.0"
local_port: 8999
local_addr: "udp://0.0.0.0:8999"
max_payload_size: 16400
rx:
queues:
Expand All @@ -56,10 +54,8 @@ daqiri:
address: "127.0.0.1"
socket_config:
mode: client
local_ip: "127.0.0.1"
local_port: 12347
remote_ip: "127.0.0.1"
remote_port: 12346
local_addr: "udp://127.0.0.1:12347"
remote_addr: "udp://127.0.0.1:12346"
max_payload_size: 8192
min_ipg_ns: 0
retry_connect_s: 1
Expand Down
4 changes: 1 addition & 3 deletions applications/velodyne_lidar_app/cpp/lidar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ daqiri:
cfg:
version: 1
stream_type: "socket"
protocol: "udp"
master_core: 3
debug: false
log_level: "info"
Expand All @@ -35,8 +34,7 @@ daqiri:
address: "0.0.0.0"
socket_config:
mode: server
local_ip: "0.0.0.0"
local_port: 2368
local_addr: "udp://0.0.0.0:2368"
max_payload_size: 1400
rx:
queues:
Expand Down
8 changes: 4 additions & 4 deletions cmake/HoloHubDaqiri.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ function(holohub_link_daqiri target_name)
endif()

set(_daqiri_targets daqiri::daqiri)
foreach(_daqiri_manager IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_manager}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_manager}")
foreach(_daqiri_engine IN ITEMS dpdk socket rdma)
if(TARGET "daqiri::${_daqiri_engine}")
list(APPEND _daqiri_targets "daqiri::${_daqiri_engine}")
endif()
endforeach()

# DAQIRI static packages can contain cross-references between core and manager archives.
# DAQIRI static packages can contain cross-references between core and engine archives.
string(JOIN "," _daqiri_link_group ${_daqiri_targets})
target_link_libraries("${target_name}" PRIVATE "$<LINK_GROUP:RESCAN,${_daqiri_link_group}>")
endfunction()
Loading