X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fedora_ocaml_rebuild.ml;h=a5645f193f48ceab8d078c4db73f1c15405f7fb8;hb=e98496449fbe9994aaee716a05e8208555e95f5d;hp=7f0dcc8ecb36ef24d4c6bc0c3722503e30fe8719;hpb=a20f9374cbb3c86cc3a8f908cad3f62dad61ef5c;p=goaljobs-goals.git diff --git a/fedora_ocaml_rebuild.ml b/fedora_ocaml_rebuild.ml index 7f0dcc8..a5645f1 100644 --- a/fedora_ocaml_rebuild.ml +++ b/fedora_ocaml_rebuild.ml @@ -9,12 +9,18 @@ open Git open Fedora let branch = "master" -let koji_target = "rawhide" +let side_tag = Some "f31-ocaml" +(*let side_tag = None*) + +let koji_target = + match side_tag with + | Some t -> t + | None -> "f31-build" (* The name of the rebuild, and also the magic substring that must * appear in the %changelog when the package has been rebuilt. *) -let rebuild_name = "ocaml-4.02.0-0.8.git10e45753.fc22" +let rebuild_name = "OCaml 4.08.0 (beta 3)" (* Local repository that contains build dependencies. *) let yum_repo = "koji-rawhide" @@ -23,16 +29,9 @@ let yum_repo = "koji-rawhide" * dependent packages. *) let blocked = [ - "ocaml-bitstring"; (* needs upstream fix for 4.02.0 *) - - "ocaml-mikmatch"; (* build failure on 4.02.0 *) - "ocaml-omake"; (* build failure on 4.02.0 with hevea *) - "ocaml-p3l"; (* build failure on 4.02.0 -warn-error A *) - "ocaml-pa-do"; (* build failure, complex *) - "ocaml-lwt"; (* build failure on 4.02.0 *) - "ocaml-preludeml"; (* build failure *) - "cduce"; (* camlp4-related failure, discussed upstream *) - "frama-c"; (* build failure *) + "ocaml-camlp4"; (* not ported to 4.08 yet *) + "ocaml-camlp5"; (* not ported to 4.08 yet *) + "ocaml-zarith"; (* build failures, seemingly unrelated *) ] let blocked pkg = List.mem pkg blocked @@ -40,22 +39,22 @@ let blocked pkg = List.mem pkg blocked let ignored = [ "ocaml-srpm-macros"; (* don't need to build this *) "ocaml"; (* rebuilt by hand *) - "ocaml-findlib"; (* rebuilt by hand *) - "ocaml-camlidl"; (* rebuilt by orionp *) - "whenjobs"; (* obsolete *) - "libguestfs"; (* rebuilt by hand *) - "graphviz"; (* rebuilt by hand *) - "xen"; (* already done *) - "plplot"; (* already done *) ] let ignored pkg = List.mem pkg ignored (* List of OCaml-related source package names. *) let source_packages = - let dirs = shlines "cd %s && ls -1d ocaml*" fedora_dir in + let dirs = shlines " + cd %s && \ + for f in ocaml*; do + [ -f \"$f/master/$f.spec\" ] && echo \"$f\" + done + " fedora_dir in dirs @ [ "alt-ergo"; "apron"; "brltty"; "coccinelle"; "coq"; - "cduce"; "frama-c"; "gappalib-coq"; "graphviz"; "hivex"; - "js-of-ocaml"; "llvm"; "plplot"; "why3"; "xen" ] + "cduce"; "frama-c"; "gappalib-coq"; "graphviz"; "hevea"; "hivex"; + "opam"; "plplot"; "virt-top"; "why3"; "z3"; + "flocq" (* no OCaml code, but needs to be rebuilt after Coq *); + "guestfs-browser"; "libguestfs" ] (* Dependencies of each package. (pkg, [deps ...]) *) let pkg_deps = dependencies branch source_packages @@ -73,13 +72,54 @@ let source_packages = in List.filter (fun pkg -> not (is_blocked pkg)) source_packages +(* Short the dependencies lists so that the build order is stable + * each time it runs. + *) +let pkg_deps = + List.map (fun (pkg, deps) -> pkg, List.sort compare deps) pkg_deps + +(* Sort the source packages so that the packages with the largest + * number of reverse dependencies [other packages that depend on it] + * appear earlier in the list, on the basis that building these + * packages first has the greatest advantage. + *) +let source_packages = + let rdeps pkg = + Utils.filter_map ( + fun (rdep, deps) -> if List.mem pkg deps then Some rdep else None + ) pkg_deps + in + let cmp p1 p2 = + let r1 = rdeps p1 and r2 = rdeps p2 in + let n1 = List.length r1 and n2 = List.length r2 in + if n1 <> n2 then compare n2 n1 else compare p1 p2 + in + List.sort cmp source_packages + let () = printf "final list of source packages = %s\n%!" (String.concat " " source_packages) +(* +(* We could make this a goal, but it's cheap enough to run it unconditionally. *) +let install_build_dependencies pkg = + sh "sudo yum clean all --disablerepo=\\* --enablerepo=%s" + (quote yum_repo); + sh "sudo yum-builddep -y --disablerepo=\\* --enablerepo=%s %s" + (quote yum_repo) (fedora_specfile pkg branch) + *) + +(* Unset MAKEFLAGS so it doesn't affect local builds. *) +let () = Unix.putenv "MAKEFLAGS" "" + (* Goal: rebuild all packages. *) let rec goal all () = - List.iter (fun pkg -> require (rebuild_started pkg)) source_packages + let n = List.length source_packages in + List.iteri ( + fun i pkg -> + require (rebuild_started pkg); + printf "*** *** rebuilt %d/%d packages *** ***\n%!" (i+1) n + ) source_packages (* Goal: That 'package' has been rebuilt and exists in Koji. *) and rebuilt pkg = @@ -150,11 +190,15 @@ and rebuild_started pkg = (* Ignored packages are treated as if they have been rebuilt. *) if not (ignored pkg) then ( +(* (* A local test build must succeed. *) require (local_build_succeeded pkg); +*) + (* local_build_succeeded normally does this ... *) + require (specfile_updated pkg); (* Rebuild the package in Koji. Don't wait ... *) - koji_build ~wait:false pkg branch; + koji_build ~wait:false ?side_tag pkg branch; (* ... but the build doesn't appear in Koji (eg. in 'koji * buildinfo') until the SRPM has been built. This can take quite @@ -177,6 +221,7 @@ and rebuild_started pkg = loop () ) +(* and local_build_succeeded pkg = (* The specfile must have been updated. *) require (specfile_updated pkg); @@ -186,16 +231,16 @@ and local_build_succeeded pkg = target (memory_exists key); - (* Do a local test build to ensure the Koji build will work. *) + install_build_dependencies pkg; + + (* Do a local test build to ensure the Koji build will work. *) sh " cd %s - sudo yum-builddep -y --disablerepo=\\* --enablerepo=%s %s - fedpkg local - " (fedora_repo pkg branch) - (quote yum_repo) - (fedora_specfile pkg branch); + fedpkg local + " (fedora_repo pkg branch); memory_set key "1" +*) and specfile_updated pkg = let repodir = fedora_repo pkg branch in @@ -213,8 +258,9 @@ and specfile_updated pkg = git pull --rebase " repodir; - sh "sudo yum-builddep -y --disablerepo=\\* --enablerepo=%s %s" - (quote yum_repo) specfile; +(* - XXX why did we do this here? + install_build_dependencies pkg; +*) (* For rationale behind always bumping the spec file, see comment * in 'fedora.ml'. @@ -230,16 +276,6 @@ and specfile_updated pkg = sh " cd %s - echo 'Please make further changes as required to the spec file %s.spec' - echo '(Press return key)' - read - emacs -nw %s - echo 'OK to commit this change? (press ^C if not)' - read fedpkg commit -c - echo 'OK to push this change? (press ^C if not)' - read fedpkg push " repodir - pkg - specfile