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.
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.
--
OpenPGP: http://gmerlin.de/christopher.pub
CB07 DA40 B0B6 571D 35E2 0DEF 87E2 92A7 13E5 DEE1