On Wed, 12 Feb 2025 21:36:55 +0100 Christopher Zimmermann <chr...@openbsd.org> wrote:
> Hi Sebastien, > > the opam module looks great and will be very useful. Thanks a lot for > creating it! The slipshow port looks fine, too. > Sadly I did not find time to test it yet. What I'm especially > concerned about are non-native archs. Since I don't own any anymore, > I usually edit /usr/ports/infrastructure/mk/arch-defines.de, then > rebuild and install the ocaml and dependent ports bytecode-only. Can we tackle the problem of non-native archs or non-bytecode dependencies in-tree? It seems better to bring in new ports and see what needs to be adjusted than to stall on this... Of course if someone can/wants to test on non-amd64 all the better, but even then I think tweaks to fix the module to support other arches are easier to add in-tree. > > > Christopher > > On Wed, Feb 12, 2025 at 07:48:52PM +0100, Sebastien Marie wrote: > >ping. > > > >I would appreciate your comments/ok about sysutils/opam module. > > > >Reattaching (slightly updated) opam.port.mk. > > > >(I stripped textproc/slipshow mention to avoid distraction, even if I > >still want it to be imported) > > > >Thanks. > >-- > >Sebastien Marie > > >CATEGORIES += sysutils/opam > > > ># Fuses for hooks for BUILD_DEPENDS, do-build and do-install > >MODOPAM_BUILDDEP ?= Yes > >MODOPAM_BUILD ?= Yes > >MODOPAM_INSTALL ?= Yes > > > ># Opam packages options. > >MODOPAM_WITH_DOC ?= No > >MODOPAM_WITH_TEST ?= No > > > ># Add sysutils/opam to BUILD_DEPENDS. > >.if ${MODOPAM_BUILDDEP:L} == "yes" > >BUILD_DEPENDS += sysutils/opam>=2.3 > >.endif > > > ># Default location of opam binary (provided by sysutils/opam). > ># Uses --cli=2.3 to stick with 2.3 options even if opam is upgraded. > >MODOPAM_OPAM_BIN ?= ${LOCALBASE}/bin/opam --cli=2.3 > > > ># Default path for OPAMROOT. > >MODOPAM_OPAMROOT ?= ${WRKDIR}/modopam-opamroot > > > ># Opam packages to manipulate. Default to PKGSTEM. > >MODOPAM_PACKAGES ?= ${PKGSTEM} > >MODOPAM_PACKAGES_REPOSITORY ?= ${MODOPAM_PACKAGES} > >MODOPAM_PACKAGES_BUILD ?= ${MODOPAM_PACKAGES} > >MODOPAM_PACKAGES_INSTALL ?= ${MODOPAM_PACKAGES} > > > ># convert "word1 word2" to "word1,word2" > >.for x in ${MODOPAM_PACKAGES_REPOSITORY} > >_MODOPAM_PACKAGES_REPOSITORY := ${_MODOPAM_PACKAGES_REPOSITORY},$x > >.endfor > >_MODOPAM_PACKAGES_REPOSITORY := ${_MODOPAM_PACKAGES_REPOSITORY:S/,//} > > > ># Environment for opam binary. > >MODOPAM_ENV += OPAMROOT=${MODOPAM_OPAMROOT} \ > > OPAMCOLOR=never \ > > OPAMERRLOGLEN=0 \ > > OPAMINPLACEBUILD=true \ > > OPAMJOBS=${MAKE_JOBS} \ > > OPAMVERBOSE=1 \ > > DUNE_CACHE=disabled > > > >.if ${MODULES:Mlang/ocaml} > ># fix bad interaction with lang/ocaml > ># and restore OCAMLFIND_DESTDIR value to default. > >MODOPAM_ENV += > >OCAMLFIND_DESTDIR=${MODOPAM_OPAMROOT}/${_MODOPAM_SWITCH}/lib .endif > > > >.if ${MODOPAM_WITH_DOC:L} == "yes" > >MODOPAM_ENV += OPAMWITHDOC=true > >_MODOPAM_LIST_ARGS += --with-doc > >.else > >MODOPAM_ENV += OPAMWITHDOC=false > >.endif > > > >.if ${MODOPAM_WITH_TEST:L} == "yes" > >MODOPAM_ENV += OPAMWITHTEST=true > >_MODOPAM_LIST_ARGS += --with-test > >.else > >MODOPAM_ENV += OPAMWITHTEST=false > >.endif > > > ># Helper to shorten opam calls. > >MODOPAM_OPAM_RUN = \ > > ${SETENV} ${MAKE_ENV} ${MODOPAM_ENV} ${MODOPAM_OPAM_BIN} > > > ># opam repository path to use. > >MODOPAM_REPO_NAME ?= ${PKGSTEM}-opam-YYYYMMDD > >MODOPAM_REPO_DIR ?= ${WRKDIR}/${MODOPAM_REPO_NAME} > > > ># opam repository commit to use when fetching a base repository with > ># modopam-repository target. > >MODOPAM_REPO_COMMIT ?= master > > > ># Url for fetching the opam repository. Extracted directory is > ># expected to be opam-repository-${MODOPAM_REPO_COMMIT} . > >MODOPAM_REPO_URL > >?= > >https://github.com/ocaml/opam-repository/archive/${MODOPAM_REPO_COMMIT}.tar.gz > > > ># Name of the default switch. > >_MODOPAM_SWITCH ?= default > > > ># internal variable. opam init is called several times. > >_MODOPAM_OPAM_INIT_ARGS = \ > > --reinit \ > > --no-setup \ > > --no-opamrc \ > > --kind=local > > > ># internal variable. opam pin add is called several times. > >_MODOPAM_OPAM_PIN_ADD_ARGS = \ > > --kind=path \ > > --no-action \ > > --recursive \ > > --yes > > > ># internal variable. for opam list. > >_MODOPAM_LIST_ARGS += \ > > --resolve="${_MODOPAM_PACKAGES_REPOSITORY}" > > > ># configure hook. initialize OPAMROOT. > >MODOPAM_configure = \ > > if [ ! -d "${MODOPAM_REPO_DIR}" ]; then \ > > echo "error: opam.port.mk: no available repository" > > >&2 ; \ echo " see, make modopam-repository" >&2 ; \ > > exit 1 ; \ > > fi ; \ > > ${ECHO_MSG} "[modopam] opam init" ; \ > > cd ${WRKBUILD} && ${MODOPAM_OPAM_RUN} init \ > > ${_MODOPAM_OPAM_INIT_ARGS} \ > > ${MODOPAM_REPO_DIR} ; \ > > ${ECHO_MSG} "[modopam] opam pin add ${WRKSRC}" ; \ > > cd ${WRKBUILD} && ${MODOPAM_OPAM_RUN} pin add \ > > ${_MODOPAM_OPAM_PIN_ADD_ARGS} \ > > ${WRKSRC} ; > > > ># Define the build target. > >MODOPAM_BUILD_TARGET = \ > > cd ${WRKBUILD} && ${MODOPAM_OPAM_RUN} install \ > > --assume-depexts \ > > --yes \ > > ${MODOPAM_PACKAGES_BUILD} ; > > > >.if !target(do-build) && ${MODOPAM_BUILD:L} == "yes" > >do-build: > > @${MODOPAM_BUILD_TARGET} > >.endif > > > ># Define the install target. > >MODOPAM_INSTALL_TARGET = \ > > cd ${WRKBUILD} && ${MODOPAM_OPAM_RUN} install \ > > --destdir=${PREFIX} \ > > --assume-depexts \ > > --yes \ > > ${MODOPAM_PACKAGES_INSTALL} ; \ > > for dir in ${PREFIX}/lib/* ; do \ > > [ -r "$${dir}/META" ] && \ > > mv -- "$${dir}" ${PREFIX}/lib/ocaml/ ; \ > > done ; \ > > if [ -d ${PREFIX}/lib/stublibs ] ; then \ > > mv ${PREFIX}/lib/stublibs/* \ > > ${PREFIX}/lib/ocaml/stublibs ; \ > > rmdir ${PREFIX}/lib/stublibs ; \ > > fi ; > > > >.if !target(do-install) && ${MODOPAM_INSTALL:L} == "yes" > >do-install: > > @${MODOPAM_INSTALL_TARGET} > >.endif > > > ># Helper target to fetch and prepare an opam repository for > >opam-module. # Warning, run as normal user. > ># - opam init : needs network + filesystem write access > ># - opam admin cache : needs network + filesystem write access > >_MODOPAM_GEN_DIR ?= /tmp > >modopam-repository: patch > > rm -rf -- ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME} > > > > ftp -o- ${MODOPAM_REPO_URL} | tar xzf - -C > > ${_MODOPAM_GEN_DIR} mv > > /tmp/opam-repository-${MODOPAM_REPO_COMMIT} \ > > ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME} > > > > cd ${_MODOPAM_GEN_DIR} && ${MODOPAM_OPAM_BIN} init \ > > --root=${_MODOPAM_GEN_DIR}/opamroot \ > > ${_MODOPAM_OPAM_INIT_ARGS} \ > > ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME} > > > > cd ${_MODOPAM_GEN_DIR} && ${MODOPAM_OPAM_RUN} pin add \ > > --root=${_MODOPAM_GEN_DIR}/opamroot \ > > ${_MODOPAM_OPAM_PIN_ADD_ARGS} \ > > ${WRKSRC} > > > > cd ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME} && \ > > ${MODOPAM_OPAM_BIN} list \ > > --root=${_MODOPAM_GEN_DIR}/opamroot \ > > --columns=package \ > > --normalise \ > > ${_MODOPAM_LIST_ARGS} \ > > | xargs ${MODOPAM_OPAM_BIN} admin filter \ > > --root=${_MODOPAM_GEN_DIR}/opamroot \ > > --yes > > > > cd ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME} && \ > > ${MODOPAM_OPAM_BIN} admin cache \ > > --root=${_MODOPAM_GEN_DIR}/opamroot > > > > @rm -rf -- ${_MODOPAM_GEN_DIR}/opamroot > > > > @printf "\nThe repository is ready: > > ${_MODOPAM_GEN_DIR}/${MODOPAM_REPO_NAME}\n" > > > ># Helper target to show external dependencies (from opam point of > >vue). modopam-external: configure > > @${_PMAKE} _modopam-external-internal > > > ># run as _pbuild. > >_modopam-external-internal: > > @cd ${WRKBUILD} && ${MODOPAM_OPAM_RUN} list \ > > --external \ > > ${_MODOPAM_LIST_ARGS} > > > > >Sebastien Marie <sema...@kapouay.eu.org> writes: > > > >> Hi, > >> > >> [...] > >> > >> And regarding the sysutils/opam module, I wrote a opam-module > >> documentation (still plain text, not written to mdoc for now): > >> > >> ---- > >> This manual page documents the behavior of setting > >> MODULES=sysutils/opam in the ports(7) tree. > >> > >> The module provides helpers for packaging a program using opam > >> (OCaml Package Manager). > >> > >> WRKSRC is expected to contains opam packages, possibly with local > >> customization. All *.opam files, at any depth, will be registered. > >> Unmodified dependencies should be omitted, they will be managed > >> separately. > >> > >> To generate a standalone opam repository containing only the > >> dependencies and the sources files for compiling the specified > >> sources tree, "make modopam-repository" target could be used. It > >> will download an opam repository from MODOPAM_REPO_URL (default to > >> official opam repository hosted on github), using > >> MODOPAM_REPO_COMMIT commit (it is preferable to explicitly specify > >> it for reproductibility, but "master" is the default value). The > >> repository will be named according to MODOPAM_REPO_NAME variable. > >> Next, the repository will be stripped to contains only the build > >> dependencies of MODOPAM_PACKAGES_REPOSITORY (default to > >> "--resolve=$MODOPAM_PACKAGES"). And next, the repository will be > >> filled with local cache of package archives. The resulting > >> directory could be packaged and distributed. It contains source > >> code for building the opam packages. > >> > >> External dependencies could be hinted using "make > >> modopam-external" target. The list of packages expected to be > >> present at build time is shown. > >> > >> The module appends to BUILD_DEPENDS unless MODOPAM_BUILDDEP is set > >> to No. > >> > >> It sets MODOPAM_PACKAGES variable to PKGSTEM, as default value for > >> opam packages to build and install. > >> > >> It sets MODOPAM_OPAMROOT, MODOPAM_ENV, MODOPAM_OPAM_BIN and > >> MODOPAM_OPAM_RUN accordingly. > >> > >> The opam options --with-doc and --with-test are available using > >> MODOPAM_WITH_DOC and MODOPAM_WITH_TEST. They defaults to No. > >> > >> A CONFIGURE_STYLE "opam" is provided. It will initialize opam with > >> opam repository at MODOPAM_REPO_DIR (default to > >> ${WRKDIR}/${MODOPAM_REPO_NAME}). It is expected to has be > >> generated previously by modopam-repository target and distributed > >> separately. It will also pin the opam packages present in WRKSRC, > >> possibly overriding opam packages from the repository. > >> > >> A default build target is used (except if MODOPAM_BUILD is set to > >> No). It is using MODOPAM_PACKAGES_BUILD variable to list the opam > >> packages to build (default to MODOPAM_PACKAGES). > >> > >> A default install target is used (except if MODOPAM_INSTALL is set > >> to No). It is using MODOPAM_PACKAGES_INSTALL variable to list the > >> opam packages to install (default to MODOPAM_PACKAGES). > >> ---- > >> > >> I attached slipshow tarball and opam.port.mk file (to be placed in > >> ports/sysutils/opam directory). > >> > >> Comments are welcome, OK too. > >> > >> I have also a rewrite of lang/haxe proposition from thfr@ using the > >> module (not attached to not mix too many things). > >> > >> Thanks. > >