1# Copyright (c) 2012 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5{ 6 'conditions': [ 7 ['use_system_protobuf==0', { 8 'conditions': [ 9 ['OS!="win"', { 10 'variables': { 11 'config_h_dir': 12 '.', # crafted for gcc/linux. 13 }, 14 }, { # else, OS=="win" 15 'variables': { 16 'config_h_dir': 17 'vsprojects', # crafted for msvc. 18 }, 19 'target_defaults': { 20 'msvs_disabled_warnings': [ 21 4018, # signed/unsigned mismatch in comparison 22 4244, # implicit conversion, possible loss of data 23 4355, # 'this' used in base member initializer list 24 4267, # size_t to int truncation 25 4291, # no matching operator delete for a placement new 26 ], 27 'defines!': [ 28 'WIN32_LEAN_AND_MEAN', # Protobuf defines this itself. 29 ], 30 }, 31 }], 32 ['OS=="ios" and "<(GENERATOR)"!="ninja"', { 33 'variables': { 34 'ninja_output_dir': 'ninja-protoc', 35 'ninja_product_dir': 36 '<(DEPTH)/xcodebuild/<(ninja_output_dir)/<(CONFIGURATION_NAME)', 37 # Gyp to rerun 38 're_run_targets': [ 39 'third_party/protobuf/protobuf.gyp', 40 ], 41 }, 42 'targets': [ 43 { 44 # On iOS, generating protoc is done via two actions: (1) compiling 45 # the executable with ninja, and (2) copying the executable into a 46 # location that is shared with other projects. These actions are 47 # separated into two targets in order to be able to specify that the 48 # second action should not run until the first action finishes (since 49 # the ordering of multiple actions in one target is defined only by 50 # inputs and outputs, and it's impossible to set correct inputs for 51 # the ninja build, so setting all the inputs and outputs isn't an 52 # option). The first target is given here; the second target is the 53 # normal protoc target under the condition that "OS==iOS". 54 'target_name': 'compile_protoc', 55 'type': 'none', 56 'includes': ['../../build/ios/mac_build.gypi'], 57 'actions': [ 58 { 59 'action_name': 'compile protoc', 60 'inputs': [], 61 'outputs': [], 62 'action': [ 63 '<@(ninja_cmd)', 64 'protoc', 65 ], 66 'message': 'Generating the C++ protocol buffers compiler', 67 }, 68 ], 69 }, 70 ], 71 }], 72 ['OS=="android"', { 73 'targets': [ 74 { 75 'target_name': 'protobuf_lite_javalib', 76 'type' : 'none', 77 'dependencies': [ 78 'protoc#host', 79 ], 80 'variables': { 81 'script_descriptors': './protobuf_lite_java_descriptor_proto.py', 82 'script_pom': './protobuf_lite_java_parse_pom.py', 83 'protoc': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)', 84 # Variables needed by java.gypi below. 85 'java_out_dir': '<(PRODUCT_DIR)/java_proto/protobuf_lite_java_descriptor_proto', 86 'generated_src_dirs': ['<(java_out_dir)'], 87 'java_in_dir': 'java', 88 'maven_pom': '<(java_in_dir)/pom.xml', 89 'javac_includes': ['<!@(<(script_pom) <(maven_pom))'], 90 'additional_input_paths': [ 91 '<(java_out_dir)/com/google/protobuf/DescriptorProtos.java' 92 ], 93 }, 94 'actions': [ 95 { 96 'action_name': 'protobuf_lite_java_gen_descriptor_proto', 97 'inputs': [ 98 '<(script_descriptors)', 99 '<(protoc)', 100 'src/google/protobuf/descriptor.proto', 101 ], 102 'outputs': [ 103 '<(java_out_dir)/com/google/protobuf/DescriptorProtos.java', 104 ], 105 'action': [ 106 '<(script_descriptors)', 107 '<(protoc)', 108 '<(java_out_dir)', 109 'src', 110 'src/google/protobuf/descriptor.proto', 111 ], 112 'message': 'Generating descriptor protos for Java', 113 }, 114 ], 115 # Now that we have generated DescriptorProtos.java, build jar. 116 'includes': ['../../build/java.gypi'], 117 }, 118 ] 119 }], 120 ], 121 'targets': [ 122 # The "lite" lib is about 1/7th the size of the heavy lib, 123 # but it doesn't support some of the more exotic features of 124 # protobufs, like reflection. To generate C++ code that can link 125 # against the lite version of the library, add the option line: 126 # 127 # option optimize_for = LITE_RUNTIME; 128 # 129 # to your .proto file. 130 { 131 'target_name': 'protobuf_lite', 132 'type': '<(component)', 133 'toolsets': ['host', 'target'], 134 'includes': [ 135 'protobuf_lite.gypi', 136 ], 137 # Required for component builds. See http://crbug.com/172800. 138 'defines': [ 139 'LIBPROTOBUF_EXPORTS', 140 'PROTOBUF_USE_DLLS', 141 ], 142 'direct_dependent_settings': { 143 'defines': [ 144 'PROTOBUF_USE_DLLS', 145 ], 146 }, 147 }, 148 # This is the full, heavy protobuf lib that's needed for c++ .protos 149 # that don't specify the LITE_RUNTIME option. The protocol 150 # compiler itself (protoc) falls into that category. 151 # 152 # DO NOT LINK AGAINST THIS TARGET IN CHROME CODE --agl 153 { 154 'target_name': 'protobuf_full_do_not_use', 155 'type': 'static_library', 156 'toolsets': ['host','target'], 157 'includes': [ 158 'protobuf_lite.gypi', 159 ], 160 'sources': [ 161 'src/google/protobuf/descriptor.h', 162 'src/google/protobuf/descriptor.pb.h', 163 'src/google/protobuf/descriptor_database.h', 164 'src/google/protobuf/dynamic_message.h', 165 'src/google/protobuf/generated_enum_reflection.h', 166 'src/google/protobuf/generated_message_reflection.h', 167 'src/google/protobuf/message.h', 168 'src/google/protobuf/reflection_ops.h', 169 'src/google/protobuf/service.h', 170 'src/google/protobuf/text_format.h', 171 'src/google/protobuf/wire_format.h', 172 'src/google/protobuf/io/gzip_stream.h', 173 'src/google/protobuf/io/printer.h', 174 'src/google/protobuf/io/tokenizer.h', 175 'src/google/protobuf/io/zero_copy_stream_impl.h', 176 'src/google/protobuf/compiler/code_generator.h', 177 'src/google/protobuf/compiler/command_line_interface.h', 178 'src/google/protobuf/compiler/importer.h', 179 'src/google/protobuf/compiler/java/java_doc_comment.cc', 180 'src/google/protobuf/compiler/java/java_doc_comment.h', 181 'src/google/protobuf/compiler/parser.h', 182 183 'src/google/protobuf/stubs/strutil.cc', 184 'src/google/protobuf/stubs/strutil.h', 185 'src/google/protobuf/stubs/substitute.cc', 186 'src/google/protobuf/stubs/substitute.h', 187 'src/google/protobuf/stubs/stl_util.h', 188 'src/google/protobuf/stubs/stringprintf.cc', 189 'src/google/protobuf/stubs/stringprintf.h', 190 'src/google/protobuf/stubs/structurally_valid.cc', 191 'src/google/protobuf/stubs/template_util.h', 192 'src/google/protobuf/stubs/type_traits.h', 193 194 'src/google/protobuf/descriptor.cc', 195 'src/google/protobuf/descriptor.pb.cc', 196 'src/google/protobuf/descriptor_database.cc', 197 'src/google/protobuf/dynamic_message.cc', 198 'src/google/protobuf/extension_set.cc', 199 'src/google/protobuf/extension_set.h', 200 'src/google/protobuf/extension_set_heavy.cc', 201 'src/google/protobuf/generated_message_reflection.cc', 202 'src/google/protobuf/message.cc', 203 'src/google/protobuf/reflection_ops.cc', 204 'src/google/protobuf/service.cc', 205 'src/google/protobuf/text_format.cc', 206 'src/google/protobuf/wire_format.cc', 207 # This file pulls in zlib, but it's not actually used by protoc, so 208 # instead of compiling zlib for the host, let's just exclude this. 209 # 'src/src/google/protobuf/io/gzip_stream.cc', 210 'src/google/protobuf/io/printer.cc', 211 'src/google/protobuf/io/tokenizer.cc', 212 'src/google/protobuf/io/zero_copy_stream_impl.cc', 213 'src/google/protobuf/compiler/importer.cc', 214 'src/google/protobuf/compiler/parser.cc', 215 ], 216 }, 217 { 218 'target_name': 'protoc', 219 'conditions': [ 220 ['OS!="ios" or "<(GENERATOR)"=="ninja"', { 221 'type': 'executable', 222 'toolsets': ['host'], 223 'sources': [ 224 'src/google/protobuf/compiler/code_generator.cc', 225 'src/google/protobuf/compiler/command_line_interface.cc', 226 'src/google/protobuf/compiler/plugin.cc', 227 'src/google/protobuf/compiler/plugin.pb.cc', 228 'src/google/protobuf/compiler/subprocess.cc', 229 'src/google/protobuf/compiler/subprocess.h', 230 'src/google/protobuf/compiler/zip_writer.cc', 231 'src/google/protobuf/compiler/zip_writer.h', 232 'src/google/protobuf/compiler/cpp/cpp_enum.cc', 233 'src/google/protobuf/compiler/cpp/cpp_enum.h', 234 'src/google/protobuf/compiler/cpp/cpp_enum_field.cc', 235 'src/google/protobuf/compiler/cpp/cpp_enum_field.h', 236 'src/google/protobuf/compiler/cpp/cpp_extension.cc', 237 'src/google/protobuf/compiler/cpp/cpp_extension.h', 238 'src/google/protobuf/compiler/cpp/cpp_field.cc', 239 'src/google/protobuf/compiler/cpp/cpp_field.h', 240 'src/google/protobuf/compiler/cpp/cpp_file.cc', 241 'src/google/protobuf/compiler/cpp/cpp_file.h', 242 'src/google/protobuf/compiler/cpp/cpp_generator.cc', 243 'src/google/protobuf/compiler/cpp/cpp_helpers.cc', 244 'src/google/protobuf/compiler/cpp/cpp_helpers.h', 245 'src/google/protobuf/compiler/cpp/cpp_message.cc', 246 'src/google/protobuf/compiler/cpp/cpp_message.h', 247 'src/google/protobuf/compiler/cpp/cpp_message_field.cc', 248 'src/google/protobuf/compiler/cpp/cpp_message_field.h', 249 'src/google/protobuf/compiler/cpp/cpp_primitive_field.cc', 250 'src/google/protobuf/compiler/cpp/cpp_primitive_field.h', 251 'src/google/protobuf/compiler/cpp/cpp_service.cc', 252 'src/google/protobuf/compiler/cpp/cpp_service.h', 253 'src/google/protobuf/compiler/cpp/cpp_string_field.cc', 254 'src/google/protobuf/compiler/cpp/cpp_string_field.h', 255 'src/google/protobuf/compiler/java/java_enum.cc', 256 'src/google/protobuf/compiler/java/java_enum.h', 257 'src/google/protobuf/compiler/java/java_enum_field.cc', 258 'src/google/protobuf/compiler/java/java_enum_field.h', 259 'src/google/protobuf/compiler/java/java_extension.cc', 260 'src/google/protobuf/compiler/java/java_extension.h', 261 'src/google/protobuf/compiler/java/java_field.cc', 262 'src/google/protobuf/compiler/java/java_field.h', 263 'src/google/protobuf/compiler/java/java_file.cc', 264 'src/google/protobuf/compiler/java/java_file.h', 265 'src/google/protobuf/compiler/java/java_generator.cc', 266 'src/google/protobuf/compiler/java/java_helpers.cc', 267 'src/google/protobuf/compiler/java/java_helpers.h', 268 'src/google/protobuf/compiler/java/java_message.cc', 269 'src/google/protobuf/compiler/java/java_message.h', 270 'src/google/protobuf/compiler/java/java_message_field.cc', 271 'src/google/protobuf/compiler/java/java_message_field.h', 272 'src/google/protobuf/compiler/java/java_primitive_field.cc', 273 'src/google/protobuf/compiler/java/java_primitive_field.h', 274 'src/google/protobuf/compiler/java/java_service.cc', 275 'src/google/protobuf/compiler/java/java_service.h', 276 'src/google/protobuf/compiler/java/java_string_field.cc', 277 'src/google/protobuf/compiler/java/java_string_field.h', 278 'src/google/protobuf/compiler/python/python_generator.cc', 279 'src/google/protobuf/compiler/main.cc', 280 ], 281 'dependencies': [ 282 'protobuf_full_do_not_use', 283 ], 284 'include_dirs': [ 285 '<(config_h_dir)', 286 'src/src', 287 ], 288 }, { # else, OS=="ios" and "<(GENERATOR)"!="ninja" 289 'type': 'none', 290 'dependencies': [ 291 'compile_protoc', 292 ], 293 'actions': [ 294 { 295 'action_name': 'copy protoc', 296 'inputs': [ 297 '<(ninja_product_dir)/protoc', 298 ], 299 'outputs': [ 300 '<(PRODUCT_DIR)/protoc', 301 ], 302 'action': [ 303 'cp', 304 '<(ninja_product_dir)/protoc', 305 '<(PRODUCT_DIR)/protoc', 306 ], 307 }, 308 ], 309 }], 310 ], 311 }, 312 { 313 # Generate the python module needed by all protoc-generated Python code. 314 'target_name': 'py_proto', 315 'type': 'none', 316 'copies': [ 317 { 318 'destination': '<(PRODUCT_DIR)/pyproto/google/', 319 'files': [ 320 # google/ module gets an empty __init__.py. 321 '__init__.py', 322 ], 323 }, 324 { 325 'destination': '<(PRODUCT_DIR)/pyproto/google/protobuf', 326 'files': [ 327 'python/google/protobuf/__init__.py', 328 'python/google/protobuf/descriptor.py', 329 'python/google/protobuf/descriptor_database.py', 330 'python/google/protobuf/descriptor_pool.py', 331 'python/google/protobuf/message.py', 332 'python/google/protobuf/message_factory.py', 333 'python/google/protobuf/reflection.py', 334 'python/google/protobuf/service.py', 335 'python/google/protobuf/service_reflection.py', 336 'python/google/protobuf/text_format.py', 337 338 # TODO(ncarter): protoc's python generator treats 339 # descriptor.proto specially, but it's not possible to trigger 340 # the special treatment unless you run protoc from ./src/src 341 # (the treatment is based on the path to the .proto file 342 # matching a constant exactly). I'm not sure how to convince 343 # gyp to execute a rule from a different directory. Until this 344 # is resolved, use a copy of descriptor_pb2.py that I manually 345 # generated. 346 'descriptor_pb2.py', 347 ], 348 }, 349 { 350 'destination': '<(PRODUCT_DIR)/pyproto/google/protobuf/internal', 351 'files': [ 352 'python/google/protobuf/internal/__init__.py', 353 'python/google/protobuf/internal/api_implementation.py', 354 'python/google/protobuf/internal/containers.py', 355 'python/google/protobuf/internal/cpp_message.py', 356 'python/google/protobuf/internal/decoder.py', 357 'python/google/protobuf/internal/encoder.py', 358 'python/google/protobuf/internal/enum_type_wrapper.py', 359 'python/google/protobuf/internal/generator_test.py', 360 'python/google/protobuf/internal/message_listener.py', 361 'python/google/protobuf/internal/python_message.py', 362 'python/google/protobuf/internal/type_checkers.py', 363 'python/google/protobuf/internal/wire_format.py', 364 ], 365 }, 366 ], 367 # # We can't generate a proper descriptor_pb2.py -- see earlier comment. 368 # 'rules': [ 369 # { 370 # 'rule_name': 'genproto', 371 # 'extension': 'proto', 372 # 'inputs': [ 373 # '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)', 374 # ], 375 # 'variables': { 376 # # The protoc compiler requires a proto_path argument with the 377 # # directory containing the .proto file. 378 # 'rule_input_relpath': 'src/google/protobuf', 379 # }, 380 # 'outputs': [ 381 # '<(PRODUCT_DIR)/pyproto/google/protobuf/<(RULE_INPUT_ROOT)_pb2.py', 382 # ], 383 # 'action': [ 384 # '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)', 385 # '-I./src', 386 # '-I.', 387 # '--python_out=<(PRODUCT_DIR)/pyproto/google/protobuf', 388 # 'google/protobuf/descriptor.proto', 389 # ], 390 # 'message': 'Generating Python code from <(RULE_INPUT_PATH)', 391 # }, 392 # ], 393 # 'dependencies': [ 394 # 'protoc#host', 395 # ], 396 # 'sources': [ 397 # 'src/google/protobuf/descriptor.proto', 398 # ], 399 }, 400 ], 401 }, { # use_system_protobuf==1 402 'targets': [ 403 { 404 'target_name': 'protobuf_lite', 405 'type': 'none', 406 'direct_dependent_settings': { 407 'cflags': [ 408 # Use full protobuf, because vanilla protobuf doesn't have 409 # our custom patch to retain unknown fields in lite mode. 410 '<!@(pkg-config --cflags protobuf)', 411 ], 412 'defines': [ 413 'USE_SYSTEM_PROTOBUF', 414 415 # This macro must be defined to suppress the use 416 # of dynamic_cast<>, which requires RTTI. 417 'GOOGLE_PROTOBUF_NO_RTTI', 418 'GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER', 419 ], 420 }, 421 'link_settings': { 422 # Use full protobuf, because vanilla protobuf doesn't have 423 # our custom patch to retain unknown fields in lite mode. 424 'ldflags': [ 425 '<!@(pkg-config --libs-only-L --libs-only-other protobuf)', 426 ], 427 'libraries': [ 428 '<!@(pkg-config --libs-only-l protobuf)', 429 ], 430 }, 431 }, 432 { 433 'target_name': 'protoc', 434 'type': 'none', 435 'toolsets': ['host', 'target'], 436 }, 437 { 438 'target_name': 'py_proto', 439 'type': 'none', 440 }, 441 ], 442 }], 443 ], 444} 445