cabal.port.mk + devel/happy using it

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

cabal.port.mk + devel/happy using it

Greg Steuck-5
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 <[hidden email]>
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 <[hidden email]>
---
 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 <[hidden email]>
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

Reply | Threaded
Open this post in threaded view
|

Re: cabal.port.mk + devel/happy using it

Greg Steuck-5
Since I got some verification and encouragement from abieber@ and Evan
Silberman, here's a full set of all the existing Haskell binary ports on
top of our in-tree ghc version:
https://github.com/blackgnezdo/ports/tree/cabal-ghc-8.6.4

I'm happy to send them in whatever way people like, though ideally I'd
want to submit devel/happy and the framework before proceeding with
more.

Thanks
Greg

Reply | Threaded
Open this post in threaded view
|

Re: cabal.port.mk + devel/happy using it

Matthias Kilian
In reply to this post by Greg Steuck-5
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 <[hidden email]>
> 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 <[hidden email]>
> ---
>  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 <[hidden email]>
> 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
>

Reply | Threaded
Open this post in threaded view
|

Re: cabal.port.mk + devel/happy using it

Stuart Henderson
On 2021/02/25 14:13, Matthias Kilian wrote:

> 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?

We have the same for devel/cargo, lang/go, lang/python and others.
For gcc the main module is in lang/gcc/8 but there's a helper in
infrastructure/mk because it (sometimes) needs to select between
different gcc versions.

I'm fairly happy having it in the main ports tree, but if it is
placed elsewhere then the others should probably move there too.

Reply | Threaded
Open this post in threaded view
|

Re: cabal.port.mk + devel/happy using it

Greg Steuck-5
Stuart Henderson <[hidden email]> writes:

> On 2021/02/25 14:13, Matthias Kilian wrote:
>> 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?
>
> We have the same for devel/cargo, lang/go, lang/python and others.
> For gcc the main module is in lang/gcc/8 but there's a helper in
> infrastructure/mk because it (sometimes) needs to select between
> different gcc versions.
>
> I'm fairly happy having it in the main ports tree, but if it is
> placed elsewhere then the others should probably move there too.

FWIW, I chose this placement after lang/ghc/ghc.port.mk. We could
bikeshed devel/cabal{-install}/cabal{-install}.port.mk aspect of it :)

Thanks
Gretg