1# **EXPERIMENTAL** 2# 3# See http://sebs.googlecode.com 4# 5# This is an experimental build definition file using the SEBS build system. 6# I (Kenton Varda, maintainer of Protocol Buffers) happen to be the author of 7# SEBS, though SEBS is not a Google project. I'm sticking this file in 8# protobuf's SVN because that's the easiest place for me to put it, and it 9# shouldn't harm anyone. This file is not included in the distribution. 10# 11# Currently, to use this file, you must generate config.h and put it at the 12# top level of the source tree. 13 14_cpp = sebs.import_("//sebs/cpp.sebs") 15 16# ==================================================================== 17# Public targets 18 19protobuf_lite = _cpp.Library( 20 name = "protobuf-lite", 21 srcs = [ "stubs/common.cc", 22 "stubs/once.cc", 23 "stubs/hash.cc", 24 "stubs/hash.h", 25 "stubs/map-util.h", 26 "stubs/stl_util-inl.h", 27 "extension_set.cc", 28 "generated_message_util.cc", 29 "message_lite.cc", 30 "repeated_field.cc", 31 "wire_format_lite.cc", 32 "io/coded_stream.cc", 33 "io/zero_copy_stream.cc", 34 "io/zero_copy_stream_impl_lite.cc" ], 35 deps = [ _cpp.SystemLibrary(name = "pthread") ]) 36 37protobuf = _cpp.Library( 38 name = "protobuf", 39 srcs = [ "stubs/strutil.cc", 40 "stubs/strutil.h", 41 "stubs/substitute.cc", 42 "stubs/substitute.h", 43 "stubs/structurally_valid.cc", 44 "descriptor.cc", 45 "descriptor.pb.cc", 46 "descriptor_database.cc", 47 "dynamic_message.cc", 48 "extension_set_heavy.cc", 49 "generated_message_reflection.cc", 50 "message.cc", 51 "reflection_ops.cc", 52 "service.cc", 53 "text_format.cc", 54 "unknown_field_set.cc", 55 "wire_format.cc", 56 "io/gzip_stream.cc", 57 "io/printer.cc", 58 "io/tokenizer.cc", 59 "io/zero_copy_stream_impl.cc", 60 "compiler/importer.cc", 61 "compiler/parser.cc" ], 62 deps = [ protobuf_lite, 63 _cpp.SystemLibrary(name = "z") ]) 64 65libprotoc = _cpp.Library( 66 name = "protoc", 67 srcs = [ "compiler/code_generator.cc", 68 "compiler/command_line_interface.cc", 69 "compiler/cpp/cpp_enum.cc", 70 "compiler/cpp/cpp_enum.h", 71 "compiler/cpp/cpp_enum_field.cc", 72 "compiler/cpp/cpp_enum_field.h", 73 "compiler/cpp/cpp_extension.cc", 74 "compiler/cpp/cpp_extension.h", 75 "compiler/cpp/cpp_field.cc", 76 "compiler/cpp/cpp_field.h", 77 "compiler/cpp/cpp_file.cc", 78 "compiler/cpp/cpp_file.h", 79 "compiler/cpp/cpp_generator.cc", 80 "compiler/cpp/cpp_helpers.cc", 81 "compiler/cpp/cpp_helpers.h", 82 "compiler/cpp/cpp_message.cc", 83 "compiler/cpp/cpp_message.h", 84 "compiler/cpp/cpp_message_field.cc", 85 "compiler/cpp/cpp_message_field.h", 86 "compiler/cpp/cpp_primitive_field.cc", 87 "compiler/cpp/cpp_primitive_field.h", 88 "compiler/cpp/cpp_service.cc", 89 "compiler/cpp/cpp_service.h", 90 "compiler/cpp/cpp_string_field.cc", 91 "compiler/cpp/cpp_string_field.h", 92 "compiler/java/java_enum.cc", 93 "compiler/java/java_enum.h", 94 "compiler/java/java_enum_field.cc", 95 "compiler/java/java_enum_field.h", 96 "compiler/java/java_extension.cc", 97 "compiler/java/java_extension.h", 98 "compiler/java/java_field.cc", 99 "compiler/java/java_field.h", 100 "compiler/java/java_file.cc", 101 "compiler/java/java_file.h", 102 "compiler/java/java_generator.cc", 103 "compiler/java/java_helpers.cc", 104 "compiler/java/java_helpers.h", 105 "compiler/java/java_message.cc", 106 "compiler/java/java_message.h", 107 "compiler/java/java_message_field.cc", 108 "compiler/java/java_message_field.h", 109 "compiler/java/java_primitive_field.cc", 110 "compiler/java/java_primitive_field.h", 111 "compiler/java/java_service.cc", 112 "compiler/java/java_service.h", 113 "compiler/python/python_generator.cc" ], 114 deps = [ protobuf ]) 115 116protoc = _cpp.Binary( 117 name = "protoc", 118 srcs = [ "compiler/main.cc" ], 119 deps = [ libprotoc ]) 120 121# ==================================================================== 122# ProtobufLibrary rule class 123 124class ProtobufLibrary(sebs.Rule): 125 argument_spec = sebs.ArgumentSpec(srcs = [sebs.Artifact], 126 deps = ([sebs.Rule], []), 127 lite = (bool, False)) 128 129 def _expand(self, args): 130 for dep in args.deps: 131 if not isinstance(dep, ProtobufLibrary): 132 raise sebs.DefinitionError( 133 "Dependency of ProtobufLibrary is not a ProtobufLibrary: %s" % dep) 134 135 protoc.expand_once() 136 137 # We must build protoc for the host configuration to allow cross-compiling. 138 host_protoc = self.context.configured_artifact(protoc.binary, "host") 139 140 protoc_action = self.context.action(self, "protobuf") 141 protoc_args = [host_protoc, "-Isrc", "-Itmp", "-Iinclude","--cpp_out=tmp"] 142 143 cpp_srcs = [] 144 for src in args.srcs: 145 protoc_args.append(src) 146 147 # We cannot build .proto files from other packages because the .pb.cc 148 # and .pb.h files would be written to that package, and we aren't allowed 149 # to write to other packages. 150 if self.context.local_filename(src) is None: 151 raise sebs.DefinitionError( 152 "Source file is not in this package: %s" % src) 153 154 cc_artifact = self.context.derived_artifact(src, ".pb.cc", protoc_action) 155 header_artifact = self.context.derived_artifact( 156 src, ".pb.h", protoc_action) 157 158 cpp_srcs.append(cc_artifact) 159 cpp_srcs.append(header_artifact) 160 161 protoc_action.set_command( 162 sebs.SubprocessCommand(protoc_action, protoc_args, implicit = cpp_srcs)) 163 164 deps = list(args.deps) 165 if args.lite: 166 deps.append(protobuf_lite) 167 else: 168 deps.append(protobuf) 169 170 self.__cpp_library = _cpp.Library(srcs = cpp_srcs, deps = deps, 171 context = self.context) 172 self.__cpp_library.label = self.label 173 self.outputs = [] 174 175 def as_cpp_library(self): 176 self.expand_once() 177 return self.__cpp_library 178 179# ==================================================================== 180# Tests 181 182_lite_test_protos = ProtobufLibrary( 183 srcs = [ "unittest_lite.proto", 184 "unittest_import_lite.proto" ], 185 lite = True) 186_test_protos = ProtobufLibrary( 187 srcs = [ "unittest.proto", 188 "unittest_empty.proto", 189 "unittest_import.proto", 190 "unittest_mset.proto", 191 "unittest_optimize_for.proto", 192 "unittest_embed_optimize_for.proto", 193 "unittest_custom_options.proto", 194 "unittest_lite_imports_nonlite.proto", 195 "compiler/cpp/cpp_test_bad_identifiers.proto" ], 196 deps = [ _lite_test_protos ]) 197 198_test_util = _cpp.Library( 199 name = "test_util", 200 srcs = [ "test_util.cc", 201 "test_util.h", 202 "testing/googletest.cc", 203 "testing/googletest.h", 204 "testing/file.cc", 205 "testing/file.h" ], 206 deps = [ protobuf, _test_protos, _cpp.SystemLibrary(name = "gtest")] ) 207 208protobuf_lite_test = _cpp.Test( 209 srcs = [ "lite_unittest.cc", 210 "test_util_lite.cc", 211 "test_util_lite.h" ], 212 deps = [ _lite_test_protos ]) 213 214protobuf_test = _cpp.Test( 215 srcs = [ "stubs/common_unittest.cc", 216 "stubs/once_unittest.cc", 217 "stubs/strutil_unittest.cc", 218 "stubs/structurally_valid_unittest.cc", 219 "descriptor_database_unittest.cc", 220 "descriptor_unittest.cc", 221 "dynamic_message_unittest.cc", 222 "extension_set_unittest.cc", 223 "generated_message_reflection_unittest.cc", 224 "message_unittest.cc", 225 "reflection_ops_unittest.cc", 226 "repeated_field_unittest.cc", 227 "text_format_unittest.cc", 228 "unknown_field_set_unittest.cc", 229 "wire_format_unittest.cc", 230 "io/coded_stream_unittest.cc", 231 "io/printer_unittest.cc", 232 "io/tokenizer_unittest.cc", 233 "io/zero_copy_stream_unittest.cc", 234 "compiler/command_line_interface_unittest.cc", 235 "compiler/importer_unittest.cc", 236 "compiler/parser_unittest.cc", 237 "compiler/cpp/cpp_bootstrap_unittest.cc", 238 "compiler/cpp/cpp_unittest.cc" ], 239 deps = [ protobuf, libprotoc, _test_util, 240 _cpp.SystemLibrary(name = "gtest_main") ]) 241