Hi Greg,
On Mon, Feb 22, 2021 at 08:26:43PM -0800, Greg Steuck wrote:
> Happily I can gradually work haskell ports over to the new infra without
> upgrading lang/ghc and then destroying and recreating the world. Maybe
> it would've been less work total to do a big bang, but hopefully this is
> easier to swallow in little bits. Any rollback is less of a pain should
> it have to happen.
>
> As a reminder, the eventual goal is to move every haskell binary port
> over to cabal.port.mk and thus deconstrain future upgrades of the ports
> and lang/ghc.
This looks good, at the moment I'm test-building happy (will take
some hours, because some dependency of ghc had been updated, so my
machine is rebuilding it, too).
However, I'm not sure wether devel/cabal is the right place for
cabal.port.mk. Shouldn't modules-only files to be put into
infrastructure/mk?
What do other ports people think?
Ciao,
Kili
> >From 79f9ac90d524e4df33191fd73e09487cb7711a96 Mon Sep 17 00:00:00 2001
> From: Greg Steuck <[email protected]>
> Date: Sun, 13 Sep 2020 17:04:03 -0700
> Subject: [PATCH 1/2] Add cabal.port.mk to more easily build haskell ports
>
> Corrections by James Cook <[email protected]>
> ---
> devel/cabal/cabal.port.mk | 155 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 155 insertions(+)
> create mode 100644 devel/cabal/cabal.port.mk
>
> diff --git a/devel/cabal/cabal.port.mk b/devel/cabal/cabal.port.mk
> new file mode 100644
> index 00000000000..7def1866116
> --- /dev/null
> +++ b/devel/cabal/cabal.port.mk
> @@ -0,0 +1,155 @@
> +# $OpenBSD$
> +
> +# Module for building Haskell programs with cabal-install.
> +# Inspired by FreeBSD cabal.mk by Gleb Popov.
> +
> +# Input variables:
> +#
> +# MODCABAL_STEM - the name of the package on hackage.
> +# MODCABAL_VERSION - the version of the package.
> +# MODCABAL_MANIFEST - hackage dependencies required by this package, triples
> +# of space separate <package> <version> <revision>. Typically generated
> +# with cabal-bundler program from cabal-extras, e.g.
> +# cabal-bundler --openbsd darcs-2.16.2
> +# MODCABAL_DATA_DIR - data-dir from .cabal file (if the port needs the data)
> +#
> https://cabal.readthedocs.io/en/latest/cabal-package.html#pkg-field-data-dir
> +# MODCABAL_REVISION - Numeric revision of .cabal file on hackage if one is
> +# needed on top of .cabal file contained in the .tar.gz file.
> +# MODCABAL_BUILD_ARGS - passed to cabal v2-build, e.g. make
> MODCABAL_BUILD_ARGS=-v
> +# is a nice debugging aid.
> +# MODCABAL_FLAGS - passed to --flags= of cabal v2-build. Seemingly
> superfluous given
> +# MODCABAL_BUILD_ARGS, but it is useful to keep this value separate as it
> +# is used to generate the build plan and will be available without
> parsing.
> +# MODCABAL_EXECUTABLES - Executable target in .cabal file, by default uses
> +# the hackage package name.
> +# https://cabal.readthedocs.io/en/latest/cabal-package.html#executables
> +#
> +# Available output variables:
> +#
> +# MODCABAL_BUILT_EXECUTABLE_${_exe} is built for each of
> MODCABAL_EXECUTABLES.
> +# These are available for `make test` after `make build` phase.
> +#
> +# Special files:
> +# files/cabal.project is used automatically.
> +
> +ONLY_FOR_ARCHS = i386 amd64
> +
> +BUILD_DEPENDS += devel/cabal-install>=3.4.0.0 \
> + lang/ghc>=8.6.4
> +
> +# Takes over :9 site for hackage. The day when we have a port using
> +# both Go/Rust and Hackage we'll have to resolve their common
> +# insistance on grabbing :9.
> +MASTER_SITES9 = https://hackage.haskell.org/package/
> +
> +DIST_SUBDIR ?= hackage
> +
> +# The .cabal files are explicitly copied over the ones extracted from
> +# archives by the normal extraction rules.
> +EXTRACT_CASES += *.cabal) ;;
> +
> +DISTNAME ?= ${MODCABAL_STEM}-${MODCABAL_VERSION}
> +HOMEPAGE ?= ${MASTER_SITES9}${MODCABAL_STEM}
> +MASTER_SITES ?= ${MASTER_SITES9}${DISTNAME}/
> +DISTFILES ?= ${DISTNAME}.tar.gz
> +SUBST_VARS += MODCABAL_STEM MODCABAL_VERSION PKGNAME
> +
> +# Oftentime our port name and the executable name coincide.
> +MODCABAL_EXECUTABLES ?= ${MODCABAL_STEM}
> +
> +# Cabal won't download anything from hackage if config file exists.
> +MODCABAL_post-extract = \
> + mkdir -p ${WRKDIR}/.cabal \
> + && touch ${WRKDIR}/.cabal/config
> +
> +# Some packages need an updated .cabal file from hackage to overwrite
> +# the one in the tar ball.
> +.if defined(MODCABAL_REVISION)
> +DISTFILES +=
> ${DISTNAME}_${MODCABAL_REVISION}{revision/${MODCABAL_REVISION}}.cabal
> +MODCABAL_post-extract += \
> + && cp ${FULLDISTDIR}/${DISTNAME}_${MODCABAL_REVISION}.cabal \
> + ${WRKSRC}/${MODCABAL_STEM}.cabal
> +.endif
> +
> +# The dependent sources get downloaded from hackage.
> +.for _package _version _revision in ${MODCABAL_MANIFEST}
> +DISTFILES += {${_package}-${_version}/}${_package}-${_version}.tar.gz:9
> +. if ${_revision} > 0
> +DISTFILES +=
> ${_package}-${_version}_${_revision}{${_package}-${_version}/revision/${_revision}}.cabal:9
> +MODCABAL_post-extract += \
> + && cp ${FULLDISTDIR}/${_package}-${_version}_${_revision}.cabal \
> + ${WRKDIR}/${_package}-${_version}/${_package}.cabal
> +. endif
> +# References all the locally available dependencies. Ideally these
> +# should be command line options, tracking issue:
> +# https://github.com/haskell/cabal/issues/3585
> +MODCABAL_post-extract += \
> + && echo "packages: ${WRKDIR}/${_package}-${_version}/${_package}.cabal"
> >> ${WRKSRC}/cabal.project.local
> +.endfor # MODCABAL_MANIFEST
> +
> +# Automatically copies the cabal.project file if any.
> +MODCABAL_post-extract += \
> + && (test -f ${FILESDIR}/cabal.project \
> + && cp -v ${FILESDIR}/cabal.project ${WRKSRC}; true)
> +
> +# Invokes cabal with HOME set up to use .cabal directory created in
> +# post-extract.
> +_MODCABAL_CABAL = ${SETENV} ${MAKE_ENV} HOME=${WRKDIR} ${LOCALBASE}/bin/cabal
> +
> +# Building a cabal package is merely an invocation of cabal v2-build.
> +_MODCABAL_BUILD_TARGET = \
> + cd ${WRKBUILD} \
> + && ${_MODCABAL_CABAL} v2-build --offline --disable-benchmarks
> --disable-tests \
> + -w ${LOCALBASE}/bin/ghc \
> + -j${MAKE_JOBS} \
> + --flags="${MODCABAL_FLAGS}" ${MODCABAL_BUILD_ARGS} \
> + ${MODCABAL_EXECUTABLES:C/^/exe:&/}
> +
> +# Install fragment starts this way for uniformity of incremental
> construction.
> +_MODCABAL_INSTALL_TARGET = true
> +
> +# Prepares wrapping fragments that only need to be set up once and
> +# reused across potentially multiple installed executables.
> +.if defined(MODCABAL_DATA_DIR)
> +_MODCABAL_LIBEXEC = libexec/cabal
> +_MODCABAL_INSTALL_TARGET += \
> + && mkdir -p ${PREFIX}/${_MODCABAL_LIBEXEC}
> +
> +_MODCABAL_INSTALL_TARGET += \
> + && ${INSTALL_DATA_DIR} ${WRKSRC}/${MODCABAL_DATA_DIR}
> ${PREFIX}/share/${DISTNAME} \
> + && cd ${WRKSRC}/${MODCABAL_DATA_DIR} && umask 022 && pax -rw .
> ${PREFIX}/share/${DISTNAME}
> +.endif
> +
> +# Appends installation fragments for each executable.
> +.for _exe in ${MODCABAL_EXECUTABLES}
> +# Exports the path to the executable for testing. The location is
> +# somewhat hard to predict in advance, thus it is determined at runtime.
> +MODCABAL_BUILT_EXECUTABLE_${_exe} = $$(find ${WRKSRC}/dist-newstyle -name
> ${_exe} -type f -perm -a+x)
> +. if defined(MODCABAL_DATA_DIR)
> +# Installs the ELF binary into an auxiliary location and wraps it into
> +# a script which sets up the environment to point at the data-dir
> +# files if any.
> +_MODCABAL_INSTALL_TARGET += \
> + && ${INSTALL_PROGRAM} \
> + ${MODCABAL_BUILT_EXECUTABLE_${_exe}} \
> + ${PREFIX}/${_MODCABAL_LIBEXEC}/${_exe} \
> + && echo '\#!/bin/sh' > ${PREFIX}/bin/${_exe} \
> + && echo 'export ${_exe}_datadir=${LOCALBASE}/share/${DISTNAME}' >>
> ${PREFIX}/bin/${_exe} \
> + && echo 'exec ${LOCALBASE}/${_MODCABAL_LIBEXEC}/${_exe} "$$@"' >>
> ${PREFIX}/bin/${_exe} \
> + && chmod +x ${STAGEDIR}${PREFIX}/bin/${_exe}
> +. else
> +# Skips the launcher script indirection when MODCABAL_DATA_DIR is empty.
> +_MODCABAL_INSTALL_TARGET += \
> + && ${INSTALL_PROGRAM} ${MODCABAL_BUILT_EXECUTABLE_${_exe}} ${PREFIX}/bin
> +. endif
> +.endfor
> +
> +.if !target(do-build)
> +do-build:
> + @${_MODCABAL_BUILD_TARGET}
> +.endif
> +
> +.if !target(do-install)
> +do-install:
> + @${_MODCABAL_INSTALL_TARGET}
> +.endif
> --
> 2.30.1
>
> >From 135c51a1dbd54e93fc4c01073a410d6b992bab95 Mon Sep 17 00:00:00 2001
> From: Greg Steuck <[email protected]>
> Date: Thu, 20 Aug 2020 11:54:08 -0700
> Subject: [PATCH 2/2] Use devel/cabal module for devel/happy (upgrade to 1.20)
>
> Passes `make test` and produces a package good enough for ghc build.
>
> This is the first package to rely on cabal.port.mk module.
> ---
> devel/happy/Makefile | 12 ++---
> devel/happy/distinfo | 4 +-
> devel/happy/pkg/PLIST | 110 +++++++++++++++++++++---------------------
> 3 files changed, 64 insertions(+), 62 deletions(-)
>
> diff --git a/devel/happy/Makefile b/devel/happy/Makefile
> index 341a5ba2d73..304db399a49 100644
> --- a/devel/happy/Makefile
> +++ b/devel/happy/Makefile
> @@ -2,9 +2,10 @@
>
> COMMENT= parser generator for Haskell
>
> -PORTROACH = ignore:1
> +MODCABAL_STEM= happy
> +MODCABAL_VERSION= 1.20.0
> +MODCABAL_DATA_DIR= data
>
> -DISTNAME= happy-1.19.10
> CATEGORIES= devel
>
> HOMEPAGE= http://www.haskell.org/happy/
> @@ -14,8 +15,7 @@ PERMIT_PACKAGE= Yes
>
> WANTLIB= c ffi gmp iconv m pthread
>
> -MODULES= lang/ghc
> -MODGHC_BUILD= cabal hackage nort
> +MODULES= devel/cabal
>
> LIB_DEPENDS= converters/libiconv \
> devel/gmp \
> @@ -40,7 +40,7 @@ post-install:
>
> do-test:
> @cd ${WRKBUILD}/tests && exec ${SETENV} ${MAKE_ENV} \
> - ${MAKE_PROGRAM} HAPPY=${WRKBUILD}/dist/build/happy/happy \
> - TEST_HAPPY_OPTS="-t ${WRKBUILD} --strict"
> + ${MAKE_PROGRAM} -j${MAKE_JOBS}
> HAPPY=${MODCABAL_BUILT_EXECUTABLE_happy} \
> + TEST_HAPPY_OPTS="-t ${WRKBUILD}/data --strict"
>
> .include <bsd.port.mk>
> diff --git a/devel/happy/distinfo b/devel/happy/distinfo
> index 0e2838f9490..bb548e6c50c 100644
> --- a/devel/happy/distinfo
> +++ b/devel/happy/distinfo
> @@ -1,2 +1,2 @@
> -SHA256 (ghc/happy-1.19.10.tar.gz) =
> IutgbJcQWzluHH3CfhIMoCAlqH8+RNLqUr5qZTpSyu0=
> -SIZE (ghc/happy-1.19.10.tar.gz) = 181506
> +SHA256 (hackage/happy-1.20.0.tar.gz) =
> Ox06j5OicjtVTZ8Hss0Ta+GnsvyrGFWxK3qrXLrIhow=
> +SIZE (hackage/happy-1.20.0.tar.gz) = 184515
> diff --git a/devel/happy/pkg/PLIST b/devel/happy/pkg/PLIST
> index c6e8375e5f6..c4ade99b79c 100644
> --- a/devel/happy/pkg/PLIST
> +++ b/devel/happy/pkg/PLIST
> @@ -1,55 +1,57 @@
> @comment $OpenBSD: PLIST,v 1.7 2020/05/15 21:50:24 kili Exp $
> -@bin bin/happy
> -share/doc/happy/
> -@comment share/doc/${DISTNAME}/
> -@comment share/doc/${DISTNAME}/LICENSE
> -share/doc/happy/fptools.css
> -share/doc/happy/happy-introduction.html
> -share/doc/happy/index.html
> -share/doc/happy/ix01.html
> -share/doc/happy/sec-AtrributeGrammarsInHappy.html
> -share/doc/happy/sec-AttrGrammarLimits.html
> -share/doc/happy/sec-AttributeGrammar.html
> -share/doc/happy/sec-AttributeGrammarExample.html
> -share/doc/happy/sec-Precedences.html
> -share/doc/happy/sec-compilation-time.html
> -share/doc/happy/sec-conflict-tips.html
> -share/doc/happy/sec-directives.html
> -share/doc/happy/sec-error.html
> -share/doc/happy/sec-finding-errors.html
> -share/doc/happy/sec-glr-misc.html
> -share/doc/happy/sec-glr-semantics.html
> -share/doc/happy/sec-glr-using.html
> -share/doc/happy/sec-glr.html
> -share/doc/happy/sec-grammar-files.html
> -share/doc/happy/sec-grammar.html
> -share/doc/happy/sec-happy-ghci.html
> -share/doc/happy/sec-info-files-conflicts.html
> -share/doc/happy/sec-info-files.html
> -share/doc/happy/sec-invoking.html
> -share/doc/happy/sec-license.html
> -share/doc/happy/sec-module-header.html
> -share/doc/happy/sec-module-trailer.html
> -share/doc/happy/sec-monad-alex.html
> -share/doc/happy/sec-monads.html
> -share/doc/happy/sec-multiple-parsers.html
> -share/doc/happy/sec-obtaining.html
> -share/doc/happy/sec-reporting-bugs.html
> -share/doc/happy/sec-sequences.html
> -share/doc/happy/sec-tips.html
> -share/doc/happy/sec-type-signatures.html
> -share/doc/happy/sec-using.html
> -share/${DISTNAME}/
> -share/${DISTNAME}/GLR_Base
> -share/${DISTNAME}/GLR_Lib
> -share/${DISTNAME}/GLR_Lib-ghc
> -share/${DISTNAME}/GLR_Lib-ghc-debug
> -share/${DISTNAME}/HappyTemplate
> -share/${DISTNAME}/HappyTemplate-arrays
> -share/${DISTNAME}/HappyTemplate-arrays-coerce
> -share/${DISTNAME}/HappyTemplate-arrays-coerce-debug
> -share/${DISTNAME}/HappyTemplate-arrays-debug
> -share/${DISTNAME}/HappyTemplate-arrays-ghc
> -share/${DISTNAME}/HappyTemplate-arrays-ghc-debug
> -share/${DISTNAME}/HappyTemplate-coerce
> -share/${DISTNAME}/HappyTemplate-ghc
> +bin/${MODCABAL_STEM}
> +libexec/cabal/
> +@bin libexec/cabal/${MODCABAL_STEM}
> +share/doc/${MODCABAL_STEM}/
> +@comment share/doc/${PKGNAME}/
> +@comment share/doc/${PKGNAME}/LICENSE
> +share/doc/${MODCABAL_STEM}/fptools.css
> +share/doc/${MODCABAL_STEM}/${MODCABAL_STEM}-introduction.html
> +share/doc/${MODCABAL_STEM}/index.html
> +share/doc/${MODCABAL_STEM}/ix01.html
> +share/doc/${MODCABAL_STEM}/sec-AtrributeGrammarsInHappy.html
> +share/doc/${MODCABAL_STEM}/sec-AttrGrammarLimits.html
> +share/doc/${MODCABAL_STEM}/sec-AttributeGrammar.html
> +share/doc/${MODCABAL_STEM}/sec-AttributeGrammarExample.html
> +share/doc/${MODCABAL_STEM}/sec-Precedences.html
> +share/doc/${MODCABAL_STEM}/sec-compilation-time.html
> +share/doc/${MODCABAL_STEM}/sec-conflict-tips.html
> +share/doc/${MODCABAL_STEM}/sec-directives.html
> +share/doc/${MODCABAL_STEM}/sec-error.html
> +share/doc/${MODCABAL_STEM}/sec-finding-errors.html
> +share/doc/${MODCABAL_STEM}/sec-glr-misc.html
> +share/doc/${MODCABAL_STEM}/sec-glr-semantics.html
> +share/doc/${MODCABAL_STEM}/sec-glr-using.html
> +share/doc/${MODCABAL_STEM}/sec-glr.html
> +share/doc/${MODCABAL_STEM}/sec-grammar-files.html
> +share/doc/${MODCABAL_STEM}/sec-grammar.html
> +share/doc/${MODCABAL_STEM}/sec-${MODCABAL_STEM}-ghci.html
> +share/doc/${MODCABAL_STEM}/sec-info-files-conflicts.html
> +share/doc/${MODCABAL_STEM}/sec-info-files.html
> +share/doc/${MODCABAL_STEM}/sec-invoking.html
> +share/doc/${MODCABAL_STEM}/sec-license.html
> +share/doc/${MODCABAL_STEM}/sec-module-header.html
> +share/doc/${MODCABAL_STEM}/sec-module-trailer.html
> +share/doc/${MODCABAL_STEM}/sec-monad-alex.html
> +share/doc/${MODCABAL_STEM}/sec-monads.html
> +share/doc/${MODCABAL_STEM}/sec-multiple-parsers.html
> +share/doc/${MODCABAL_STEM}/sec-obtaining.html
> +share/doc/${MODCABAL_STEM}/sec-reporting-bugs.html
> +share/doc/${MODCABAL_STEM}/sec-sequences.html
> +share/doc/${MODCABAL_STEM}/sec-tips.html
> +share/doc/${MODCABAL_STEM}/sec-type-signatures.html
> +share/doc/${MODCABAL_STEM}/sec-using.html
> +share/${PKGNAME}/
> +share/${PKGNAME}/GLR_Base
> +share/${PKGNAME}/GLR_Lib
> +share/${PKGNAME}/GLR_Lib-ghc
> +share/${PKGNAME}/GLR_Lib-ghc-debug
> +share/${PKGNAME}/HappyTemplate
> +share/${PKGNAME}/HappyTemplate-arrays
> +share/${PKGNAME}/HappyTemplate-arrays-coerce
> +share/${PKGNAME}/HappyTemplate-arrays-coerce-debug
> +share/${PKGNAME}/HappyTemplate-arrays-debug
> +share/${PKGNAME}/HappyTemplate-arrays-ghc
> +share/${PKGNAME}/HappyTemplate-arrays-ghc-debug
> +share/${PKGNAME}/HappyTemplate-coerce
> +share/${PKGNAME}/HappyTemplate-ghc
> --
> 2.30.1
>