| load("@bazel_skylib//lib:collections.bzl", "collections") | 
 | load("@bazel_skylib//lib:paths.bzl", "paths") | 
 | load("@fbcode_macros//build_defs:native_rules.bzl", "buck_genrule") | 
 | load("@fbsource//tools/build_defs:default_platform_defs.bzl", "compose_platform_setting_list") | 
 | load("@fbsource//tools/build_defs:dict_defs.bzl", "dict_defs") | 
 | load("@fbsource//tools/build_defs:expect.bzl", "expect") | 
 | load("@fbsource//tools/build_defs:fb_xplat_cxx_library.bzl", "fb_xplat_cxx_library") | 
 | load("@fbsource//tools/build_defs:fbsource_utils.bzl", "is_arvr_mode", "is_fbcode_mode_mac") | 
 | load("@fbsource//tools/build_defs:platform_defs.bzl", "ANDROID", "APPLE", "CXX", "IOS", "MACOSX", "WINDOWS") | 
 | load("@fbsource//tools/build_defs/apple:build_mode_defs.bzl", "is_production_build") | 
 | load("@fbsource//tools/build_defs/apple:config_utils_defs.bzl", "STATIC_LIBRARY_IOS_CONFIG", "STATIC_LIBRARY_MAC_CONFIG", "fbobjc_configs") | 
 | load("@fbsource//tools/build_defs/apple:focus_config.bzl", "is_focus_enabled") | 
 | load("@fbsource//xplat/pfh/Msgr/Mobile/ProductInfra:DEFS.bzl", "Msgr_Mobile_ProductInfra") | 
 |  | 
 | def get_c2_expose_op_to_c10(): | 
 |     c2_op_to_c10 = native.read_config("caffe2", "expose_op_to_c10", "0") | 
 |  | 
 |     expect( | 
 |         c2_op_to_c10 in ("0", "1"), | 
 |         c2_op_to_c10, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_op_to_c10)) | 
 |  | 
 | def get_c2_mpscnn(): | 
 |     c2_mpscnn = native.read_config("caffe2", "enable_mpscnn", "1") | 
 |  | 
 |     expect( | 
 |         c2_mpscnn in ("0", "1"), | 
 |         c2_mpscnn, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_mpscnn)) | 
 |  | 
 | def get_c2_mpscnn_test(): | 
 |     c2_mpscnn_test = native.read_config("caffe2", "enable_mpscnn_test", "0") | 
 |  | 
 |     expect( | 
 |         c2_mpscnn_test in ("0", "1"), | 
 |         c2_mpscnn_test, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_mpscnn_test)) | 
 |  | 
 | def get_c2_nomnigraph(): | 
 |     c2_nomnigraph = native.read_config("caffe2", "enable_nomnigraph", "1") | 
 |  | 
 |     expect( | 
 |         c2_nomnigraph in ("0", "1"), | 
 |         c2_nomnigraph, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_nomnigraph)) | 
 |  | 
 | def get_c2_qpl(): | 
 |     c2_qpl = native.read_config("caffe2", "enable_qpl", "1") | 
 |  | 
 |     expect( | 
 |         c2_qpl in ("0", "1"), | 
 |         c2_qpl, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_qpl)) | 
 |  | 
 | def get_c2_strip_debug_info(): | 
 |     c2_strip_debug_info = native.read_config("caffe2", "strip_debug_info", "0") | 
 |  | 
 |     expect( | 
 |         c2_strip_debug_info in ("0", "1"), | 
 |         c2_strip_debug_info, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_strip_debug_info)) | 
 |  | 
 | def get_c2_strip_glog(): | 
 |     c2_strip_glog = native.read_config("caffe2", "strip_glog", "1") | 
 |  | 
 |     expect( | 
 |         c2_strip_glog in ("0", "1"), | 
 |         c2_strip_glog, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_strip_glog)) | 
 |  | 
 | def get_c2_tvm(): | 
 |     c2_tvm = native.read_config("caffe2", "enable_tvm", "1") | 
 |  | 
 |     expect( | 
 |         c2_tvm in ("0", "1"), | 
 |         c2_tvm, | 
 |     ) | 
 |  | 
 |     return bool(int(c2_tvm)) | 
 |  | 
 | _C2_XPLAT_NO_HPTT_PREPROCESSOR_FLAGS = [ | 
 |     "-Icaffe2", | 
 |     "-Imodules", | 
 |     "-DEIGEN_NO_DEBUG", | 
 |     "-DCAFFE2_USE_LITE_PROTO", | 
 |     "-DCAFFE2_USE_GOOGLE_GLOG", | 
 |     "-DCAFFE2_RNN_NO_TEXT_FORMAT", | 
 |     "-DGEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK=1", | 
 |     "-DCAFFE2_IS_XPLAT_BUILD", | 
 |     "-DSTRIP_ERROR_MESSAGES", | 
 |     "-DUSE_INTERNAL_PTHREADPOOL_IMPL", | 
 | ] | 
 |  | 
 | def get_c2_xplat_no_hptt_preprocessor_flags(): | 
 |     flags = [] | 
 |     flags += _C2_XPLAT_NO_HPTT_PREPROCESSOR_FLAGS | 
 |     if is_arvr_mode() and get_c2_strip_glog(): | 
 |         flags += ["-UGOOGLE_STRIP_LOG", "-DGOOGLE_STRIP_LOG=1"] | 
 |     if get_c2_expose_op_to_c10(): | 
 |         flags += ["-DEXPOSE_C2_OPS", "-frtti"] | 
 |     return flags | 
 |  | 
 | C2_XPLAT_SERVER_PREPROCESSOR_FLAGS = [ | 
 |     "-DCAFFE2_USE_EIGEN_FOR_BLAS", | 
 |     "-DC10_DISABLE_SIGNAL_HANDLERS", | 
 |     "-DCAFFE2_DISABLE_NUMA", | 
 | ] | 
 |  | 
 | C2_XPLAT_HPTT_PREPROCESSOR_FLAGS = [ | 
 |     "-DCAFFE2_USE_HPTT", | 
 | ] | 
 |  | 
 | def get_c2_xplat_preprocessor_flags(): | 
 |     flags = get_c2_xplat_no_hptt_preprocessor_flags() + C2_XPLAT_HPTT_PREPROCESSOR_FLAGS | 
 |     if get_c2_nomnigraph(): | 
 |         flags.append("-DCAFFE2_OPTIMIZER") | 
 |     return flags | 
 |  | 
 | def get_c2_xplat_no_hptt_compiler_flags(): | 
 |     return [ | 
 |         "-Os", | 
 |         "-fexceptions", | 
 |         "-frtti", | 
 |         "-Wno-shadow", | 
 |         "-Wno-unknown-pragmas", | 
 |         "-Wno-unused-variable", | 
 |         "-Wno-sign-compare", | 
 |     ] | 
 |  | 
 | def get_c2_xplat_compiler_flags(): | 
 |     return get_c2_xplat_no_hptt_compiler_flags() + C2_XPLAT_HPTT_PREPROCESSOR_FLAGS | 
 |  | 
 | def get_c2_fbobjc_xplat_compiler_flags(): | 
 |     flags = [] | 
 |  | 
 |     if is_production_build(): | 
 |         flags.append("-DCAFFE2_NO_OPERATOR_SCHEMA") | 
 |  | 
 |     flags.append("-DCAFFE2_NO_GRADIENT_OPS") | 
 |  | 
 |     # For iOS production builds (and all Android builds), strip GLOG logging to | 
 |     # save size. We can disable by setting caffe2.strip_glog=0 in .buckconfig.local. | 
 |     if is_production_build() or get_c2_strip_glog(): | 
 |         flags += ["-UGOOGLE_STRIP_LOG", "-DGOOGLE_STRIP_LOG=3"] | 
 |     else: | 
 |         flags.append("-UGOOGLE_STRIP_LOG") | 
 |  | 
 |     return flags | 
 |  | 
 | def get_c2_fbandroid_xplat_compiler_flags(): | 
 |     flags = [ | 
 |         # T95767731 -- remove this once all builds are on at least llvm-13 | 
 |         "-Wno-unknown-warning-option", | 
 |         "-Wno-unused-but-set-variable", | 
 |         "-DHAVE_MMAP", | 
 |     ] | 
 |  | 
 |     if get_c2_strip_glog(): | 
 |         flags += ["-UGOOGLE_STRIP_LOG", "-DGOOGLE_STRIP_LOG=1"] | 
 |  | 
 |     if get_c2_strip_debug_info(): | 
 |         flags.append("-g0") | 
 |  | 
 |     return flags | 
 |  | 
 | _C2_FBOBJC_COMPILER_FLAGS = [ | 
 |     "-Wno-missing-prototypes", | 
 |     "-Wno-global-constructors", | 
 |     "-Wno-unknown-pragmas", | 
 |     "-Wno-invalid-partial-specialization", | 
 |     "-Wno-missing-braces", | 
 |     "-Wno-range-loop-analysis", | 
 | ] | 
 |  | 
 | def get_c2_fbobjc_compiler_flags(): | 
 |     flags = list(_C2_FBOBJC_COMPILER_FLAGS) | 
 |  | 
 |     # Avoid linking Accelerate on MacOS because we have | 
 |     # inconsistent LAPACK headers (see problems in D19257077). | 
 |     flags.append("-DCAFFE2_USE_ACCELERATE" if not is_arvr_mode() else "-DCAFFE2_USE_EIGEN_FOR_BLAS") | 
 |     if get_c2_mpscnn(): | 
 |         flags.append( | 
 |             # TODO(t19120552) - fix this. MPSCNNConvolutionDescriptor.strideInPixelsX | 
 |             # is marked as iOS 11+, but it's been available since iOS 10. | 
 |             "-Wno-unguarded-availability", | 
 |         ) | 
 |     return flags | 
 |  | 
 | C2_FBOBJC_MACOSX_COMPILER_FLAGS = [ | 
 |     "-msse4.2", | 
 | ] | 
 |  | 
 | C2_FBOBJC_IPHONE_COMPILER_FLAGS = [ | 
 |     "-mfpu=neon-fp16", | 
 | ] | 
 |  | 
 | def get_c2_fbobjc_frameworks(): | 
 |     frameworks = [] | 
 |     if not is_arvr_mode(): | 
 |         frameworks.append( | 
 |             # On iOS, presumably Accelerate is a faster BLAS | 
 |             "$SDKROOT/System/Library/Frameworks/Accelerate.framework", | 
 |         ) | 
 |     return frameworks | 
 |  | 
 | def get_c2_fbobjc_ios_frameworks(): | 
 |     frameworks = [] | 
 |  | 
 |     if get_c2_mpscnn(): | 
 |         frameworks.extend([ | 
 |             "$SDKROOT/System/Library/Frameworks/Metal.framework", | 
 |             "$SDKROOT/System/Library/Frameworks/MetalPerformanceShaders.framework", | 
 |         ]) | 
 |  | 
 |     return frameworks | 
 |  | 
 | def get_c2_fbobjc_exported_preprocessor_flags(): | 
 |     flags = [] | 
 |  | 
 |     if get_c2_mpscnn(): | 
 |         flags.append("-DCAFFE2_USE_MPSCNN") | 
 |  | 
 |         if get_c2_mpscnn_test(): | 
 |             flags.append("-DCAFFE2_USE_MPSCNN_TEST") | 
 |  | 
 |     return flags | 
 |  | 
 | def get_c2_fbandroid_exported_preprocessor_flags(): | 
 |     flags = [] | 
 |  | 
 |     BUILD_MODE_DO_NOT_USE_WITHOUT_ASKING_SERIOUSLY = native.read_config( | 
 |         "fbandroid", | 
 |         "build_mode", | 
 |         "dev", | 
 |     ) | 
 |     if BUILD_MODE_DO_NOT_USE_WITHOUT_ASKING_SERIOUSLY == "opt": | 
 |         flags.append("-DCAFFE2_NO_OPERATOR_SCHEMA") | 
 |  | 
 |     flags.append("-DCAFFE2_NO_GRADIENT_OPS") | 
 |  | 
 |     return flags | 
 |  | 
 | C2_FBANDROID_COMPILER_FLAGS = [ | 
 |     "-DCAFFE2_USE_EIGEN_FOR_BLAS", | 
 |     "-Wno-unknown-pragmas", | 
 |     "-Wno-deprecated-declarations", | 
 |     "-Wno-invalid-partial-specialization", | 
 |     "-Wno-missing-braces", | 
 | ] | 
 |  | 
 | C2_FBANDROID_ARMV7_COMPILER_FLAGS = [ | 
 |     "-mfpu=neon-fp16", | 
 | ] | 
 |  | 
 | C2_FBANDROID_X86_COMPILER_FLAGS = [ | 
 |     "-mssse3", | 
 | ] | 
 |  | 
 | C2_FBANDROID_LINKER_FLAGS = [] | 
 |  | 
 | C2_FBOBJC_EXTRA_TARGET_CONFIG = { | 
 |     "MTL_LANGUAGE_REVISION": "Metal12", | 
 | } | 
 |  | 
 | def get_c2_default_cxx_args(): | 
 |     return dict( | 
 |         header_namespace = "", | 
 |         apple_sdks = (IOS, MACOSX), | 
 |         compiler_flags = get_c2_xplat_compiler_flags(), | 
 |         fbandroid_compiler_flags = C2_FBANDROID_COMPILER_FLAGS + get_c2_fbandroid_xplat_compiler_flags(), | 
 |         fbandroid_exported_platform_preprocessor_flags = [ | 
 |             ( | 
 |                 "android-armv7", | 
 |                 get_c2_fbandroid_exported_preprocessor_flags(), | 
 |             ), | 
 |         ], | 
 |         fbandroid_linker_flags = C2_FBANDROID_LINKER_FLAGS, | 
 |         fbandroid_platform_compiler_flags = [ | 
 |             ("android-armv7", C2_FBANDROID_ARMV7_COMPILER_FLAGS), | 
 |             (".*x86.*", C2_FBANDROID_X86_COMPILER_FLAGS), | 
 |         ], | 
 |         fbobjc_compiler_flags = get_c2_fbobjc_compiler_flags() + get_c2_fbobjc_xplat_compiler_flags(), | 
 |         fbobjc_configs = fbobjc_configs( | 
 |             STATIC_LIBRARY_IOS_CONFIG, | 
 |             extra_target_config = C2_FBOBJC_EXTRA_TARGET_CONFIG, | 
 |         ), | 
 |         fbobjc_exported_platform_preprocessor_flags = [ | 
 |             ( | 
 |                 "iphoneos", | 
 |                 get_c2_fbobjc_exported_preprocessor_flags(), | 
 |             ), | 
 |         ], | 
 |         fbobjc_frameworks = get_c2_fbobjc_frameworks() + get_c2_fbobjc_ios_frameworks(), | 
 |         fbobjc_platform_compiler_flags = [ | 
 |             ("iphoneos", C2_FBOBJC_IPHONE_COMPILER_FLAGS), | 
 |         ], | 
 |         macosx_compiler_flags = C2_FBOBJC_MACOSX_COMPILER_FLAGS, | 
 |         fbobjc_macosx_configs_override = fbobjc_configs( | 
 |             STATIC_LIBRARY_MAC_CONFIG, | 
 |         ), | 
 |         macosx_frameworks_override = get_c2_fbobjc_frameworks(), | 
 |         preprocessor_flags = [ | 
 |             # Use the internal pthreadpool impl for all Caffe2 targets on all | 
 |             # platforms but do not export the preprocessor flag downstream. | 
 |             "-DUSE_INTERNAL_PTHREADPOOL_IMPL", | 
 |         ], | 
 |         visibility = ["PUBLIC"], | 
 |         windows_preferred_linkage = "static" if is_arvr_mode() else None, | 
 |         xcode_public_headers_symlinks = True, | 
 |     ) | 
 |  | 
 | def get_c2_aten_cpu_fbobjc_macosx_deps(): | 
 |     if is_focus_enabled(): | 
 |         # focus2 is broken when using platform deps (T80070498) so in the case | 
 |         # where it's focus2 we just add fbgemm as a standard dep. Otherwise we | 
 |         # use platform deps to select correctly for arm64. | 
 |         return [ | 
 |             "fbsource//xplat/deeplearning/fbgemm:fbgemm", | 
 |             "fbsource//xplat/caffe2:cpukernel_avx2", | 
 |         ] | 
 |     else: | 
 |         return select({ | 
 |             "DEFAULT": [], | 
 |             "ovr_config//os:macos-x86_64": ["fbsource//xplat/deeplearning/fbgemm:fbgemm"], | 
 |         }) if is_arvr_mode() else [] | 
 |  | 
 | def get_c2_aten_cpu_fbobjc_macosx_platform_deps(): | 
 |     if is_focus_enabled(): | 
 |         # focus2 is broken when using platform deps (T80070498) so in the case | 
 |         # where it's focus2 we just add fbgemm as a standard dep. Otherwise we | 
 |         # use platform deps to select correctly for arm64. | 
 |         return [] | 
 |     else: | 
 |         return compose_platform_setting_list([ | 
 |             { | 
 |                 "cpu": "x86_64", | 
 |                 "flags": [ | 
 |                     "fbsource//xplat/deeplearning/fbgemm:fbgemmAppleMac", | 
 |                 ] + ([ | 
 |                     "fbsource//xplat/caffe2:cpukernel_avx2AppleMac", | 
 |                 ] if not is_arvr_mode() else []), | 
 |                 "os": "macosx", | 
 |             }, | 
 |             { | 
 |                 "cpu": "arm64", | 
 |                 "flags": ["fbsource//xplat/third-party/XNNPACK:XNNPACKAppleMac"], | 
 |                 "os": "macosx", | 
 |             }, | 
 |         ]) | 
 |  | 
 | def using_protobuf_v3(): | 
 |     # Consider migrating this to `read_config("protobuf", "use_v3")` | 
 |     # The `is_fbcode_mode_mac()` clause was added rather than changing to `read_config` to minimize changes in behavior | 
 |     return is_arvr_mode() or is_fbcode_mode_mac() | 
 |  | 
 | def get_c2_protobuf_dep(): | 
 |     return "fbsource//third-party/protobuf:libprotobuf" if using_protobuf_v3() else "fbsource//xplat/third-party/protobuf:fb-protobuf-lite" | 
 |  | 
 | def c2_cxx_library(**kwargs): | 
 |     args = get_c2_default_cxx_args() | 
 |     args.update(kwargs) | 
 |     args.setdefault("platforms", (ANDROID, APPLE, CXX, WINDOWS)) | 
 |  | 
 |     fb_xplat_cxx_library( | 
 |         labels = [ | 
 |             "supermodule:android/default/caffe2", | 
 |             "supermodule:ios/default/public.caffe2", | 
 |         ], | 
 |         feature = Msgr_Mobile_ProductInfra, | 
 |         **args | 
 |     ) | 
 |  | 
 | def c2_protobuf_rule(protos): | 
 |     cpps = [] | 
 |     headers = {} | 
 |     raw_headers = {} | 
 |     for p in protos: | 
 |         proto = paths.basename(p) | 
 |         protocexe = "$(exe fbsource//third-party/protobuf:protoc-host)" if is_arvr_mode() else "$(location fbsource//xplat/third-party/protobuf:protoc.Windows)" | 
 |         protocmd_exe  = "powershell.exe -file $(location fbsource//xplat/caffe2/scripts:proto)\\proto.ps1 -Protoc {} -Unprocessed $SRCDIR/{} -Processed $SRCDIR/{} -out $OUT -srcdir $SRCDIR".format(protocexe, p, proto) | 
 |         protocmd = ("cp $SRCDIR/{} $SRCDIR/{} && chmod +w $SRCDIR/{} && echo \"option optimize_for = LITE_RUNTIME;\" >> $SRCDIR/{} && ".format(p, proto, proto, proto) + | 
 |                     "cp $SRCDIR/caffe2/proto/caffe2.proto $SRCDIR/caffe2.proto && chmod +w $SRCDIR/caffe2.proto && echo \"option optimize_for = LITE_RUNTIME;\" >> $SRCDIR/caffe2.proto && " + | 
 |                     "sed -i -e 's/caffe2\\/proto\\/caffe2.proto/caffe2.proto/g' $SRCDIR/{} && ".format(proto) + | 
 |                    ("$(exe fbsource//third-party/protobuf:protoc-host) " if using_protobuf_v3() else "$(exe fbsource//xplat/third-party/protobuf:protoc) --osx $(location fbsource//xplat/third-party/protobuf:protoc.Darwin) --linux $(location fbsource//xplat/third-party/protobuf:protoc.Linux) ") + | 
 |                     "-I $SRCDIR --cpp_out=$OUT $SRCDIR/{}".format(proto)) | 
 |         buck_genrule( | 
 |             name = proto, | 
 |             srcs = sorted(collections.uniq([p, "caffe2/proto/caffe2.proto"])), | 
 |             cmd_exe = protocmd_exe, | 
 |             bash = protocmd, | 
 |             out = ".", | 
 |         ) | 
 |         (name, _) = paths.split_extension(proto) | 
 |         cpp = name + ".pb.cc" | 
 |         h = name + ".pb.h" | 
 |         buck_genrule( | 
 |             name = h, | 
 |             cmd_exe = "@powershell -Command \" & { " + "(Get-Content $(location :{})\\{}".format(proto, h) + ") -replace \\\"caffe2.pb.h\\\", \\\"caffe2/proto/caffe2.pb.h\\\" | Set-Content $OUT } \"", | 
 |             bash = "cp -f $(location :{})/{} $OUT  && ".format(proto, h) + | 
 |                    "sed -i -e 's/caffe2.pb.h/caffe2\\/proto\\/caffe2.pb.h/g' $OUT", | 
 |             out = h, | 
 |         ) | 
 |         headers["caffe2/proto/" + h] = ":{}".format(h) | 
 |         raw_headers[h] = ":{}".format(h) | 
 |         buck_genrule( | 
 |             name = cpp, | 
 |             cmd_exe = "@powershell -Command copy $(location :{})/{} $OUT".format(proto, cpp), | 
 |             bash = "cp -f $(location :{})/{} $OUT".format(proto, cpp), | 
 |             out = cpp, | 
 |         ) | 
 |         cpps.append(":{}".format(cpp)) | 
 |     return (cpps, headers, raw_headers) | 
 |  | 
 | # C2 uses lite version of protobuf while torch/jit uses some method only exists | 
 | # in full protobuf. This is a temporary workaround to enable experiment build. | 
 | # DO NOT USE IT IN PRODUCTION BUILD! | 
 | def c2_full_protobuf_rule(protos): | 
 |     prefix = "full_" | 
 |     cpps = [] | 
 |     headers = {} | 
 |     raw_headers = {} | 
 |     for p in protos: | 
 |         proto = paths.basename(p) | 
 |         protocexe = "$(exe fbsource//third-party/protobuf:protoc-host)" if is_arvr_mode() else "$(location fbsource//xplat/third-party/protobuf:protoc.Windows)" | 
 |         protocmd_exe = "powershell.exe -file $(location fbsource//xplat/caffe2/scripts:proto)\\proto.ps1 -Protoc {} -Unprocessed $SRCDIR/{} -Processed $SRCDIR/{} -out $OUT -srcdir $SRCDIR".format(protocexe, p, proto) | 
 |         protocmd = ("cp $SRCDIR/{} $SRCDIR/{} && ".format(p, proto) + | 
 |                     "cp $SRCDIR/caffe2/proto/caffe2.proto $SRCDIR/caffe2.proto && " + | 
 |                     "sed -i -e 's/caffe2\\/proto\\/caffe2.proto/caffe2.proto/g' $SRCDIR/{} && ".format(proto) + | 
 |                    ("$(exe fbsource//third-party/protobuf:protoc-host) " if using_protobuf_v3() else "$(exe fbsource//xplat/third-party/protobuf:protoc) --osx $(location fbsource//xplat/third-party/protobuf:protoc.Darwin) --linux $(location fbsource//xplat/third-party/protobuf:protoc.Linux) ") + | 
 |                     "-I $SRCDIR --cpp_out=$OUT $SRCDIR/{}".format(proto)) | 
 |         buck_genrule( | 
 |             name = prefix + proto, | 
 |             srcs = sorted(collections.uniq([p, "caffe2/proto/caffe2.proto"])), | 
 |             cmd = protocmd, | 
 |             cmd_exe = protocmd_exe, | 
 |             out = ".", | 
 |         ) | 
 |         (name, _) = paths.split_extension(proto) | 
 |         cpp = name + ".pb.cc" | 
 |         h = name + ".pb.h" | 
 |         buck_genrule( | 
 |             name = prefix + h, | 
 |             cmd_exe = "@powershell -Command \" & { " + "(Get-Content $(location :{})\\{}".format(prefix + proto, h) + ") -replace \\\"caffe2.pb.h\\\", \\\"caffe2/proto/caffe2.pb.h\\\" | Set-Content $OUT } \"", | 
 |             bash = "cp -f $(location :{})/{} $OUT  && ".format(prefix + proto, h) + | 
 |                    "sed -i -e 's/caffe2.pb.h/caffe2\\/proto\\/caffe2.pb.h/g' $OUT", | 
 |             out = h, | 
 |         ) | 
 |         headers["caffe2/proto/" + h] = ":{}".format(prefix + h) | 
 |         raw_headers[h] = ":{}".format(prefix + h) | 
 |         buck_genrule( | 
 |             name = prefix + cpp, | 
 |             cmd_exe = "@powershell -Command copy $(location :{})/{} $OUT".format(prefix + proto, cpp), | 
 |             bash = "cp -f $(location :{})/{} $OUT".format(prefix + proto, cpp), | 
 |             out = cpp, | 
 |         ) | 
 |         cpps.append(":{}".format(prefix + cpp)) | 
 |     return (cpps, headers, raw_headers) | 
 |  | 
 | def libcaffe2_cxx_library(name, use_hptt, **kwargs): | 
 |     c2_cxx_library( | 
 |         name = name, | 
 |         exported_deps = [ | 
 |             "fbsource//xplat/caffe2/c10:c10", | 
 |             get_c2_protobuf_dep(), | 
 |             ":caffe2_protobuf_headers", | 
 |             ":pthreadpool", | 
 |             ":common_core", | 
 |             ":caffe2_proto_types", | 
 |         ], | 
 |         compiler_flags = get_c2_xplat_compiler_flags() if use_hptt else get_c2_xplat_no_hptt_compiler_flags(), | 
 |         exported_preprocessor_flags = get_c2_xplat_preprocessor_flags() if use_hptt else get_c2_xplat_no_hptt_preprocessor_flags(), | 
 |         cxx_preprocessor_flags = C2_XPLAT_SERVER_PREPROCESSOR_FLAGS, | 
 |         fbandroid_exported_preprocessor_flags = get_c2_fbandroid_xplat_compiler_flags(), | 
 |         fbobjc_exported_preprocessor_flags = get_c2_fbobjc_xplat_compiler_flags(), | 
 |         # Hack to work around lack of platform_srcs support in Xcode project generation. | 
 |         macosx_extra_xcode_sources_override = [], | 
 |         link_whole = True, | 
 |         **kwargs | 
 |     ) | 
 |  | 
 | def c2_operator_library(name, **kwargs): | 
 |     dict_defs.key_extend( | 
 |         kwargs, | 
 |         "deps", | 
 |         [ | 
 |             "fbsource//xplat/folly:molly", | 
 |             "fbsource//third-party/glog:glog", | 
 |             ":caffe2", | 
 |         ] + ([":aten_cpu"] if get_c2_expose_op_to_c10() else []), | 
 |     ) | 
 |  | 
 |     # NOTE: Currently operators can "depend" on other operators, which is used | 
 |     # so that loading one will implicitly load the dependencies.  So, make sure | 
 |     # that no `--as-needed` flags pulled in from dependencies cause these | 
 |     # operator deps to get dropped. | 
 |     linker_flags = [ | 
 |         "-Wl,--no-as-needed", | 
 |     ] | 
 |     c2_cxx_library( | 
 |         name = name, | 
 |         soname = "lib" + name + ".$(ext)", | 
 |         fbandroid_compiler_flags = get_c2_default_cxx_args()["fbandroid_compiler_flags"] + ["-Os"], | 
 |         fbobjc_compiler_flags = get_c2_default_cxx_args()["fbobjc_compiler_flags"] + ["-Oz", "-DCOMPILING_FOR_MIN_SIZE=1"], | 
 |         link_whole = True, | 
 |         cxx_exported_linker_flags = linker_flags, | 
 |         fbandroid_exported_linker_flags = linker_flags, | 
 |         exported_deps = [ | 
 |             ":caffe2", | 
 |         ], | 
 |         **kwargs | 
 |     ) | 
 |  | 
 | def c2_genrule(genrule, genfiles, prefix = "", src_path = "", header_namespace = ""): | 
 |     headers = {} | 
 |     srcs = [] | 
 |     for generated_filename in genfiles: | 
 |         buck_genrule( | 
 |             name = prefix + generated_filename, | 
 |             bash = "cp -f $(location :{})/{} $OUT".format(genrule, src_path + generated_filename), | 
 |             cmd_exe = "@powershell -Command copy $(location :{})/{} $OUT".format(genrule, src_path + generated_filename), | 
 |             out = generated_filename, | 
 |         ) | 
 |         rule = ":{}{}".format(prefix, generated_filename) | 
 |         headers[header_namespace + generated_filename] = rule | 
 |         srcs.append(rule) | 
 |     return {"headers": headers, "srcs": srcs} |