1f583dbce3
This is a long-overdue update, so there are many changes. Details are in the Changes file in the distribution. The mk/ocaml file will be moved to lang/ocaml and the logic for selecting whether to use the native-code compiler will be factored out into native.mk to avoid duplications. This is the final version before OCaml 5.0 arrives, which has multicore support and should be a major change from the 4.x versions.
253 lines
6.1 KiB
Makefile
253 lines
6.1 KiB
Makefile
# $NetBSD: ocaml.mk,v 1.1 2022/05/24 18:25:38 jaapb Exp $
|
|
#
|
|
# This Makefile fragment handles the common variables used by OCaml packages.
|
|
# It should be included by every package that uses OCaml.
|
|
#
|
|
# Package-settable variables:
|
|
# OCAML_USE_FINDLIB
|
|
# package uses findlib infrastructure
|
|
# OCAML_FINDLIB_DIRS
|
|
# directories under OCAML_SITELIBDIR that this package installs into
|
|
# OCAML_FINDLIB_REGISTER
|
|
# register findlib directories into OCaml ld.conf
|
|
# OCAML_USE_OASIS [implies OCAML_USE_FINDLIB]
|
|
# package uses oasis infrastructure
|
|
# OCAML_USE_OASIS_DYNRUN [implies OCAML_USE_OASIS]
|
|
# package uses oasis.dynrun
|
|
# OCAML_USE_OPAM
|
|
# package uses OPAM installer [implies OCAML_USE_FINDLIB]
|
|
# OCAML_USE_TOPKG
|
|
# package uses topkg [implies OCAML_USE_FINDLIB]
|
|
# OCAML_USE_DUNE
|
|
# package uses dune [implies OCAML_USE_OPAM]
|
|
# OCAML_TOPKG_DOCDIR
|
|
# different targets for topkg (bytecode, optional bytecode, native)
|
|
# OASIS_BUILD_ARGS
|
|
# arguments for oasis build
|
|
# Set by this file:
|
|
# OCAML_SITELIBDIR
|
|
|
|
.if !defined(OCAML_MK)
|
|
OCAML_MK= # defined
|
|
|
|
# Text relocations errors when building packages that use
|
|
# ocamlfind on i386.
|
|
MKPIE_SUPPORTED= no
|
|
|
|
.include "../../mk/bsd.fast.prefs.mk"
|
|
.include "../../lang/ocaml/native.mk"
|
|
|
|
|
|
_PKG_VARS.ocaml= \
|
|
OCAML_USE_FINDLIB \
|
|
OCAML_FINDLIB_DIRS \
|
|
OCAML_FINDLIB_REGISTER \
|
|
OCAML_USE_OASIS \
|
|
OCAML_USE_OASIS_DYNRUN \
|
|
OASIS_BUILD_ARGS \
|
|
OCAML_USE_OPAM \
|
|
OCAML_USE_TOPKG \
|
|
OCAML_TOPKG_NAME \
|
|
OCAML_TOPKG_DOCDIR \
|
|
OCAML_TOPKG_FLAGS \
|
|
OCAML_TOPKG_TARGETS \
|
|
OCAML_TOPKG_OPTIONAL_TARGETS \
|
|
OCAML_USE_DUNE \
|
|
DUNE_BUILD_FLAGS \
|
|
DUNE_BUILD_PACKAGES \
|
|
DUNE_BUILD_TARGETS \
|
|
OCAML_BUILD_ARGS \
|
|
OPAM_INSTALL_DIR \
|
|
OPAM_INSTALL_FILES
|
|
_SYS_VARS.ocaml= \
|
|
OCAML_SITELIBDIR
|
|
|
|
# Default value of OCAML_USE_FINDLIB
|
|
OCAML_USE_FINDLIB?= no
|
|
|
|
# Default value of OCAML_USE_OASIS
|
|
OCAML_USE_OASIS?= no
|
|
|
|
# Default value of OCAML_USE_OASIS_DYNRUN
|
|
OCAML_USE_OASIS_DYNRUN?= no
|
|
|
|
# Default value of OCAML_USE_TOPKG
|
|
OCAML_USE_TOPKG?= no
|
|
|
|
# Default value of OCAML_USE_DUNE
|
|
OCAML_USE_DUNE?= no
|
|
|
|
OCAML_TOPKG_NAME?= ${PKGBASE:S/^ocaml-//}
|
|
OCAML_TOPKG_DOCDIR?= ${PREFIX}/share/doc
|
|
OCAML_TOPKG_FLAGS?= # empty
|
|
OCAML_TOPKG_TARGETS?= # empty
|
|
OCAML_TOPKG_OPTIONAL_TARGETS?= # empty
|
|
OCAML_TOPKG_NATIVE_TARGETS?= # empty
|
|
|
|
OPAM_INSTALL_FILES?= ${OCAML_TOPKG_NAME}
|
|
DUNE_BUILD_FLAGS?= # empty
|
|
DUNE_BUILD_TARGETS?= @install
|
|
DUNE_BUILD_PACKAGES?= # empty
|
|
|
|
# Default value of OASIS_BUILD_ARGS
|
|
OASIS_BUILD_ARGS?= # empty
|
|
|
|
#
|
|
# Configure stuff for OASIS_DYNRUN
|
|
#
|
|
.if ${OCAML_USE_OASIS_DYNRUN} == "yes"
|
|
.include "../../devel/ocaml-oasis/buildlink3.mk"
|
|
OCAML_USE_OASIS= yes
|
|
.endif
|
|
|
|
#
|
|
# Configure stuff for OASIS
|
|
#
|
|
.if ${OCAML_USE_OASIS} == "yes"
|
|
OCAML_USE_FINDLIB= yes
|
|
HAS_CONFIGURE= yes
|
|
CONFIGURE_ARGS+= --destdir "${DESTDIR}"
|
|
CONFIGURE_ARGS+= --prefix "${PREFIX}"
|
|
# Force use of native code compiler according to setting
|
|
.if ${OCAML_USE_OPT_COMPILER} == "yes"
|
|
CONFIGURE_ARGS+= --override is_native true
|
|
.else
|
|
CONFIGURE_ARGS+= --override is_native false
|
|
.endif
|
|
.endif
|
|
|
|
# Configure stuff for DUNE
|
|
.if ${OCAML_USE_DUNE} == "yes"
|
|
.include "../../devel/ocaml-dune/buildlink3.mk"
|
|
OCAML_USE_OPAM?= yes
|
|
OPAM_INSTALL_DIR?= _build/default
|
|
.else
|
|
OCAML_USE_OPAM?= no
|
|
.endif
|
|
|
|
# Configure stuff for OPAM
|
|
.if ${OCAML_USE_OPAM} == "yes"
|
|
.include "../../misc/ocaml-opaline/buildlink3.mk"
|
|
OCAML_USE_FINDLIB= yes
|
|
.endif
|
|
|
|
# Configure stuff for TOPKG
|
|
.if ${OCAML_USE_TOPKG} == "yes"
|
|
.include "../../misc/ocaml-topkg/buildlink3.mk"
|
|
OCAML_USE_FINDLIB= yes
|
|
INSTALLATION_DIRS+= ${OCAML_SITELIBDIR}/${OCAML_TOPKG_NAME}
|
|
.endif
|
|
|
|
# Fallback value for OPAM_INSTALL_DIR
|
|
OPAM_INSTALL_DIR?= .
|
|
|
|
# Value for OCAML_SITELIBDIR
|
|
OCAML_SITELIBDIR= lib/ocaml/site-lib
|
|
MAKE_ENV+= OCAML_SITELIBDIR="${OCAML_SITELIBDIR}"
|
|
PLIST_SUBST+= OCAML_SITELIB="${OCAML_SITELIBDIR}"
|
|
|
|
PRINT_PLIST_AWK+= { gsub(/^.+\.cmx/, "$${PLIST.ocaml-opt}&") }
|
|
PRINT_PLIST_AWK+= { gsub(/^.+\.a$$/, "$${PLIST.ocaml-opt}&") }
|
|
PRINT_PLIST_AWK+= { gsub(/${OCAML_SITELIBDIR:S|/|\\/|g}/, \
|
|
"$${OCAML_SITELIB}"); \
|
|
print; next; }
|
|
|
|
.if ${OCAML_USE_FINDLIB} == "yes"
|
|
.include "../../devel/ocaml-findlib/buildlink3.mk"
|
|
INSTALLATION_DIRS+= ${OCAML_SITELIBDIR}
|
|
OCAML_FINDLIB_DIRS?= ${PKGBASE:S/^ocaml-//}
|
|
OCAML_FINDLIB_REGISTER?= yes
|
|
.endif
|
|
|
|
#
|
|
# Compiler stuff
|
|
#
|
|
|
|
#
|
|
# OASIS targets
|
|
#
|
|
.if ${OCAML_USE_OASIS} == "yes"
|
|
# OASIS uses ocamlbuild
|
|
.include "../../devel/ocamlbuild/buildlink3.mk"
|
|
.if ${OCAML_USE_OASIS_DYNRUN} == "yes"
|
|
pre-configure:
|
|
${RUN} cd ${WRKSRC} && ocamlfind ocamlc -linkpkg -package oasis.dynrun -o setup setup.ml && ${RM} setup.cmo setup.cmi
|
|
|
|
OASIS_EXEC= ./setup
|
|
.else
|
|
OASIS_EXEC= ocaml setup.ml
|
|
.endif
|
|
|
|
# Redefine configure target
|
|
do-configure:
|
|
${RUN} cd ${WRKSRC} && \
|
|
${SETENV} ${CONFIGURE_ENV} ${OASIS_EXEC} -configure ${CONFIGURE_ARGS}
|
|
|
|
# Redefine build target
|
|
do-build:
|
|
${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \
|
|
${SETENV} ${MAKE_ENV} ${OASIS_EXEC} -build ${OASIS_BUILD_ARGS}
|
|
|
|
# Redefine install target
|
|
do-install:
|
|
${RUN} cd ${WRKSRC} && \
|
|
${OASIS_EXEC} -install --destdir ${DESTDIR} --prefix ${PREFIX}
|
|
.endif
|
|
|
|
#
|
|
# topkg targets
|
|
#
|
|
.if ${OCAML_USE_TOPKG} == "yes"
|
|
|
|
do-build:
|
|
${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \
|
|
${SETENV} ${MAKE_ENV} ocaml pkg/pkg.ml build ${OCAML_TOPKG_FLAGS}
|
|
|
|
.endif # ${OCAML_USE_TOPKG} == "yes"
|
|
|
|
#
|
|
# opam targets
|
|
#
|
|
.if ${OCAML_USE_OPAM} == "yes"
|
|
|
|
do-install:
|
|
${RUN} for i in ${OPAM_INSTALL_FILES}; do \
|
|
cd ${WRKSRC} && opaline -install-cmd "${INSTALL_DATA}" \
|
|
-exec-install-cmd "${INSTALL_PROGRAM}" \
|
|
-name $$i \
|
|
-destdir ${DESTDIR} \
|
|
-prefix ${PREFIX} \
|
|
-libdir ${PREFIX}/${OCAML_SITELIBDIR} \
|
|
-mandir ${PREFIX}/${PKGMANDIR} \
|
|
-docdir ${OCAML_TOPKG_DOCDIR}/$$i \
|
|
-stublibsdir ${PREFIX}/${OCAML_SITELIBDIR}/stublibs \
|
|
-bindir ${PREFIX}/bin \
|
|
${OPAM_INSTALL_DIR}/$$i.install; \
|
|
done
|
|
|
|
.endif # ${OCAML_USE_OPAM} == "yes"
|
|
|
|
#
|
|
# dune targets
|
|
#
|
|
.if ${OCAML_USE_DUNE} == "yes"
|
|
|
|
do-build:
|
|
.if !empty(DUNE_BUILD_PACKAGES)
|
|
${RUN} ${_ULIMIT_CMD} \
|
|
cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} \
|
|
dune build -j ${MAKE_JOBS:U1} \
|
|
${DUNE_BUILD_FLAGS} -p ${DUNE_BUILD_PACKAGES:ts,} \
|
|
${DUNE_BUILD_TARGETS}
|
|
.else
|
|
${RUN} ${_ULIMIT_CMD} \
|
|
cd ${WRKSRC} && dune build --profile release -j ${MAKE_JOBS:U1} \
|
|
${DUNE_BUILD_FLAGS} ${DUNE_BUILD_TARGETS}
|
|
.endif
|
|
|
|
.endif # ${OCAML_USE_DUNE} == "yes"
|
|
|
|
# Add dependency on ocaml.
|
|
.include "../../lang/ocaml/buildlink3.mk"
|
|
|
|
.endif # OCAML_MK
|