Skip to content

Commit

Permalink
Harmonic bazel
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Carroll <[email protected]>
  • Loading branch information
mjcarroll committed Oct 12, 2023
1 parent 18bf943 commit 78146c1
Show file tree
Hide file tree
Showing 9 changed files with 632 additions and 182 deletions.
116 changes: 83 additions & 33 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ load(
)
load(
"@gz//msgs/tools:gz_msgs_generate.bzl",
"get_proto_headers",
"gz_msgs_generate",
"gz_proto_library",
"gz_proto_factory",
)

package(
Expand All @@ -24,56 +24,48 @@ exports_files(["LICENSE"])

gz_configure_header(
name = "msgs_config_hh",
src = "include/gz/msgs/config.hh.in",
src = "core/include/gz/msgs/config.hh.in",
cmakelists = ["CMakeLists.txt"],
package = "msgs",
)

gz_export_header(
name = "include/gz/msgs/Export.hh",
name = "core/include/gz/msgs/Export.hh",
export_base = "GZ_MSGS",
lib_name = "gz-msgs",
visibility = ["//visibility:private"],
)

public_headers_no_gen = glob([
"include/gz/msgs/*.hh",
"include/gz/msgs/detail/*.hh",
"core/include/gz/msgs/*.hh",
"core/include/gz/msgs/convert/*.hh",
"core/include/gz/msgs/detail/*.hh",
])

protos = glob(["proto/gz/msgs/*.proto"])

gz_include_header(
name = "messagetypes_hh_genrule",
out = "include/gz/msgs/MessageTypes.hh",
hdrs = get_proto_headers(protos),
strip_prefix = ["gz_msgs"],
)

gz_include_header(
name = "msgs_hh_genrule",
out = "include/gz/msgs.hh",
hdrs = public_headers_no_gen + [
"include/gz/msgs/config.hh",
"include/gz/msgs/Export.hh",
"include/gz/msgs/MessageTypes.hh",
"core/include/gz/msgs/config.hh",
"core/include/gz/msgs/Export.hh",
],
)

public_headers = public_headers_no_gen + [
"include/gz/msgs/config.hh",
"include/gz/msgs/Export.hh",
"include/gz/msgs/MessageTypes.hh",
"core/include/gz/msgs/config.hh",
"core/include/gz/msgs/Export.hh",
"include/gz/msgs.hh",
]

# Custom Gazebo Protoc plugin
cc_binary(
name = "gz_msgs_gen",
srcs = [
"src/Generator.cc",
"src/Generator.hh",
"src/generator_main.cc",
"core/generator_lite/Generator.cc",
"core/generator_lite/Generator.hh",
"core/generator_lite/generator_main.cc",
],
deps = [
"@com_google_protobuf//:protobuf",
Expand All @@ -91,26 +83,37 @@ proto_library(
],
)

gz_msgs_generate(
name = "gzmsgs_cc_proto",
deps = [
":gzmsgs_proto",
"@com_google_protobuf//:any_proto",
],
gz_proto_library(
name = "gzmsgs_cc_proto",
proto_deps = [":gzmsgs_proto"],
deps = [
"@com_google_protobuf//:protobuf",
]
)

gz_proto_factory(
name = "gzmsgs_proto_factory",
deps = [":gzmsgs_proto"],
namespace = "gz::msgs",
cc_output = "core/src/RegisterMsgs.cc",
hh_output = "core/src/MessageTypes.hh"
)

cc_library(
name = "msgs",
srcs = [
"src/Factory.cc",
"src/Filesystem.cc",
"src/Utility.cc",
":gzmsgs_cc_proto",
"core/src/Factory.cc",
"core/src/DynamicFactory.cc",
"core/src/DynamicFactory.hh",
"core/src/MessageFactory.cc",
"core/src/impl/InstallationDirectories.cc",
"core/src/RegisterMsgs.cc"
],
hdrs = public_headers,
includes = ["include"],
includes = ["core/include", "core/src"],
deps = [
":gzmsgs_cc_proto",
":gzmsgs_proto_factory",
GZ_ROOT + "math",
"@com_google_protobuf//:protobuf",
"@tinyxml2",
Expand Down Expand Up @@ -138,3 +141,50 @@ test_sources = glob(
"@gtest//:gtest_main",
],
) for src in test_sources]


cc_test(
name = "INTEGRATION_headers",
srcs = ["test/integration/headers.cc"],
deps = [
":gzmsgs_cc_proto",
"@gtest",
"@gtest//:gtest_main",
],
)

cc_test(
name = "INTEGRATION_image_msg",
srcs = ["test/integration/image_msg.cc"],
deps = [
":gzmsgs_cc_proto",
"@gtest",
"@gtest//:gtest_main",
],
)

cc_test(
name = "INTEGRATION_Utility",
srcs = ["test/integration/Utility_TEST.cc"],
deps = [
":msgs",
GZ_ROOT + "common/testing",
"@gtest",
"@gtest//:gtest_main",
],
)

cc_test(
name = "INTEGRATION_Factory",
srcs = ["test/integration/Factory_TEST.cc"],
data = ["test/desc/stringmsg.desc"],
deps = [
":msgs",
GZ_ROOT + "common/testing",
"@gtest",
"@gtest//:gtest_main",
],
defines = [
'GZ_MSGS_TEST_PATH=\\"msgs/test\\"',
],
)
116 changes: 116 additions & 0 deletions core/generator_lite/Generator.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
* Copyright 2016 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#include <algorithm>
#include <filesystem>
#include <iostream>
#include <fstream>
#include <map>
#include <memory>
#include <sstream>
#include <string>
#include <utility>
#include <vector>

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4100 4512 4127 4068 4244 4267 4251 4146)
#endif

#include <google/protobuf/descriptor.h>
#include <google/protobuf/compiler/code_generator.h>
#include <google/protobuf/io/printer.h>
#include <google/protobuf/io/zero_copy_stream.h>
#include <google/protobuf/descriptor.pb.h>

#ifdef _MSC_VER
#pragma warning(pop)
#endif

#include "Generator.hh"

namespace google::protobuf::compiler::cpp {

/////////////////////////////////////////////////
Generator::Generator(const std::string &/*_name*/)
{
}

/////////////////////////////////////////////////
Generator::~Generator() = default;

/////////////////////////////////////////////////
bool Generator::Generate(const FileDescriptor *_file,
const std::string &/*_parameter*/,
OutputDirectory *_generatorContext,
std::string * /*_error*/) const
{
std::string delim = ".proto";
auto headerFilename = _file->name();
auto sourceFilename = _file->name();

{
auto pos = headerFilename.rfind(delim);
headerFilename.replace(pos, delim.size(), ".pb.h");
}
{
auto pos = sourceFilename.rfind(delim);
sourceFilename.replace(pos, delim.size(), ".pb.h");
}

{
auto *output = _generatorContext->OpenForInsert(headerFilename, "includes");
auto printer = io::Printer(output, '$');
printer.Print("#include <memory>\n", "name", "includes");
}

{
auto *output = _generatorContext->OpenForInsert(
headerFilename, "namespace_scope");
auto printer = io::Printer(output, '$');

for (auto i = 0; i < _file->message_type_count(); ++i)
{
const auto *desc = _file->message_type(i);
std::string ptrTypes;

// Define std::unique_ptr types for our messages
ptrTypes += "typedef std::unique_ptr<"
+ desc->name() + "> "
+ desc->name() + "UniquePtr;\n";

// Define const std::unique_ptr types for our messages
ptrTypes += "typedef std::unique_ptr<const "
+ desc->name() + "> Const"
+ desc->name() + "UniquePtr;\n";

// Define std::shared_ptr types for our messages
ptrTypes += "typedef std::shared_ptr<"
+ desc->name() + "> "
+ desc->name() + "SharedPtr;\n";

// Define const std::shared_ptr types for our messages
ptrTypes += "typedef std::shared_ptr<const "
+ desc->name() + "> Const"
+ desc->name() + "SharedPtr;\n";

printer.PrintRaw(ptrTypes.c_str());
}
}
return true;
}
} // namespace google::protobuf::compiler::cpp
57 changes: 57 additions & 0 deletions core/generator_lite/Generator.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright (C) 2016 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#ifndef GZ_MSGS_GENERATOR_HH_
#define GZ_MSGS_GENERATOR_HH_

#include <google/protobuf/compiler/code_generator.h>
#include <string>

namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
/// \cond
/// \brief Google protobuf message generator for igntion::msgs
class Generator : public CodeGenerator
{
/// \brief Constructor
/// \param[in] _name Name value (currently unused)
public: explicit Generator(const std::string &_name);

/// \brief Destructor
public: virtual ~Generator();

/// \brief Generate a message.
/// \param[in] _file File descriptor of the message.
/// \param[in] _parameter Unused string value
/// \param[in] _generatorContext Output directory.
/// \param[in] _error Unused string value
/// \return true if successful, otherwise sets _error and returns false
public: virtual bool Generate(const FileDescriptor *_file,
const std::string &_parameter,
OutputDirectory *_generatorContext,
std::string *_error) const;

// private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator);
};
/// \endcond
}
}
}
}
#endif
42 changes: 42 additions & 0 deletions core/generator_lite/generator_main.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2016 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4251)
#endif

#include <google/protobuf/compiler/plugin.h>

#ifdef _MSC_VER
#pragma warning(pop)
#endif

#include "Generator.hh"

int main(int _argc, char *_argv[])
{
#ifdef _MSC_VER
// Don't print a silly message or stick a modal dialog box in my face,
// please.
_set_abort_behavior(0, ~0);
#endif // !_MSC_VER

google::protobuf::compiler::cpp::Generator
generator("gz-msgs-plugin");
return google::protobuf::compiler::PluginMain(_argc, _argv, &generator);
}
Loading

0 comments on commit 78146c1

Please sign in to comment.