From 5cd35796ba7b6e792a7e3c33c26a2942193decfd Mon Sep 17 00:00:00 2001 From: Chad Austin Date: Tue, 8 Feb 2022 18:06:55 -0800 Subject: [PATCH] add freebsd support Summary: Add some basic support for FreeBSD to getdeps. Reviewed By: ahornby Differential Revision: D33989129 fbshipit-source-id: 42ff5f160b7e19c12196bb2e52a726f7815487bd --- build/fbcode_builder/getdeps.py | 5 +++- build/fbcode_builder/getdeps/builder.py | 19 ++++++++++--- build/fbcode_builder/getdeps/buildopts.py | 3 +++ build/fbcode_builder/getdeps/dyndeps.py | 6 ++++- build/fbcode_builder/getdeps/platform.py | 33 +++++++++++++++++++++++ build/fbcode_builder/manifests/cmake | 6 ++--- build/fbcode_builder/manifests/cpptoml | 3 +++ build/fbcode_builder/manifests/folly | 3 +++ build/fbcode_builder/manifests/glog | 5 ++++ build/fbcode_builder/manifests/openssl | 2 +- 10 files changed, 76 insertions(+), 9 deletions(-) diff --git a/build/fbcode_builder/getdeps.py b/build/fbcode_builder/getdeps.py index afe7552c2..c0d5fa3ca 100755 --- a/build/fbcode_builder/getdeps.py +++ b/build/fbcode_builder/getdeps.py @@ -773,7 +773,10 @@ class FixupDeps(ProjectCmdBase): dep_munger = create_dyn_dep_munger( loader.build_opts, install_dirs, args.strip ) - dep_munger.process_deps(args.destdir, args.final_install_prefix) + if dep_munger is None: + print(f"dynamic dependency fixups not supported on {sys.platform}") + else: + dep_munger.process_deps(args.destdir, args.final_install_prefix) def setup_project_cmd_parser(self, parser): parser.add_argument("destdir", help="Where to copy the fixed up executables") diff --git a/build/fbcode_builder/getdeps/builder.py b/build/fbcode_builder/getdeps/builder.py index 14b855474..ba44e5913 100644 --- a/build/fbcode_builder/getdeps/builder.py +++ b/build/fbcode_builder/getdeps/builder.py @@ -100,10 +100,23 @@ class BuilderBase(object): @property def num_jobs(self) -> int: - # 1.5 GiB is a lot to assume, but it's typical of Facebook-style C++. - # Some manifests are even heavier and should override. + # This is a hack, but we don't have a "defaults manifest" that we can + # customize per platform. + # TODO: Introduce some sort of defaults config that can select by + # platform, just like manifest contexts. + if sys.platform.startswith("freebsd"): + # clang on FreeBSD is quite memory-efficient. + default_job_weight = 512 + else: + # 1.5 GiB is a lot to assume, but it's typical of Facebook-style C++. + # Some manifests are even heavier and should override. + default_job_weight = 1536 return self.build_opts.get_num_jobs( - int(self.manifest.get("build", "job_weight_mib", 1536, ctx=self.ctx)) + int( + self.manifest.get( + "build", "job_weight_mib", default_job_weight, ctx=self.ctx + ) + ) ) def run_tests( diff --git a/build/fbcode_builder/getdeps/buildopts.py b/build/fbcode_builder/getdeps/buildopts.py index 62cee068c..0219376cd 100644 --- a/build/fbcode_builder/getdeps/buildopts.py +++ b/build/fbcode_builder/getdeps/buildopts.py @@ -161,6 +161,9 @@ class BuildOptions(object): def is_linux(self): return self.host_type.is_linux() + def is_freebsd(self): + return self.host_type.is_freebsd() + def get_num_jobs(self, job_weight): """Given an estimated job_weight in MiB, compute a reasonable concurrency limit.""" if self.specified_num_jobs: diff --git a/build/fbcode_builder/getdeps/dyndeps.py b/build/fbcode_builder/getdeps/dyndeps.py index 04746124a..7ae4abbd4 100644 --- a/build/fbcode_builder/getdeps/dyndeps.py +++ b/build/fbcode_builder/getdeps/dyndeps.py @@ -12,6 +12,7 @@ import stat import subprocess import sys from struct import unpack +from typing import Optional from .envfuncs import path_search @@ -419,10 +420,13 @@ class MachDeps(DepBase): ) -def create_dyn_dep_munger(buildopts, install_dirs, strip=False): +def create_dyn_dep_munger(buildopts, install_dirs, strip=False) -> Optional[DepBase]: if buildopts.is_linux(): return ElfDeps(buildopts, install_dirs, strip) if buildopts.is_darwin(): return MachDeps(buildopts, install_dirs, strip) if buildopts.is_windows(): return WinDeps(buildopts, install_dirs, strip) + if buildopts.is_freebsd(): + return ElfDeps(buildopts, install_dirs, strip) + return None diff --git a/build/fbcode_builder/getdeps/platform.py b/build/fbcode_builder/getdeps/platform.py index b454def2d..a19e49303 100644 --- a/build/fbcode_builder/getdeps/platform.py +++ b/build/fbcode_builder/getdeps/platform.py @@ -130,6 +130,32 @@ def _get_available_ram_windows() -> int: return (ms.ullAvailPhys + ms.ullTotalPhys) // (2 * 1024 * 1024) +def _get_available_ram_freebsd() -> int: + import ctypes.util + + libc = ctypes.CDLL(ctypes.util.find_library("libc"), use_errno=True) + sysctlbyname = libc.sysctlbyname + sysctlbyname.restype = ctypes.c_int + sysctlbyname.argtypes = [ + ctypes.c_char_p, + ctypes.c_void_p, + ctypes.POINTER(ctypes.c_size_t), + ctypes.c_void_p, + ctypes.c_size_t, + ] + # hw.usermem is pretty close to what we want. + memsize = ctypes.c_int64() + memsizesize = ctypes.c_size_t(8) + res = sysctlbyname( + b"hw.usermem", ctypes.byref(memsize), ctypes.byref(memsizesize), None, 0 + ) + if res != 0: + raise NotImplementedError( + f"failed to retrieve hw.memsize sysctl: {ctypes.get_errno()}" + ) + return memsize.value // (1024 * 1024) + + def get_available_ram() -> int: """ Returns a platform-appropriate available RAM metric in MiB. @@ -140,6 +166,8 @@ def get_available_ram() -> int: return _get_available_ram_macos() elif sys.platform == "win32": return _get_available_ram_windows() + elif sys.platform.startswith("freebsd"): + return _get_available_ram_freebsd() else: raise NotImplementedError( f"platform {sys.platform} does not have an implementation of get_available_ram" @@ -158,6 +186,8 @@ class HostType(object): elif is_windows(): ostype = "windows" distrovers = str(sys.getwindowsversion().major) + elif sys.platform.startswith("freebsd"): + ostype = "freebsd" else: ostype = sys.platform @@ -185,6 +215,9 @@ class HostType(object): def is_linux(self): return self.ostype == "linux" + def is_freebsd(self): + return self.ostype == "freebsd" + def as_tuple_string(self): return "%s-%s-%s" % ( self.ostype, diff --git a/build/fbcode_builder/manifests/cmake b/build/fbcode_builder/manifests/cmake index 504db430b..71548f119 100644 --- a/build/fbcode_builder/manifests/cmake +++ b/build/fbcode_builder/manifests/cmake @@ -22,7 +22,7 @@ sha256 = 15a49e2ab81c1822d75b1b1a92f7863f58e31f6d6aac1c4103eef2b071be3112 url = https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2-macos-universal.tar.gz sha256 = 0100663380a3bd977b001183cd487412db7aad9de6859927bde97e1e6e44e645 -[download.os=linux] +[download.any(os=linux,os=freebsd)] url = https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2.tar.gz sha256 = aecf6ecb975179eb3bb6a4a50cae192d41e92b9372b02300f9e8f1d5f559544e @@ -38,9 +38,9 @@ subdir = cmake-3.20.2-macos-universal CMake.app/Contents/bin = bin CMake.app/Contents/share = share -[build.os=linux] +[build.any(os=linux,os=freebsd)] builder = cmakebootstrap subdir = cmake-3.20.2 -[make.install_args.os=linux] +[make.install_args.any(os=linux,os=freebsd)] install diff --git a/build/fbcode_builder/manifests/cpptoml b/build/fbcode_builder/manifests/cpptoml index 124882c2a..c4d6d8d9c 100644 --- a/build/fbcode_builder/manifests/cpptoml +++ b/build/fbcode_builder/manifests/cpptoml @@ -11,3 +11,6 @@ sha256 = beda37e94f9746874436c8090c045fd80ae6f8a51f7c668c932a2b110a4fc277 [build] builder = cmake subdir = cpptoml-0.1.2 + +[cmake.defines.os=freebsd] +ENABLE_LIBCXX=NO diff --git a/build/fbcode_builder/manifests/folly b/build/fbcode_builder/manifests/folly index e65b2aed7..d22912e21 100644 --- a/build/fbcode_builder/manifests/folly +++ b/build/fbcode_builder/manifests/folly @@ -54,6 +54,9 @@ fbcode/folly = folly BUILD_SHARED_LIBS=OFF BOOST_LINK_STATIC=ON +[cmake.defines.os=freebsd] +LIBDWARF_FOUND=NO + [cmake.defines.test=on] BUILD_TESTS=ON diff --git a/build/fbcode_builder/manifests/glog b/build/fbcode_builder/manifests/glog index d2354610a..bdbe97d2e 100644 --- a/build/fbcode_builder/manifests/glog +++ b/build/fbcode_builder/manifests/glog @@ -14,3 +14,8 @@ gflags [cmake.defines] BUILD_SHARED_LIBS=ON +BUILD_TESTING=NO + +[cmake.defines.os=freebsd] +HAVE_TR1_UNORDERED_MAP=OFF +HAVE_TR1_UNORDERED_SET=OFF diff --git a/build/fbcode_builder/manifests/openssl b/build/fbcode_builder/manifests/openssl index 518733e7e..5dcfc3868 100644 --- a/build/fbcode_builder/manifests/openssl +++ b/build/fbcode_builder/manifests/openssl @@ -17,7 +17,7 @@ url = https://www.openssl.org/source/openssl-1.1.1l.tar.gz sha256 = 0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1 # We use the system openssl on linux -[build.not(os=linux)] +[build.not(any(os=linux, os=freebsd))] builder = openssl subdir = openssl-1.1.1l