@@ -245,16 +245,16 @@ def __init__(self, cache, loader, m):
245245 self .loader = loader
246246 self .cache = cache
247247
248- self .cache_file_name = "-" .join (
248+ self .cache_key = "-" .join (
249249 (
250250 m .name ,
251251 self .ctx .get ("os" ),
252252 self .ctx .get ("distro" ) or "none" ,
253253 self .ctx .get ("distro_vers" ) or "none" ,
254254 self .project_hash ,
255- "buildcache.tgz" ,
256255 )
257256 )
257+ self .cache_file_name = self .cache_key + "-buildcache.tgz"
258258
259259 def is_cacheable (self ):
260260 """We only cache third party projects"""
@@ -440,7 +440,13 @@ def run_project_cmd(self, args, loader, manifest):
440440 elif manager == "deb" :
441441 packages = sorted (set (all_packages ["deb" ]))
442442 if packages :
443- cmd_args = ["sudo" , "apt" , "install" , "-y" ] + packages
443+ cmd_args = [
444+ "sudo" ,
445+ "--preserve-env=http_proxy" ,
446+ "apt-get" ,
447+ "install" ,
448+ "-y" ,
449+ ] + packages
444450 elif manager == "homebrew" :
445451 packages = sorted (set (all_packages ["homebrew" ]))
446452 if packages :
@@ -552,6 +558,38 @@ def setup_project_cmd_parser(self, parser):
552558 )
553559
554560
561+ @cmd ("query-paths" , "print the paths for tooling to use" )
562+ class QueryPathsCmd (ProjectCmdBase ):
563+ def run_project_cmd (self , args , loader , manifest ):
564+ if args .recursive :
565+ manifests = loader .manifests_in_dependency_order ()
566+ else :
567+ manifests = [manifest ]
568+
569+ cache = cache_module .create_cache ()
570+ for m in manifests :
571+ fetcher = loader .create_fetcher (m )
572+ if isinstance (fetcher , SystemPackageFetcher ):
573+ # We are guaranteed that if the fetcher is set to
574+ # SystemPackageFetcher then this item is completely
575+ # satisfied by the appropriate system packages
576+ continue
577+ src_dir = fetcher .get_src_dir ()
578+ print (f"{ m .name } _SOURCE={ src_dir } " )
579+ inst_dir = loader .get_project_install_dir_respecting_install_prefix (m )
580+ print (f"{ m .name } _INSTALL={ inst_dir } " )
581+ cached_project = CachedProject (cache , loader , m )
582+ print (f"{ m .name } _CACHE_KEY={ cached_project .cache_key } " )
583+
584+ def setup_project_cmd_parser (self , parser ):
585+ parser .add_argument (
586+ "--recursive" ,
587+ help = "print the transitive deps also" ,
588+ action = "store_true" ,
589+ default = False ,
590+ )
591+
592+
555593@cmd ("show-source-dir" , "print the source dir for a given project" )
556594class ShowSourceDirCmd (ProjectCmdBase ):
557595 def run_project_cmd (self , args , loader , manifest ):
@@ -1001,6 +1039,10 @@ def write_job_for_platform(self, platform, args): # noqa: C901
10011039 manifest_ctx .set ("test" , "on" )
10021040 run_on = self .get_run_on (args )
10031041
1042+ tests_arg = "--no-tests "
1043+ if run_tests :
1044+ tests_arg = ""
1045+
10041046 # Some projects don't do anything "useful" as a leaf project, only
10051047 # as a dep for a leaf project. Check for those here; we don't want
10061048 # to waste the effort scheduling them on CI.
@@ -1086,12 +1128,14 @@ def write_job_for_platform(self, platform, args): # noqa: C901
10861128 )
10871129 out .write (" shell: cmd\n " )
10881130
1089- # The git installation may not like long filenames, so tell it
1090- # that we want it to use them!
10911131 out .write (" - name: Fix Git config\n " )
1092- out .write (" run: git config --system core.longpaths true\n " )
1093- out .write (" - name: Disable autocrlf\n " )
1094- out .write (" run: git config --system core.autocrlf false\n " )
1132+ out .write (" run: >\n " )
1133+ out .write (" git config --system core.longpaths true &&\n " )
1134+ out .write (" git config --system core.autocrlf false &&\n " )
1135+ # cxx crate needs symlinks enabled
1136+ out .write (" git config --system core.symlinks true\n " )
1137+ # && is not supported on default windows powershell, so use cmd
1138+ out .write (" shell: cmd\n " )
10951139
10961140 out .write (" - uses: actions/checkout@v4\n " )
10971141
@@ -1117,7 +1161,7 @@ def write_job_for_platform(self, platform, args): # noqa: C901
11171161 build_opts .allow_system_packages
11181162 and build_opts .host_type .get_package_manager ()
11191163 ):
1120- sudo_arg = "sudo "
1164+ sudo_arg = "sudo --preserve-env=http_proxy "
11211165 allow_sys_arg = " --allow-system-packages"
11221166 if build_opts .host_type .get_package_manager () == "deb" :
11231167 out .write (" - name: Update system package info\n " )
@@ -1127,17 +1171,12 @@ def write_job_for_platform(self, platform, args): # noqa: C901
11271171 if build_opts .is_darwin ():
11281172 # brew is installed as regular user
11291173 sudo_arg = ""
1130- tests_arg = "--no-tests "
1131- if run_tests :
1132- tests_arg = ""
1133- out .write (
1134- f" run: { sudo_arg } python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps { tests_arg } --recursive { manifest .name } \n "
1135- )
1174+
1175+ system_deps_cmd = f"{ sudo_arg } { getdepscmd } { allow_sys_arg } install-system-deps { tests_arg } --recursive { manifest .name } "
11361176 if build_opts .is_linux () or build_opts .is_freebsd ():
1137- out .write (" - name: Install packaging system deps\n " )
1138- out .write (
1139- f" run: { sudo_arg } python3 build/fbcode_builder/getdeps.py --allow-system-packages install-system-deps { tests_arg } --recursive patchelf\n "
1140- )
1177+ system_deps_cmd += f" && { sudo_arg } { getdepscmd } { allow_sys_arg } install-system-deps { tests_arg } --recursive patchelf"
1178+ out .write (f" run: { system_deps_cmd } \n " )
1179+
11411180 required_locales = manifest .get (
11421181 "github.actions" , "required_locales" , ctx = manifest_ctx
11431182 )
@@ -1152,6 +1191,18 @@ def write_job_for_platform(self, platform, args): # noqa: C901
11521191 out .write (f" - name: Ensure { loc } locale present\n " )
11531192 out .write (f" run: { sudo_arg } locale-gen { loc } \n " )
11541193
1194+ out .write (" - id: paths\n " )
1195+ out .write (" name: Query paths\n " )
1196+ if build_opts .is_windows ():
1197+ out .write (
1198+ f" run: { getdepscmd } { allow_sys_arg } query-paths { tests_arg } --recursive --src-dir=. { manifest .name } >> $env:GITHUB_OUTPUT\n "
1199+ )
1200+ out .write (" shell: pwsh\n " )
1201+ else :
1202+ out .write (
1203+ f' run: { getdepscmd } { allow_sys_arg } query-paths { tests_arg } --recursive --src-dir=. { manifest .name } >> "$GITHUB_OUTPUT"\n '
1204+ )
1205+
11551206 projects = loader .manifests_in_dependency_order ()
11561207
11571208 main_repo_url = manifest .get_repo_url (manifest_ctx )
@@ -1178,25 +1229,66 @@ def write_job_for_platform(self, platform, args): # noqa: C901
11781229 ctx = loader .ctx_gen .get_context (m .name )
11791230 if m .get_repo_url (ctx ) != main_repo_url :
11801231 out .write (" - name: Fetch %s\n " % m .name )
1232+ out .write (
1233+ f" if: ${{{{ steps.paths.outputs.{ m .name } _SOURCE }}}}\n "
1234+ )
11811235 out .write (
11821236 f" run: { getdepscmd } { allow_sys_arg } fetch --no-tests { m .name } \n "
11831237 )
11841238
11851239 for m in projects :
1186- if m != manifest :
1187- if m .name == "rust" :
1188- continue
1240+ if m == manifest or m .name == "rust" :
1241+ continue
1242+ src_dir_arg = ""
1243+ ctx = loader .ctx_gen .get_context (m .name )
1244+ if main_repo_url and m .get_repo_url (ctx ) == main_repo_url :
1245+ # Its in the same repo, so src-dir is also .
1246+ src_dir_arg = "--src-dir=. "
1247+ has_same_repo_dep = True
1248+
1249+ if args .use_build_cache and not src_dir_arg :
1250+ out .write (f" - name: Restore { m .name } from cache\n " )
1251+ out .write (f" id: restore_{ m .name } \n " )
1252+ # only need to restore if would build it
1253+ out .write (
1254+ f" if: ${{{{ steps.paths.outputs.{ m .name } _SOURCE }}}}\n "
1255+ )
1256+ out .write (" uses: actions/cache/restore@v4\n " )
1257+ out .write (" with:\n " )
1258+ out .write (
1259+ f" path: ${{{{ steps.paths.outputs.{ m .name } _INSTALL }}}}\n "
1260+ )
1261+ out .write (
1262+ f" key: ${{{{ steps.paths.outputs.{ m .name } _CACHE_KEY }}}}-install\n "
1263+ )
1264+
1265+ out .write (" - name: Build %s\n " % m .name )
1266+ if not src_dir_arg :
1267+ if args .use_build_cache :
1268+ out .write (
1269+ f" if: ${{{{ steps.paths.outputs.{ m .name } _SOURCE && ! steps.restore_{ m .name } .outputs.cache-hit }}}}\n "
1270+ )
11891271 else :
1190- src_dir_arg = ""
1191- ctx = loader .ctx_gen .get_context (m .name )
1192- if main_repo_url and m .get_repo_url (ctx ) == main_repo_url :
1193- # Its in the same repo, so src-dir is also .
1194- src_dir_arg = "--src-dir=. "
1195- has_same_repo_dep = True
1196- out .write (" - name: Build %s\n " % m .name )
11971272 out .write (
1198- f" run: { getdepscmd } { allow_sys_arg } build { build_type_arg } { src_dir_arg } { free_up_disk } --no-tests { m .name } \n "
1273+ f" if: ${{{{ steps.paths.outputs. { m .name } _SOURCE }}} }\n "
11991274 )
1275+ out .write (
1276+ f" run: { getdepscmd } { allow_sys_arg } build { build_type_arg } { src_dir_arg } { free_up_disk } --no-tests { m .name } \n "
1277+ )
1278+
1279+ if args .use_build_cache and not src_dir_arg :
1280+ out .write (f" - name: Save { m .name } to cache\n " )
1281+ out .write (" uses: actions/cache/save@v4\n " )
1282+ out .write (
1283+ f" if: ${{{{ steps.paths.outputs.{ m .name } _SOURCE && ! steps.restore_{ m .name } .outputs.cache-hit }}}}\n "
1284+ )
1285+ out .write (" with:\n " )
1286+ out .write (
1287+ f" path: ${{{{ steps.paths.outputs.{ m .name } _INSTALL }}}}\n "
1288+ )
1289+ out .write (
1290+ f" key: ${{{{ steps.paths.outputs.{ m .name } _CACHE_KEY }}}}-install\n "
1291+ )
12001292
12011293 out .write (" - name: Build %s\n " % manifest .name )
12021294
@@ -1213,12 +1305,8 @@ def write_job_for_platform(self, platform, args): # noqa: C901
12131305 if has_same_repo_dep :
12141306 no_deps_arg = "--no-deps "
12151307
1216- no_tests_arg = ""
1217- if not run_tests :
1218- no_tests_arg = "--no-tests "
1219-
12201308 out .write (
1221- f" run: { getdepscmd } { allow_sys_arg } build { build_type_arg } { no_tests_arg } { no_deps_arg } --src-dir=. { manifest .name } { project_prefix } \n "
1309+ f" run: { getdepscmd } { allow_sys_arg } build { build_type_arg } { tests_arg } { no_deps_arg } --src-dir=. { manifest .name } { project_prefix } \n "
12221310 )
12231311
12241312 out .write (" - name: Copy artifacts\n " )
@@ -1320,6 +1408,13 @@ def setup_project_cmd_parser(self, parser):
13201408 action = "store" ,
13211409 default = None ,
13221410 )
1411+ parser .add_argument (
1412+ "--no-build-cache" ,
1413+ action = "store_false" ,
1414+ default = True ,
1415+ dest = "use_build_cache" ,
1416+ help = "Do not attempt to use the build cache." ,
1417+ )
13231418
13241419
13251420def get_arg_var_name (args ):
0 commit comments