From 929cd0f7bea47ecd53764e8f39123ee978f3a7f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Mon, 19 Apr 2021 12:38:41 +0200 Subject: [PATCH 1/7] Support Windows msvc starting with OCaml 4.06 --- src-opam/dockerfile_distro.ml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-opam/dockerfile_distro.ml b/src-opam/dockerfile_distro.ml index 1ceb1961..aa772abb 100644 --- a/src-opam/dockerfile_distro.ml +++ b/src-opam/dockerfile_distro.ml @@ -134,6 +134,8 @@ let distro_arches ov (d:t) = | `Alpine (`V3_6 | `V3_7 | `V3_8 | `V3_9 | `V3_10 | `V3_11 | `V3_12 | `V3_13), ov when OV.(compare Releases.v4_05_0 ov) = -1 -> [ `X86_64; `Aarch64 ] | `Ubuntu (`V18_04|`V20_04|`V20_10|`V21_04), ov when OV.(compare Releases.v4_05_0 ov) = -1 -> [ `X86_64; `Aarch64; `Ppc64le ] | `Fedora (`V33|`V34), ov when OV.(compare Releases.v4_08_0 ov) = -1 -> [ `X86_64; `Aarch64 ] + (* 2021-04-19: should be 4.03 but there's a linking failure until 4.06. *) + | `Windows (`Msvc, _), ov when OV.(compare Releases.v4_06_0 ov) = 1 -> [] | _ -> [ `X86_64 ] From 53789bdc1f7ba6c9f85ae6a924c11fbd94ca5f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Mon, 26 Apr 2021 15:54:16 +0200 Subject: [PATCH 2/7] Set CYGWIN=winsymlinks:native by default --- src-opam/dockerfile_opam.ml | 2 +- src-opam/dockerfile_windows.ml | 2 +- src-opam/dockerfile_windows.mli | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src-opam/dockerfile_opam.ml b/src-opam/dockerfile_opam.ml index 3d188718..57bdf1fd 100644 --- a/src-opam/dockerfile_opam.ml +++ b/src-opam/dockerfile_opam.ml @@ -270,7 +270,7 @@ let windows_opam2 ?winget ?(labels=[]) ?arch distro () = in let extra, t' = Windows.Cygwin.ocaml_for_windows_packages ~cyg ~extra () in Windows.install_vc_redist () @@ t - @@ Windows.Cygwin.setup ~cyg ~extra ~winsymlinks_native:true () @@ t' + @@ Windows.Cygwin.setup ~cyg ~extra () @@ t' end @@ Windows.Winget.setup ?from:winget () @@ Windows.Winget.dev_packages ~version () diff --git a/src-opam/dockerfile_windows.ml b/src-opam/dockerfile_windows.ml index cb657c65..5748bdb5 100644 --- a/src-opam/dockerfile_windows.ml +++ b/src-opam/dockerfile_windows.ml @@ -111,7 +111,7 @@ module Cygwin = struct let install ?(cyg=default) fmt = ksprintf (cygwin ~cyg "--packages %s") fmt - let setup ?(cyg=default) ?(winsymlinks_native=false) ?(extra=[]) () = + let setup ?(cyg=default) ?(winsymlinks_native=true) ?(extra=[]) () = (if winsymlinks_native then env [("CYGWIN", "winsymlinks:native")] else empty) @@ add ~src:["https://www.cygwin.com/setup-x86_64.exe"] ~dst:{|C:\cygwin-setup-x86_64.exe|} () @@ install_cygsympathy_from_source cyg diff --git a/src-opam/dockerfile_windows.mli b/src-opam/dockerfile_windows.mli index 844d0c93..da30adb3 100644 --- a/src-opam/dockerfile_windows.mli +++ b/src-opam/dockerfile_windows.mli @@ -64,8 +64,9 @@ module Cygwin : sig (** The default Cygwin root, mirror, and arguments. *) val setup : ?cyg:cyg -> ?winsymlinks_native:bool -> ?extra:string list -> unit -> t - (** Setup Cygwin with CygSymPathy and msvs-tools, and [extra] - Cygwin packages. + (** Setup Cygwin with CygSymPathy and msvs-tools, and [extra] Cygwin + packages. Sets the [CYGWIN=winsymlinks:native] environment + variable by default. @see @see *) From bfa4387a5c99a38bc2434a500792a70ac1314f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Mon, 26 Apr 2021 16:18:36 +0200 Subject: [PATCH 3/7] Install mingw64-x86_64-binutils 2.35.2 Cygwin's setup 2.908 allows installing a specific version of a package. As GNU ld 2.36 broke OCaml, we'll stay on 2.35.2 until a fix is released in OCaml, then selectively install binutils 2.35.2 or the latest version depending on the fix being available in OCaml. --- src-opam/dockerfile_opam.ml | 11 +++-------- src-opam/dockerfile_windows.ml | 6 ++++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src-opam/dockerfile_opam.ml b/src-opam/dockerfile_opam.ml index 57bdf1fd..406b0d1a 100644 --- a/src-opam/dockerfile_opam.ml +++ b/src-opam/dockerfile_opam.ml @@ -246,11 +246,6 @@ let cygwin_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_master distro () = and pass ~hash_opam_2_0 ~hash_opam_master like the cygwin one *) (* Native Windows, WinGet, Cygwin based Dockerfiles *) let windows_opam2 ?winget ?(labels=[]) ?arch distro () = - (* GNU Linker 2.36 may be breaking OCaml *) - let cyg = { Windows.Cygwin.default with - site = "http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2021/04/09/072945"; - args = Windows.Cygwin.default.args @ ["-X"] } - in let version = match distro with `Windows (_, v) -> v | _ -> assert false in (match winget with | None -> Windows.Winget.install_from_release ~version () @@ -268,13 +263,13 @@ let windows_opam2 ?winget ?(labels=[]) ?arch distro () = "Microsoft.VisualStudio.Component.Windows10SDK.18362"] | _ -> invalid_arg "Invalid distribution" in - let extra, t' = Windows.Cygwin.ocaml_for_windows_packages ~cyg ~extra () in + let extra, t' = Windows.Cygwin.ocaml_for_windows_packages ~extra () in Windows.install_vc_redist () @@ t - @@ Windows.Cygwin.setup ~cyg ~extra () @@ t' + @@ Windows.Cygwin.setup ~extra () @@ t' end @@ Windows.Winget.setup ?from:winget () @@ Windows.Winget.dev_packages ~version () - @@ Windows.Cygwin.Git.init ~cyg () + @@ Windows.Cygwin.Git.init () @@ Windows.cleanup () let gen_opam2_distro ?winget ?(clone_opam_repo=true) ?arch ?labels ~hash_opam_2_0 ~hash_opam_master d = diff --git a/src-opam/dockerfile_windows.ml b/src-opam/dockerfile_windows.ml index 5748bdb5..28540e9b 100644 --- a/src-opam/dockerfile_windows.ml +++ b/src-opam/dockerfile_windows.ml @@ -135,8 +135,10 @@ module Cygwin = struct in packages, t - let mingw_packages ?(extra=[]) () = "make" :: "diffutils" :: "mingw64-x86_64-gcc-core" :: extra - let msvc_packages ?(extra=[]) () = "make" :: "diffutils" :: extra + (* GNU ld (found in binutils) 2.36 broke OCaml. Stay with 2.35 until + a fix is available in OCaml. *) + let mingw_packages ?(extra=[]) () = "mingw64-x86_64-binutils=2.35.2-1" :: "make" :: "diffutils" :: "mingw64-x86_64-gcc-core" :: extra + let msvc_packages ?(extra=[]) () = "mingw64-x86_64-binutils=2.35.2-1" :: "make" :: "diffutils" :: extra let ocaml_for_windows_packages ?cyg ?(extra=[]) ?(version="0.0.0.2") () = let packages = "make" :: "diffutils" :: "mingw64-x86_64-gcc-g++" :: "vim" :: "git" From 2fe868641c8069744d7e886aee03346c5877150a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Mon, 26 Apr 2021 16:31:19 +0200 Subject: [PATCH 4/7] Install flexdll 0.39 using Cygwin 2.908 --allow-test-packages --- src-opam/dockerfile_opam.ml | 5 +++-- src-opam/dockerfile_windows.ml | 14 ++++---------- src-opam/dockerfile_windows.mli | 4 ++-- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src-opam/dockerfile_opam.ml b/src-opam/dockerfile_opam.ml index 406b0d1a..0b4ac2d7 100644 --- a/src-opam/dockerfile_opam.ml +++ b/src-opam/dockerfile_opam.ml @@ -227,9 +227,10 @@ let pacman_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_master distro () = (* Cygwin based Dockerfile *) let cygwin_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_master distro () = let img, tag = D.base_distro_tag ?arch distro in + let cyg = Windows.Cygwin.{ default with args = "--allow-test-packages" :: default.args } in header ?arch distro @@ label (("distro_style", "cygwin") :: labels) @@ user "ContainerAdministrator" - @@ Windows.Cygwin.(let extra, t = cygwin_packages () in setup ~extra () @@ t) + @@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ()) @@ Windows.Cygwin.Git.init () @@ install_opam_from_source_cygwin ~add_default_link:false ~branch:"2.0" ~hash:hash_opam_2_0 () @@ install_opam_from_source_cygwin ~add_default_link:false ~enable_0install_solver:true ~branch:"master" ~hash:hash_opam_master () @@ -238,7 +239,7 @@ let cygwin_opam2 ?(labels=[]) ?arch ~hash_opam_2_0 ~hash_opam_master distro () = @@ copy ~from:"0" ~src:["/usr/local/bin/opam-2.0"] ~dst:"/usr/bin/opam-2.0" () @@ copy ~from:"0" ~src:["/usr/local/bin/opam-master"] ~dst:"/usr/bin/opam-2.1" () @@ run "ln /usr/bin/opam-2.0 /usr/bin/opam" - @@ Windows.Cygwin.(let extra, t = cygwin_packages () in setup ~extra () @@ t) + @@ Windows.Cygwin.(setup ~cyg ~extra:(cygwin_packages ()) ()) @@ Windows.Cygwin.Git.init () (* TODO: Compile opam-2.0 and 2.1 instead of downloading binaries, diff --git a/src-opam/dockerfile_windows.ml b/src-opam/dockerfile_windows.ml index 28540e9b..5e8c831e 100644 --- a/src-opam/dockerfile_windows.ml +++ b/src-opam/dockerfile_windows.ml @@ -124,16 +124,10 @@ module Cygwin = struct let update ?(cyg=default) () = run {|%s %s --root %s --site %s --upgrade-also|} cygsetup (String.concat " " cyg.args) cyg.root cyg.site - let cygwin_packages ?(cyg=default) ?(extra=[]) ?(flexdll_version="0.39-1") () = - let packages = "make" :: "diffutils" :: "ocaml" :: "gcc-core" :: "git" - :: "patch" :: "m4" :: "cygport" :: extra in - let t = - (* 2021-03-19: flexdll 0.39 is required, but is in Cygwin testing *) - add ~src:["http://mirrors.kernel.org/sourceware/cygwin/x86_64/release/flexdll/flexdll-" ^ flexdll_version ^ ".tar.xz"] - ~dst:(cyg.root ^ {|\flexdll.tar.xz|}) () - @@ run_sh ~cyg "cd / && tar -xJf flexdll.tar.xz && rm flexdll.tar.xz" - in - packages, t + let cygwin_packages ?(extra=[]) ?(flexdll_version="0.39-1") () = + (* 2021-03-19: flexdll 0.39 is required, but is in Cygwin testing *) + "make" :: "diffutils" :: "ocaml" :: "gcc-core" :: "git" :: "patch" :: "m4" + :: "cygport" :: ("flexdll="^flexdll_version) :: extra (* GNU ld (found in binutils) 2.36 broke OCaml. Stay with 2.35 until a fix is available in OCaml. *) diff --git a/src-opam/dockerfile_windows.mli b/src-opam/dockerfile_windows.mli index da30adb3..bb2ea1f1 100644 --- a/src-opam/dockerfile_windows.mli +++ b/src-opam/dockerfile_windows.mli @@ -77,8 +77,8 @@ module Cygwin : sig val update : ?cyg:cyg -> unit -> t (** Update Cygwin packages. *) - val cygwin_packages : ?cyg:cyg -> ?extra:string list -> - ?flexdll_version:string -> unit -> string list * t + val cygwin_packages : ?extra:string list -> ?flexdll_version:string -> unit + -> string list (** [cygwin_packages ?extra ()] will install the base development tools for the OCaml Cygwin port. Extra packages may also bep optionally supplied via [extra]. *) From ccd2785cddc572dfbbbcacc14c13b1f8197fde16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Wed, 28 Apr 2021 11:20:49 +0200 Subject: [PATCH 5/7] Always use latest winget release or commit --- src-opam/dockerfile_windows.ml | 17 +++++++++++------ src-opam/dockerfile_windows.mli | 5 +++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src-opam/dockerfile_windows.ml b/src-opam/dockerfile_windows.ml index 5e8c831e..c3cebcd7 100644 --- a/src-opam/dockerfile_windows.ml +++ b/src-opam/dockerfile_windows.ml @@ -152,7 +152,6 @@ end module Winget = struct let winget = "winget-builder" - let winget_version = "v-0.2.10771-preview" let header ?(version=`V20H2) () = let tag = match version with @@ -172,7 +171,7 @@ module Winget = struct @@ run {|move "C:\TEMP\winget-cli\%s\resources.pri" "C:\Program Files\winget-cli\"|} path |> crunch - let build_from_source ?(arch=`X86_64) ?version ?(winget_version=winget_version) ?(vs_version="16") () = + let build_from_source ?(arch=`X86_64) ?version ?(winget_version="master") ?(vs_version="16") () = header ?version () @@ install_vc_redist ~vs_version () @@ install_visual_studio_build_tools ~vs_version [ @@ -191,11 +190,17 @@ module Winget = struct @@ run_vc ~arch {|cd C:\TEMP\winget-cli && msbuild -p:Configuration=Release src\AppInstallerCLI.sln|} @@ footer {|src\x64\Release\AppInstallerCLI|} - let install_from_release ?version ?(winget_version=winget_version) () = - let dst = {|C:\TEMP\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.zip|} in + let install_from_release ?version ?winget_version () = + let file = "Microsoft.DesktopAppInstaller_8wekyb3d8bbwe." in + let src = + let src = "https://github.com/microsoft/winget-cli/releases/" in + match winget_version with + | None -> src ^ "latest/download/" ^ file ^ "appxbundle" + | Some ver -> src ^ "download/" ^ ver ^ "/" ^ file ^ "appxbundle" + in + let dst = {|C:\TEMP\|} ^ file ^ "zip" in header ?version () - @@ add ~src:["https://github.com/microsoft/winget-cli/releases/download/" ^ winget_version ^ "/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle"] - ~dst () + @@ add ~src:[src] ~dst () @@ run_powershell {|Expand-Archive -LiteralPath %s -DestinationPath C:\TEMP\winget-cli -Force|} dst @@ run {|ren C:\TEMP\winget-cli\AppInstaller_x64.appx AppInstaller_x64.zip|} @@ run_powershell {|Expand-Archive -LiteralPath C:\TEMP\winget-cli\AppInstaller_x64.zip -DestinationPath C:\TEMP\winget-cli\ -Force|} diff --git a/src-opam/dockerfile_windows.mli b/src-opam/dockerfile_windows.mli index bb2ea1f1..e18c0a46 100644 --- a/src-opam/dockerfile_windows.mli +++ b/src-opam/dockerfile_windows.mli @@ -121,12 +121,13 @@ module Winget : sig val build_from_source : ?arch:Ocaml_version.arch -> ?version:[ `V1809 | `V1903 | `V1909 | `V2004 | `V20H2 ] -> ?winget_version:string -> ?vs_version:string -> unit -> t - (** Build winget from source (in a separate Docker image). *) + (** Build winget from source (in a separate Docker image). The + optional [winget_version] specifies a Git reference. *) val install_from_release : ?version:[ `V1809 | `V1903 | `V1909 | `V2004 | `V20H2 ] -> ?winget_version:string -> unit -> t (** Install winget from a released build (first in a separate Docker - image). *) + image). The optional [winget_version] specifies a Git tag. *) val setup : ?from:string -> unit -> t (** Setup winget, copied from the [from] Docker image. Disable From 6e278240b414349993ee5a4a2d8a703ca6bf3231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Wed, 28 Apr 2021 11:21:14 +0200 Subject: [PATCH 6/7] Build or install winget in windows image (not servercore) There's no particular need for using the servercore image as we pull the windows image anyway. By using the base windows image we avoid pulling servercore. --- src-opam/dockerfile_windows.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-opam/dockerfile_windows.ml b/src-opam/dockerfile_windows.ml index c3cebcd7..ec7315d3 100644 --- a/src-opam/dockerfile_windows.ml +++ b/src-opam/dockerfile_windows.ml @@ -162,7 +162,7 @@ module Winget = struct | `V20H2 -> "20H2" in parser_directive (`Escape '`') - @@ from ~alias:winget ~tag "mcr.microsoft.com/windows/servercore" + @@ from ~alias:winget ~tag "mcr.microsoft.com/windows" @@ user "ContainerAdministrator" let footer path = From 003197da5e3c9cdb232dfbf05159d7308002f336 Mon Sep 17 00:00:00 2001 From: Anil Madhavapeddy Date: Mon, 17 May 2021 12:59:23 +0100 Subject: [PATCH 7/7] Update src-opam/dockerfile_windows.mli --- src-opam/dockerfile_windows.mli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-opam/dockerfile_windows.mli b/src-opam/dockerfile_windows.mli index e18c0a46..ef4c3010 100644 --- a/src-opam/dockerfile_windows.mli +++ b/src-opam/dockerfile_windows.mli @@ -80,7 +80,7 @@ module Cygwin : sig val cygwin_packages : ?extra:string list -> ?flexdll_version:string -> unit -> string list (** [cygwin_packages ?extra ()] will install the base development - tools for the OCaml Cygwin port. Extra packages may also bep + tools for the OCaml Cygwin port. Extra packages may also be optionally supplied via [extra]. *) val mingw_packages : ?extra:string list -> unit -> string list