diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 000000000..ab0733b0d --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,140 @@ +load( + "@gz//bazel/skylark:build_defs.bzl", + "GZ_FEATURES", + "GZ_ROOT", + "GZ_VISIBILITY", + "gz_configure_header", + "gz_export_header", + "gz_include_header", +) +load( + "@gz//bazel/lint:lint.bzl", + "add_lint_tests", +) +load("@rules_license//rules:license.bzl", "license") + +package( + default_applicable_licenses = [GZ_ROOT + "physics:license"], + default_visibility = GZ_VISIBILITY, + features = GZ_FEATURES, +) + +license( + name = "license", + package_name = "gz-physics", +) + +licenses(["notice"]) + +exports_files(["LICENSE"]) + +gz_configure_header( + name = "config", + src = "include/gz/physics/config.hh.in", + cmakelists = ["CMakeLists.txt"], + defines = { + # These definitions are unused, + # this is merely to suppress generator warnings + "GZ_PHYSICS_ENGINE_INSTALL_DIR": "unused", + }, + package = "physics", +) + +gz_export_header( + name = "include/gz/physics/Export.hh", + export_base = "GZ_PHYSICS", + lib_name = "gz-physics", + visibility = ["//visibility:private"], +) + +public_headers_no_gen = glob([ + "include/gz/physics/*.hh", + "include/gz/physics/detail/*.hh", +]) + +sources = glob( + ["src/*.cc"], + exclude = [ + "src/*_TEST.cc", + ], +) + +gz_include_header( + name = "physicshh_genrule", + out = "include/gz/physics.hh", + hdrs = public_headers_no_gen + [ + "include/gz/physics/config.hh", + "include/gz/physics/Export.hh", + ], +) + +public_headers = public_headers_no_gen + [ + "include/gz/physics/config.hh", + "include/gz/physics/Export.hh", + "include/gz/physics.hh", +] + +cc_library( + name = "physics", + srcs = sources, + hdrs = public_headers, + defines = [ + 'GZ_PHYSICS_ENGINE_RELATIVE_INSTALL_DIR=\\"unused\\"', + "GZ_PHYSICS_BAZEL_BUILD=true", + ], + includes = ["include"], + deps = [ + GZ_ROOT + "math", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "plugin:core", + GZ_ROOT + "plugin:loader", + GZ_ROOT + "utils", + ], +) + +cc_library( + name = "heightmap", + hdrs = glob([ + "heightmap/include/gz/physics/heightmap/**/*.hh", + ]), + includes = ["heightmap/include"], +) + +cc_library( + name = "mesh", + hdrs = [ + "mesh/include/gz/physics/mesh/MeshShape.hh", + "mesh/include/gz/physics/mesh/detail/MeshShape.hh", + ], + includes = ["mesh/include"], +) + +cc_library( + name = "sdf", + hdrs = glob([ + "sdf/include/gz/physics/sdf/*.hh", + ]), + includes = ["sdf/include"], + deps = [ + GZ_ROOT + "sdformat", + ], +) + +test_sources = glob(["src/*_TEST.cc"]) + +[cc_test( + name = src.replace("/", "_").replace(".cc", "").replace("src_", ""), + srcs = [src], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + }, + deps = [ + ":physics", + GZ_ROOT + "physics/test:common_test", + "@gtest", + "@gtest//:gtest_main", + ], +) for src in test_sources] + +add_lint_tests() diff --git a/bullet-featherstone/BUILD.bazel b/bullet-featherstone/BUILD.bazel new file mode 100644 index 000000000..8f2e9bc57 --- /dev/null +++ b/bullet-featherstone/BUILD.bazel @@ -0,0 +1,50 @@ +load( + "@gz//bazel/skylark:build_defs.bzl", + "GZ_ROOT", + "GZ_VISIBILITY", +) +load( + "@gz//bazel/lint:lint.bzl", + "add_lint_tests", +) + +private_headers = glob(["src/*.hh"]) + +sources = glob( + ["src/*.cc"], + exclude = [ + "src/*_TEST.cc", + "src/plugin.cc", + ], +) + +cc_library( + name = "bullet-featherstone", + srcs = sources + private_headers, + includes = ["include"], + visibility = GZ_VISIBILITY, + deps = [ + GZ_ROOT + "common", + GZ_ROOT + "common/graphics", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics", + GZ_ROOT + "physics:sdf", + GZ_ROOT + "third_party/bullet3:BulletCollision", + GZ_ROOT + "third_party/bullet3:BulletDynamics", + ], +) + +cc_binary( + name = "libgz-physics-bullet-featherstone-plugin.so", + srcs = [ + "src/plugin.cc", + ], + linkshared = True, + visibility = GZ_VISIBILITY, + deps = [ + ":bullet-featherstone", + GZ_ROOT + "plugin:register", + ], +) + +add_lint_tests() diff --git a/dartsim/BUILD.bazel b/dartsim/BUILD.bazel new file mode 100644 index 000000000..11989cc84 --- /dev/null +++ b/dartsim/BUILD.bazel @@ -0,0 +1,206 @@ +load( + "@gz//bazel/skylark:build_defs.bzl", + "GZ_ROOT", + "GZ_VISIBILITY", + "gz_configure_header", + "gz_export_header", + "gz_include_header", +) +load( + "@gz//bazel/lint:lint.bzl", + "add_lint_tests", +) + +public_headers = ["include/gz/physics/dartsim/World.hh"] + +private_headers = glob(["src/*.hh"]) + +sources = glob( + ["src/*.cc"], + exclude = [ + "src/*_TEST.cc", + "src/plugin.cc", + ], +) + +cc_library( + name = "dartsim", + srcs = sources + private_headers, + hdrs = public_headers, + includes = ["include"], + visibility = GZ_VISIBILITY, + deps = [ + GZ_ROOT + "common", + GZ_ROOT + "common/geospatial", + GZ_ROOT + "common/profiler", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics", + GZ_ROOT + "physics:heightmap", + GZ_ROOT + "physics:mesh", + GZ_ROOT + "physics:sdf", + GZ_ROOT + "third_party/dart:simulation", + GZ_ROOT + "third_party/dart:collision-bullet", + GZ_ROOT + "third_party/dart:collision-ode", + ], +) + +cc_binary( + name = "libgz-physics-dartsim-plugin.so", + srcs = [ + "src/plugin.cc", + ], + linkshared = True, + visibility = GZ_VISIBILITY, + deps = [ + ":dartsim", + GZ_ROOT + "plugin:register", + ], +) + +# AddedMassFeatures_TEST must directly link with dart:simulation +cc_test( + name = "AddedMassFeatures_TEST", + srcs = ["src/AddedMassFeatures_TEST.cc"] + private_headers + public_headers, # noqa: 501 + copts = ["-fexceptions"], + data = [ + "worlds", + ":libgz-physics-dartsim-plugin.so", + GZ_ROOT + "physics/test:resources", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + }, + includes = [ + "include", + "src", + ], + local_defines = [ + "TEST_WORLD_DIR='\"physics/dartsim/worlds/\"'", + "GZ_PHYSICS_RESOURCE_DIR='\"physics/test/resources/\"'", + "dartsim_plugin_LIB='\"physics/dartsim/libgz-physics-dartsim-plugin.so\"'", # noqa: 501 + ], + deps = [ + GZ_ROOT + "common/geospatial", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics", + GZ_ROOT + "physics:heightmap", + GZ_ROOT + "physics:mesh", + GZ_ROOT + "physics:sdf", + GZ_ROOT + "physics/test:common_test", + GZ_ROOT + "third_party/dart:simulation", + "@gtest", + "@gtest//:gtest_main", + ], +) + +# Base_TEST directly links against the dartsim library while the others +# load the plugin library via gz-plugin +cc_test( + name = "Base_TEST", + srcs = ["src/Base_TEST.cc"] + private_headers + public_headers, + copts = ["-fexceptions"], + data = [ + "worlds", + GZ_ROOT + "physics/test:resources", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + }, + includes = [ + "include", + "src", + ], + deps = [ + ":dartsim", + GZ_ROOT + "physics/test:common_test", + "@gtest", + "@gtest//:gtest_main", + ], +) + +# SDFFeatures_TEST must directly link with dart:simulation +cc_test( + name = "SDFFeatures_TEST.cc", + srcs = ["src/SDFFeatures_TEST.cc"] + private_headers + public_headers, + copts = ["-fexceptions"], + data = [ + "worlds", + ":libgz-physics-dartsim-plugin.so", + GZ_ROOT + "physics/test:resources", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + }, + includes = [ + "include", + "src", + ], + local_defines = [ + "TEST_WORLD_DIR='\"physics/dartsim/worlds/\"'", + "GZ_PHYSICS_RESOURCE_DIR='\"physics/test/resources/\"'", + "dartsim_plugin_LIB='\"physics/dartsim/libgz-physics-dartsim-plugin.so\"'", # noqa: 501 + ], + deps = [ + GZ_ROOT + "common/geospatial", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics", + GZ_ROOT + "physics:heightmap", + GZ_ROOT + "physics:mesh", + GZ_ROOT + "physics:sdf", + GZ_ROOT + "physics/test:common_test", + GZ_ROOT + "third_party/dart:simulation", + "@gtest", + "@gtest//:gtest_main", + ], +) + +test_sources = glob( + include = ["src/*_TEST.cc"], + exclude = [ + "src/AddedMassFeatures_TEST.cc", + "src/Base_TEST.cc", + "src/SDFFeatures_TEST.cc", + ], +) + +[cc_test( + name = src.replace("/", "_").replace(".cc", "").replace("src_", ""), + srcs = [src] + private_headers + public_headers, + copts = ["-fexceptions"], + data = [ + "worlds", + ":libgz-physics-dartsim-plugin.so", + GZ_ROOT + "physics/test:resources", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + }, + includes = [ + "include", + "src", + ], + local_defines = [ + "TEST_WORLD_DIR='\"physics/dartsim/worlds/\"'", + "GZ_PHYSICS_RESOURCE_DIR='\"physics/test/resources/\"'", + "dartsim_plugin_LIB='\"physics/dartsim/libgz-physics-dartsim-plugin.so\"'", # noqa: 501 + ], + deps = [ + GZ_ROOT + "common/geospatial", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics", + GZ_ROOT + "physics:heightmap", + GZ_ROOT + "physics:mesh", + GZ_ROOT + "physics:sdf", + GZ_ROOT + "physics/test:common_test", + GZ_ROOT + "third_party/dart:constraint_headers", + GZ_ROOT + "third_party/dart:simulation_headers", + "@gtest", + "@gtest//:gtest_main", + ], +) for src in test_sources] + +add_lint_tests() diff --git a/dartsim/src/AddedMassFeatures_TEST.cc b/dartsim/src/AddedMassFeatures_TEST.cc index da476827f..73d48f7b6 100644 --- a/dartsim/src/AddedMassFeatures_TEST.cc +++ b/dartsim/src/AddedMassFeatures_TEST.cc @@ -16,10 +16,12 @@ */ #include + #include +#include #include -#include +#include #include #include diff --git a/dartsim/src/EntityManagement_TEST.cc b/dartsim/src/EntityManagement_TEST.cc index 52a3e9b4a..226542e71 100644 --- a/dartsim/src/EntityManagement_TEST.cc +++ b/dartsim/src/EntityManagement_TEST.cc @@ -49,7 +49,7 @@ struct TestFeatureList : physics::FeatureList< TEST(EntityManagement_TEST, ConstructEmptyWorld) { plugin::Loader loader; - loader.LoadLib(dartsim_plugin_LIB); + loader.LoadLib(dartsim_plugin_LIB, true); plugin::PluginPtr dartsim = loader.Instantiate("gz::physics::dartsim::Plugin"); @@ -270,7 +270,7 @@ TEST(EntityManagement_TEST, ConstructEmptyWorld) TEST(EntityManagement_TEST, RemoveEntities) { plugin::Loader loader; - loader.LoadLib(dartsim_plugin_LIB); + loader.LoadLib(dartsim_plugin_LIB, true); plugin::PluginPtr dartsim = loader.Instantiate("gz::physics::dartsim::Plugin"); @@ -342,7 +342,7 @@ TEST(EntityManagement_TEST, RemoveEntities) TEST(EntityManagement_TEST, ModelByIndexWithNestedModels) { plugin::Loader loader; - loader.LoadLib(dartsim_plugin_LIB); + loader.LoadLib(dartsim_plugin_LIB, true); plugin::PluginPtr dartsim = loader.Instantiate("gz::physics::dartsim::Plugin"); diff --git a/dartsim/src/plugin.cc b/dartsim/src/plugin.cc index 0ef68cd6a..8aa14b0f9 100644 --- a/dartsim/src/plugin.cc +++ b/dartsim/src/plugin.cc @@ -62,31 +62,6 @@ class Plugin : public virtual SimulationFeatures, public virtual WorldFeatures { }; -namespace { - -// This is done as a partial fix for -// https://github.com/gazebosim/gz-physics/issues/442. The issue seems like the -// destructors for the concrete collision detectors get unloaded and deleted -// from memory before the destructors run. When it's time to actually call the -// destructors, a segfault is generated. -// -// It's not clear why the destructors are deleted prematurely. It might be a -// compiler optimization in new compiler versions. -// -// The solution here is to call the `unregisterAllCreators` function from the -// plugins translation unit in the hopes that it will force the compiler to keep -// the destructors. -struct UnregisterCollisionDetectors -{ - ~UnregisterCollisionDetectors() - { - dart::collision::CollisionDetector::getFactory()->unregisterAllCreators(); - } -}; - -UnregisterCollisionDetectors unregisterAtUnload; -} - GZ_PHYSICS_ADD_PLUGIN(Plugin, FeaturePolicy3d, DartsimFeatures) } diff --git a/src/InstallationDirectories.cc b/src/InstallationDirectories.cc index 7b9bcf459..89518d3d7 100644 --- a/src/InstallationDirectories.cc +++ b/src/InstallationDirectories.cc @@ -28,7 +28,7 @@ namespace gz { namespace physics { -inline namespace GZ_PHYSICS_VERSION_NAMESPACE { +namespace { // We locally import the gz::common::joinPaths function // See https://github.com/gazebosim/gz-physics/pull/507#discussion_r1186919267 @@ -36,19 +36,20 @@ inline namespace GZ_PHYSICS_VERSION_NAMESPACE { // Function imported from // https://github.com/gazebosim/gz-common/blob/ignition-common4_4.6.2/src/FilesystemBoost.cc#L507 -#ifndef WIN32 -static const char preferred_separator = '/'; +#ifndef _WIN32 +const char preferred_separator = '/'; #else // Windows static const char preferred_separator = '\\'; #endif -const std::string separator(const std::string &_p) +std::string separator(const std::string &_p) { return _p + preferred_separator; } +#ifdef _WIN32 // Function imported from // https://github.com/gazebosim/gz-common/blob/ignition-common4_4.6.2/src/Filesystem.cc#L227 -std::string checkWindowsPath(const std::string _path) +std::string checkWindowsPath(const std::string &_path) { if (_path.empty()) return _path; @@ -75,6 +76,7 @@ std::string checkWindowsPath(const std::string _path) result, std::regex("[<>:\"|?*]"), ""); return result; } +#endif // Function imported from // https://github.com/gazebosim/gz-common/blob/ignition-common4_4.6.2/src/Filesystem.cc#L256 @@ -101,7 +103,7 @@ std::string joinPaths(const std::string &_path1, char replacement = '/'; #else char replacement = '\\'; -#endif +#endif // _WIN32 // Sanitize the start of the path. size_t index = 0; @@ -142,7 +144,12 @@ std::string joinPaths(const std::string &_path1, #endif // _WIN32 return path; } +} +inline namespace GZ_PHYSICS_VERSION_NAMESPACE { +#ifdef GZ_PHYSICS_BAZEL_BUILD +std::string getInstallPrefix() { return "physics"; } +#endif std::string getEngineInstallDir() { diff --git a/test/BUILD.bazel b/test/BUILD.bazel new file mode 100644 index 000000000..28bb60e04 --- /dev/null +++ b/test/BUILD.bazel @@ -0,0 +1,270 @@ +load( + "@gz//bazel/skylark:build_defs.bzl", + "GZ_ROOT", + "GZ_VISIBILITY", +) + +cc_library( + name = "test_headers", + srcs = glob(["include/**/*.hh"]), + includes = ["include"], + deps = [ + GZ_ROOT + "common", + GZ_ROOT + "common/testing", + GZ_ROOT + "physics", + GZ_ROOT + "plugin:loader", + ], +) + +cc_library( + name = "common_test", + hdrs = ["common_test/Worlds.hh"], + data = [ + "common_test/worlds", + ":resources", + ], + include_prefix = "test", + includes = ["common_test"], + visibility = GZ_VISIBILITY, + deps = [ + ":test_headers", + ], +) + +cc_library( + name = "common_test_dartsim", + data = [ + GZ_ROOT + "physics/dartsim:libgz-physics-dartsim-plugin.so", + ], + deps = [ + ":common_test", + ], +) + +cc_library( + name = "common_test_bullet-featherstone", + data = [ + GZ_ROOT + "physics/bullet-featherstone:libgz-physics-bullet-featherstone-plugin.so", + ], + deps = [ + ":common_test", + ], +) + +physics_engines = [ + "dartsim", + "bullet-featherstone", +] + +[cc_test( + name = "addexternalforcetorque_%s" % engine, + srcs = [ + "common_test/addexternalforcetorque.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "basic_test_%s" % engine, + srcs = [ + "common_test/basic_test.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "collisions_%s" % engine, + srcs = [ + "common_test/collisions.cc", + ], + defines = [ + 'GZ_PHYSICS_RESOURCE_DIR=\\"physics/resources/\\"', + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "common/graphics", + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:mesh", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "construct_empty_world_%s" % engine, + srcs = [ + "common_test/construct_empty_world.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "free_joint_features_%s" % engine, + srcs = [ + "common_test/free_joint_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "joint_features_%s" % engine, + srcs = [ + "common_test/joint_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "kinematic_features_%s" % engine, + srcs = [ + "common_test/kinematic_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "physics:sdf", + "@eigen3", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "link_features_%s" % engine, + srcs = [ + "common_test/link_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "shape_features_%s" % engine, + srcs = [ + "common_test/shape_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "simulation_features_%s" % engine, + srcs = [ + "common_test/simulation_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +[cc_test( + name = "world_features_%s" % engine, + srcs = [ + "common_test/world_features.cc", + ], + env = { + "GZ_BAZEL": "1", + "GZ_BAZEL_PATH": "physics", + "LIB_TO_TEST": "physics/%s/libgz-physics-%s-plugin.so" % (engine, engine), + }, + deps = [ + ":common_test_%s" % engine, + GZ_ROOT + "math/eigen3", + GZ_ROOT + "physics:sdf", + "@gtest", + "@gtest//:gtest_main", + ], +) for engine in physics_engines] + +exports_files(["resources"]) diff --git a/test/include/test/TestLibLoader.hh b/test/include/test/TestLibLoader.hh index a7f27abd3..09fa50f70 100644 --- a/test/include/test/TestLibLoader.hh +++ b/test/include/test/TestLibLoader.hh @@ -41,13 +41,26 @@ class TestLibLoader { if (argc != 2) { - std::cerr << "Please provide the path to an engine plugin.\n" - << "Usage " << argv[0] << " \n"; - return false; + std::string envLibToTest; + if(!gz::utils::env("LIB_TO_TEST", envLibToTest)) + { + std::cerr << "Please provide the path to an engine plugin.\n" + << "Usage " << argv[0] << " \n"; + return false; + } + else + { + std::string &libToTest = LibToTest(); + libToTest = envLibToTest; + return true; + } + } + else + { + std::string &libToTest = LibToTest(); + libToTest = argv[1]; + return true; } - std::string &libToTest = LibToTest(); - libToTest = argv[1]; - return true; } /// \brief Get the name of the library to test