Hi Matthias, 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. Thanks Greg
>From 79f9ac90d524e4df33191fd73e09487cb7711a96 Mon Sep 17 00:00:00 2001 From: Greg Steuck <g...@nest.cx> 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 <falsif...@falsifian.org> --- 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 <g...@nest.cx> 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