Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using dkml-base-compiler instead of ocaml-base-compiler #327

Open
jonahbeckford opened this issue Aug 13, 2022 · 1 comment
Open

Using dkml-base-compiler instead of ocaml-base-compiler #327

jonahbeckford opened this issue Aug 13, 2022 · 1 comment
Labels
enhancement New feature or request

Comments

@jonahbeckford
Copy link

dkml-base-compiler is a new compiler package in the Opam repository. Among other things, it builds a cross-compiler for macOS (x86_64 + ARM64) and unofficially can build cross-compilers for Android (ARM32, etc.).

I can't figure out the command line options so that dkml-base-compiler.4.12.1~v1.0.0 is used as the compiler during opam monorepo lock rather than ocaml-base-compiler.VERSION.

Context: For my own internal needs I have been using the dunified Opam repository but do not use the opam monorepo tools; instead I use Opam build command configuration so that opam install . uses dune -x darwin_arm64 to build every Opam package dependency. That style of cross-compilation may be too complicated for other people. So not only would I like others to use opam monorepo with dkml-base-compiler but I've got some "dkml-workflows" tooling I'll be releasing that will create "native" (including cross-compiled) artifacts on GitHub Actions.

If needed, I have a Makefile that can be used to see the problems doing opam monorepo lock with dkml-base-compiler:

$ git clone https://github.com/diskuv/dkml-workflows-monorepo-example.git
$ cd dkml-workflows-monorepo-example
$ git reset --hard 2afd44bb59d41cf38cb382ad679b03b16fbffc85
$ make monorepo-pull
opam switch create . dkml-base-compiler.4.12.1~v1.0.0 \
          --yes \
          --deps-only \
          --repo default=https://opam.ocaml.org,dune-universe=git+https://github.com/dune-universe/opam-overlays.git

<><> Installing new switch packages <><><><><><><><><><><><><><><><><><><><>  🐫 
Switch invariant: ["dkml-base-compiler" {= "4.12.1~v1.0.0"}]
The following actions will be performed:
  ∗ install dkml-base-compiler        4.12.1~v1.0.0
  ∗ install base-unix                 base
...
Done.
# Run eval $(opam env) to update the current shell environment
OPAMSWITCH="$PWD" && if [ -x /usr/bin/cygpath ]; then OPAMSWITCH=$(/usr/bin/cygpath -aw "$OPAMSWITCH"); fi && \
          opam monorepo lock your_example --ocaml-version=4.12.1 --require-cross-compile -vv
opam-monorepo: [DEBUG] Detected local packages:
                       your_example:/private/var/folders/8z/_n2pwgb92fx3sbkgkzhb484m0000gn/T/dkml-workflows-monorepo-example/your_example.opam
==> Using 1 locally scanned package as the target.
opam-monorepo: [INFO] Target package: your_example.
opam-monorepo: [INFO] Solve using current opam switch: /private/var/folders/8z/_n2pwgb92fx3sbkgkzhb484m0000gn/T/dkml-workflows-monorepo-example
opam-monorepo: [DEBUG] Removed dkml-base-compiler from formula as it is opam-provided
opam-monorepo: [DEBUG] Removed dkml-base-compiler from formula as it is opam-provided
opam-monorepo: [DEBUG] Removed dkml-base-compiler from formula as it is opam-provided
opam-monorepo: [DEBUG] Removed conf-dkml-cross-toolchain from formula as it is opam-provided
opam-monorepo: [INFO] Selected packages from dune-only run of solver: astring.0.8.5+dune,
                      base.v0.15.0, base-bigarray.base, base-bytes.base,
                      base-threads.base, base-unix.base, bos.0.2.1+dune,
                      camlp-streams.5.0.1, camomile.1.0.2,
                      cmdliner.1.1.1+dune, cppo.1.6.9, csexp.1.5.1,
                      diskuvbox.0.1.0, dune.3.4.1, dune-build-info.3.4.1,
                      dune-configurator.3.4.1, either.1.0.0,
                      findlib.1.8.1+dune, fix.20220121, fmt.0.9.0+dune,
                      fpath.0.7.3+dune, headache.1.05, logs.0.7.0+dune2,
                      lwt.5.6.1, mdx.2.1.0, menhir.20220210,
                      menhirLib.20220210, menhirSdk.20220210, ocaml.4.12.1,
                      ocaml-base-compiler.4.12.1,
                      ocaml-compiler-libs.v0.12.4, ocaml-config.2,
                      ocaml-options-vanilla.1, ocaml-version.3.5.0,
                      ocamlfind.1.8.1+dune, ocamlformat.0.24.1,
                      ocp-indent.1.8.1, ocplib-endian.1.2, odoc-parser.2.0.0,
                      ppx_derivers.1.2.1, ppx_deriving.5.2.1, ppxlib.0.27.0,
                      re.1.10.4, result.1.5, rresult.0.7.0+dune,
                      seq.base+dune, sexplib0.v0.15.1, stdio.v0.15.0,
                      stdlib-shims.0.3.0, uchar.0.0.2+dune2,
                      uucp.14.0.0+dune, uuseg.14.0.0+dune, uutf.1.0.3+dune,
                      your_example.zdev
