Skip to content

Commit f3be67f

Browse files
r-barnesmeta-codesync[bot]
authored andcommitted
fbcode_builder: per-package --extra-cmake-defines for GHA generator
Summary: Add --package-extra-cmake-defines PACKAGE=JSON to generate-github-actions so a generated workflow can pin defines to a single dependency's build step (e.g. THRIFT_SERIALIZATION_ONLY=ON only for fbthrift) without applying them to every other dep. Multiple uses accumulate; the value must be a JSON object. Also reorder the cmake builder so caller-supplied extra_cmake_defines apply *after* the --shared-libs defaults. Without this, a per-package override cannot turn BUILD_SHARED_LIBS back off for a specific dependency in a mostly-shared build, which is the main reason the per-package flag exists. Reviewed By: bigfootjon Differential Revision: D103767906 fbshipit-source-id: da61d3c30b8e6f7111c75de9fc48d975b1e954c9
1 parent 18b0b2d commit f3be67f

2 files changed

Lines changed: 59 additions & 10 deletions

File tree

build/fbcode_builder/getdeps.py

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,12 +1252,16 @@ def write_job_for_platform(self, platform, args): # noqa: C901
12521252
out.write(' version: "v0.14.0"\n')
12531253
extra_cmake_defines["CMAKE_CXX_COMPILER_LAUNCHER"] = "sccache"
12541254

1255-
if extra_cmake_defines:
1256-
extra_cmake_arg = (
1257-
" --extra-cmake-defines '" + json.dumps(extra_cmake_defines) + "'"
1258-
)
1259-
else:
1260-
extra_cmake_arg = ""
1255+
per_package_defines = _parse_per_package_defines(
1256+
getattr(args, "package_extra_cmake_defines", []) or []
1257+
)
1258+
1259+
def cmake_arg_for(name):
1260+
merged = dict(extra_cmake_defines)
1261+
merged.update(per_package_defines.get(name, {}))
1262+
if merged:
1263+
return " --extra-cmake-defines '" + json.dumps(merged) + "'"
1264+
return ""
12611265

12621266
build_type_arg = ""
12631267
if override_build_type:
@@ -1396,7 +1400,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
13961400
f" if: ${{{{ steps.paths.outputs.{m.name}_SOURCE }}}}\n"
13971401
)
13981402
out.write(
1399-
f" run: {getdepscmd}{allow_sys_arg} build {build_type_arg}{src_dir_arg}{free_up_disk}--no-tests {m.name}{extra_cmake_arg}\n"
1403+
f" run: {getdepscmd}{allow_sys_arg} build {build_type_arg}{src_dir_arg}{free_up_disk}--no-tests {m.name}{cmake_arg_for(m.name)}\n"
14001404
)
14011405

14021406
if args.use_build_cache and not src_dir_arg:
@@ -1437,7 +1441,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
14371441
no_deps_arg = "--no-deps "
14381442

14391443
out.write(
1440-
f" run: {getdepscmd}{allow_sys_arg} build {build_type_arg}{tests_arg}{no_deps_arg}--src-dir=. {manifest.name}{project_prefix}{extra_cmake_arg}\n"
1444+
f" run: {getdepscmd}{allow_sys_arg} build {build_type_arg}{tests_arg}{no_deps_arg}--src-dir=. {manifest.name}{project_prefix}{cmake_arg_for(manifest.name)}\n"
14411445
)
14421446

14431447
if use_sccache:
@@ -1569,6 +1573,45 @@ def setup_project_cmd_parser(self, parser):
15691573
dest="use_build_cache",
15701574
help="Do not attempt to use the build cache.",
15711575
)
1576+
parser.add_argument(
1577+
"--package-extra-cmake-defines",
1578+
action="append",
1579+
default=[],
1580+
metavar="PACKAGE=JSON",
1581+
help=(
1582+
"Add cmake defines that apply only to the named package's "
1583+
"build step in the generated workflow. Example: "
1584+
"--package-extra-cmake-defines "
1585+
'\'fbthrift={"THRIFT_SERIALIZATION_ONLY":"ON"}\'. May be '
1586+
"passed multiple times."
1587+
),
1588+
)
1589+
1590+
1591+
def _parse_per_package_defines(values):
1592+
"""Parse a list of `package=json` strings into a dict of dicts."""
1593+
result = {}
1594+
for entry in values or []:
1595+
if "=" not in entry:
1596+
raise SystemExit(
1597+
f"--package-extra-cmake-defines value {entry!r} must be of the "
1598+
"form PACKAGE=JSON"
1599+
)
1600+
package, raw = entry.split("=", 1)
1601+
try:
1602+
parsed = json.loads(raw)
1603+
except json.JSONDecodeError as e:
1604+
raise SystemExit(
1605+
f"--package-extra-cmake-defines for {package!r} is not valid "
1606+
f"JSON: {e}"
1607+
)
1608+
if not isinstance(parsed, dict):
1609+
raise SystemExit(
1610+
f"--package-extra-cmake-defines for {package!r} must be a JSON "
1611+
"object"
1612+
)
1613+
result.setdefault(package, {}).update(parsed)
1614+
return result
15721615

15731616

15741617
def get_arg_var_name(args):

build/fbcode_builder/getdeps/builder.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -782,8 +782,6 @@ def __init__(
782782
final_install_prefix=final_install_prefix,
783783
)
784784
self.defines: dict[str, str] = defines or {}
785-
if extra_cmake_defines:
786-
self.defines.update(extra_cmake_defines)
787785
self.cmake_targets: list[str] = cmake_targets or ["install"]
788786

789787
if build_opts.is_windows():
@@ -799,6 +797,14 @@ def __init__(
799797
self.defines["BUILD_SHARED_LIBS"] = "ON"
800798
self.defines["BOOST_LINK_STATIC"] = "OFF"
801799

800+
# Apply caller-supplied extra defines last so a per-package
801+
# --extra-cmake-defines can override defaults (notably
802+
# BUILD_SHARED_LIBS=ON set by --shared-libs above), letting a
803+
# single workflow build most projects shared while pinning a
804+
# specific dependency to static.
805+
if extra_cmake_defines:
806+
self.defines.update(extra_cmake_defines)
807+
802808
def _invalidate_cache(self) -> None:
803809
for name in [
804810
"CMakeCache.txt",

0 commit comments

Comments
 (0)