# Copyright (c) 2016-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. # This file creates an adapter between some internal Facebook-isms and the # public version of Buck. Over time, this adapter should be unnecesary. def cpp_library( name, srcs=None, headers=None, deps=None, output_subdir=None, external_deps=None, ): # TODO: Handle output_subdir. cxx_library( name=name, srcs=srcs, exported_headers=headers, deps=_translate_deps(deps, external_deps), visibility=[ 'PUBLIC', ], ) def cpp_binary( name, output_subdir=None, srcs=None, deps=None, external_deps=None, ): # TODO: Handle output_subdir. cxx_binary( name=name, srcs=srcs, deps=_translate_deps(deps, external_deps), ) def cpp_unittest( name, srcs=None, headers=None, deps=None, external_deps=None, ): cxx_test( name=name, srcs=srcs, headers=None, deps=_translate_deps(deps, external_deps), ) def cpp_benchmark( name, srcs=None, deps=None, external_deps=None, ): cxx_binary( name=name, srcs=srcs, deps=_translate_deps(deps, external_deps), ) original_python_binary = python_binary def python_binary( name, srcs=None, gen_srcs=None, main_module=None, deps=None, ): # TODO: Handle gen_srcs. original_python_library( name=name + '.lib', deps=_translate_deps(deps), ) original_python_binary( name=name, main_module=main_module, visibility=[ 'PUBLIC', ], deps=[':%s.lib' % (name,)] ) original_thrift_library = thrift_library def thrift_library( name, thrift_srcs=None, languages=None, deps=None, thrift_args=None, py_base_module=None, ): original_thrift_library( name=name, srcs=thrift_srcs, deps=_translate_deps(deps), visibility=['PUBLIC'], ) original_python_library = python_library def python_library(name, deps=None, **kwargs): original_python_library( name=name, deps=_translate_deps(deps), visibility=kwargs.pop('visibility', ['PUBLIC']), **kwargs ) def python_unittest(**kwargs): # TODO pass def buck_genrule(**kwargs): # TODO pass def _translate_deps(deps, external_deps=None): # The translation process may result in duplicates, so use a set # to make sure we filter out duplicates. translated_deps = set() for dep in (deps or ()): translated = _translate_dep(dep) if translated is not None: translated_deps.add(translated) for dep in (external_deps or ()): translated = _translate_external_dep(dep) if translated is not None: translated_deps.add(translated) if not translated_deps: return None return list(translated_deps) def _translate_dep(dep): import re dep = re.sub('^@/', '//', dep) # Translate thrift_library() suffixes dep = re.sub('-cpp2$', '#cpp2', dep) dep = re.sub('-py$', '#py', dep) dep = re.sub('-java$', '#java', dep) m = re.match('//(folly|rocksdb|wangle|thrift)[/:]', dep) if m: libname = m.group(1) if libname == 'thrift': dep = '//external:thriftcpp2' else: dep = '//external:%s' % libname return dep def _translate_external_dep(dep): if isinstance(dep, tuple): # This is a 2-tuple or 3-tuple of # project, version constraints, library project = dep[0] if len(dep) == 3: lib = dep[2] else: lib = project else: project = dep lib = dep if project == 'glog': return '//external:glog' elif project == 'openssl': if lib == 'ssl': return '//external:openssl_ssl' elif lib == 'crypto': return '//external:openssl_crypto' else: raise Exception('unknown openssl lib %r' % lib) elif project == 'fuse': return '//external:fuse' elif project == 'libgit2': return '//external:libgit2' elif project == 'boost': if lib == 'boost': # This is headers-only, nothing to add for now. return None elif lib == 'boost_filesystem': return '//external:boost_filesystem' else: raise Exception('unknown boost lib %r' % lib) elif project == 'gtest': # buck will add this dependency automatically for # cxx_test() rules return None elif project == 'gmock': return '//external:gmock' else: raise Exception('unhandled external dependency: %r' % project)