opam-monorepo: [ERROR] Solving opam-provided dependencies could not find a solution
opam-monorepo: [ERROR] Can't find all required versions.
Selected: conf-dkml-cross-toolchain.4.12.1 ocaml-base-compiler&your_example
          ocaml-base-compiler ocaml-base-compiler ocaml ocaml-base-compiler
          ocaml-system
- astring -> astring.0.8.5+dune
    User requested = 0.8.5+dune
...
- dkml-base-compiler -> (problem)
    Rejected candidates:
      dkml-base-compiler.4.12.1~v1.0.0: In same conflict class (ocaml-core-compiler) as ocaml-base-compiler
...
- ocaml-options-vanilla -> ocaml-options-vanilla.1
    User requested = 1
- ocaml-system -> (problem)
    Rejected candidates:
      ocaml-system.4.12.1: In same conflict class (ocaml-core-compiler) as ocaml-base-compiler
...
make: *** [your_example.opam.locked] Error 1

For now I'm hand editing the .locked file.

@Leonidas-from-XIV
Copy link
Member

Hi @jonahbeckford. I'm afraid that's currently not possible since the compiler names are hardcoded because for dependency resolution these have to be special-cased.

However, it should be possible to rework the code to e.g. allow overwriting the default name of the compiler and using the flags: compiler field from OPAM to avoid having to hardcode ocaml-variants and ocaml-base-compiler in the base_packages, which I think would be a solid improvement.

Leonidas-from-XIV added a commit to Leonidas-from-XIV/opam-monorepo that referenced this issue Aug 15, 2022
This changes the logic from hardcoding the compiler "base packages" to
instead read the OPAM flags to check whether the package in question is
a compiler in which case it will be considered a base package.

It also adds code to check for packages whether they are `conf` packages,
which could be used to check for virtual packages.

Inspired by tarides#327, this would allow `dkml-base-compiler` to be considered
a base package and not accidentally vendor it. However it doesn't yet
allow using the DKML compiler, because the name of the `ocaml` conf
package is still hardcoded with no way to override it (yet).
Leonidas-from-XIV added a commit to Leonidas-from-XIV/opam-monorepo that referenced this issue Nov 21, 2022
This changes the logic from hardcoding the compiler "base packages" to
instead read the OPAM flags to check whether the package in question is
a compiler in which case it will be considered a base package.

It also adds code to check for packages whether they are `conf` packages,
which could be used to check for virtual packages.

Inspired by tarides#327, this would allow `dkml-base-compiler` to be considered
a base package and not accidentally vendor it. However it doesn't yet
allow using the DKML compiler, because the name of the `ocaml` conf
package is still hardcoded with no way to override it (yet).
Leonidas-from-XIV added a commit to Leonidas-from-XIV/opam-monorepo that referenced this issue Nov 25, 2022
This changes the logic from hardcoding the compiler "base packages" to
instead read the OPAM flags to check whether the package in question is
a compiler in which case it will be considered a base package.

It also adds code to check for packages whether they are `conf` packages,
which could be used to check for virtual packages.

Inspired by tarides#327, this would allow `dkml-base-compiler` to be considered
a base package and not accidentally vendor it. However it doesn't yet
allow using the DKML compiler, because the name of the `ocaml` conf
package is still hardcoded with no way to override it (yet).
@tmattio tmattio added the enhancement New feature or request label Jan 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants