Greg Steuck <gne...@openbsd.org> writes:
>> I took this a bit further and I get a working devel/happy package now.
>>
>> This is still a complete WIP but I wanted to get some early feedback on
>> the implementation choices as this is my first foray into port-modules.
>
> Converting devel/alex is straightforward which further validates the
> approach (though still doesn't touch any of the existing limitations).

devel/cpphs wasn't too bad either. Here's all I needed to get it
converted. This is the first case of built-in dependencies.

I'm pushing the patches too for ease of reuse:
https://github.com/blackgnezdo/ports/commits/ghc810

>From 17e23bafe588554a3c5836403815a6bf62ff9692 Mon Sep 17 00:00:00 2001
From: Greg Steuck <g...@nest.cx>
Date: Sun, 23 Aug 2020 11:37:32 -0700
Subject: [PATCH] Use devel/cabal module for devel/cpphs

This is the first case of building dependencies within the port.
MODCABAL_MANIFEST was created manually by running the cabal comands.
This should eventually be automated via portgen or similar.

Removed do-test, it was pre-broken in the previous update as upstream
stopped shipping the tests.

TODO: since -lib port is getting removed, a quirk is probably
required.
---
 devel/cabal/cabal.port.mk             | 55 ++++++++++++++++++++-----
 devel/cpphs/Makefile                  | 39 ++++--------------
 devel/cpphs/distinfo                  |  8 +++-
 devel/cpphs/pkg/{DESCR-main => DESCR} |  0
 devel/cpphs/pkg/DESCR-lib             |  1 -
 devel/cpphs/pkg/PLIST                 |  5 +++
 devel/cpphs/pkg/PLIST-lib             | 59 ---------------------------
 devel/cpphs/pkg/PLIST-main            |  4 --
 8 files changed, 64 insertions(+), 107 deletions(-)
 rename devel/cpphs/pkg/{DESCR-main => DESCR} (100%)
 delete mode 100644 devel/cpphs/pkg/DESCR-lib
 create mode 100644 devel/cpphs/pkg/PLIST
 delete mode 100644 devel/cpphs/pkg/PLIST-lib
 delete mode 100644 devel/cpphs/pkg/PLIST-main

diff --git devel/cabal/cabal.port.mk devel/cabal/cabal.port.mk
index 292e3773f94..250e0bb3d18 100644
--- devel/cabal/cabal.port.mk
+++ devel/cabal/cabal.port.mk
@@ -8,18 +8,27 @@ ONLY_FOR_ARCHS =	i386 amd64
 BUILD_DEPENDS+=	devel/cabal \
 		lang/ghc
 
+MASTER_SITES0 = https://hackage.haskell.org/package/
+
 .if ${MODCABAL_BUILD:L:Mhackage}
-MODGHC_HACKAGE_NAME =		${DISTNAME:C,-[0-9.]*$,,}
-MODGHC_HACKAGE_VERSION =	${DISTNAME:C,.*-([0-9.]*)$,\1,}
-HOMEPAGE ?=			https://hackage.haskell.org/package/${MODGHC_HACKAGE_NAME}
-MASTER_SITES =			https://hackage.haskell.org/package/${DISTNAME}/
-SUBST_VARS +=			DISTNAME MODGHC_HACKAGE_VERSION
+MODCABAL_HACKAGE_NAME =		${DISTNAME:C,-[0-9.]*$,,}
+MODCABAL_HACKAGE_VERSION =	${DISTNAME:C,.*-([0-9.]*)$,\1,}
+HOMEPAGE ?=			${MASTER_SITES0}${MODCABAL_HACKAGE_NAME}
+MASTER_SITES =			${MASTER_SITES0}${DISTNAME}/
+DISTFILES ?=			${DISTNAME}.tar.gz
+SUBST_VARS +=			DISTNAME MODCABAL_HACKAGE_VERSION
+
+# TODO(gnezdo): minimize identical file storage by skipping revision 0
+# corresponding to the original .cabal inside .tar.gz.
+.if defined(MODCABAL_REVISION)
+DISTFILES +=	${DISTNAME}_${MODCABAL_REVISION}{revision/${MODCABAL_REVISION}}.cabal
+.endif
 .endif
 
 MASTER_SITES0 = https://hackage.haskell.org/package/
 DIST_SUBDIR ?= hackage
 
-_MODCABAL_HOME=${WRKSRC}
+_MODCABAL_HOME=${WRKDIR}
 
 MODCABAL_post-extract = \
 	mkdir -p ${_MODCABAL_HOME}/.cabal \
@@ -32,23 +41,38 @@ DISTFILES += {${package}-${version}/}${package}-${version}.tar.gz:0
 DISTFILES += ${package}-${version}_${revision}{${package}-${version}/revision/${revision}}.cabal:0
 .endfor
 
-
+.if defined(MODCABAL_REVISION)
 MODCABAL_post-extract += \
+	&& cp ${FULLDISTDIR}/${DISTNAME}_${MODCABAL_REVISION}.cabal ${WRKSRC}/${MODCABAL_HACKAGE_NAME}.cabal
+.endif
+
+# The .cabal files are explicitly copied over the ones extracted from
+# archives by the normal extraction rules.
+EXTRACT_CASES += *.cabal) ;;
+
 .for package version revision in ${MODCABAL_MANIFEST}
-	&& tar zxf ${FULLDISTDIR}/${package}-${version}.tar.gz -C ${WRKBUILD} \
-	&& ln -s ${FULLDISTDIR}/${package}-${version}_${revision}.cabal ${WRKBUILD}/_build/tarballs/${package}.cabal \
+MODCABAL_post-extract += \
+	&& cp ${FULLDISTDIR}/${package}-${version}_${revision}.cabal ${WRKDIR}/${package}-${version}/${package}.cabal
 .endfor
 .endif
 
+# References all the locally available dependencies.  Ideally these
+# should be command line options, tracking issue:
+# https://github.com/haskell/cabal/issues/3585
+.for package version revision in ${MODCABAL_MANIFEST}
+MODCABAL_post-extract += \
+	&& echo "packages: ${WRKDIR}/${package}-${version}/${package}.cabal" >> ${WRKSRC}/cabal.project.local
+.endfor
+
+
 MODCABAL_CABAL	=  ${SETENV} ${MAKE_ENV} HOME=${_MODCABAL_HOME} ${LOCALBASE}/bin/cabal
 
-MODCABAL_BUILD_ARGS = --datadir=${PREFIX}/share/${PKGNAME}
 _MODCABAL_BUILD_TARGETS ?=	${MODCABAL_EXECUTABLES:C/^/exe:&/}
 
 MODCABAL_BUILD_TARGET =	\
 	cd ${WRKBUILD} \
 	&& ${MODCABAL_CABAL} v2-build --offline --disable-benchmarks --disable-tests \
-		--flags "${MODCABAL_FLAGS}" ${MODCABAL_BUILD_ARGS} ${MODCABAL_BUILD_TARGETS}
+		--flags "${MODCABAL_FLAGS}" ${_MODCABAL_BUILD_TARGETS}
 
 _MODCABAL_LIBEXEC = libexec/cabal
 MODCABAL_INSTALL_TARGET = \
@@ -65,6 +89,7 @@ MODCABAL_INSTALL_TARGET += \
 # Exports the paths to executables for testing.
 MODCABAL_BUILT_EXECUTABLE_${exe} = $$(find ${WRKSRC}/dist-newstyle -name ${exe} -type f -perm -a+x)
 
+.if defined(MODCABAL_DATA_DIRS)
 .for data in ${MODCABAL_DATA_DIRS}
 _MODCABAL_EXPORTS += \
 	&& echo 'export ${exe}_datadir=${LOCALBASE}/share/${DISTNAME}' >> ${PREFIX}/bin/${exe}
@@ -78,6 +103,14 @@ MODCABAL_INSTALL_TARGET += \
 	${_MODCABAL_EXPORTS} \
 	&& echo 'exec ${LOCALBASE}/${_MODCABAL_LIBEXEC}/${exe} "$$@"' >> ${PREFIX}/bin/${exe} \
 	&& chmod +x ${STAGEDIR}${PREFIX}/bin/${exe}
+.else
+# Skips the launcher script indirection when MODCABAL_DATA_DIRS is empty.
+# TODO(gnezdo): evaluate if this case is common enough to be warranted.
+MODCABAL_INSTALL_TARGET += \
+	&& ${INSTALL_PROGRAM} ${MODCABAL_BUILT_EXECUTABLE_${exe}} ${PREFIX}/bin
+.endif
+
+
 .endfor
 
 
diff --git devel/cpphs/Makefile devel/cpphs/Makefile
index fdef2f9052a..493da7d2671 100644
--- devel/cpphs/Makefile
+++ devel/cpphs/Makefile
@@ -1,47 +1,26 @@
 # $OpenBSD: Makefile,v 1.48 2019/09/30 12:51:25 kili Exp $
 
-COMMENT-main =	liberalised reimplementation of cpp in Haskell
-COMMENT-lib =	cpphs library
-
-DISTNAME =	cpphs-1.19.3
-PKGNAME-main =	${DISTNAME}
-REVISION-main =	0
-PKGNAME-lib =	hs-${DISTNAME}
-REVISION-lib =	7
+COMMENT =	liberalised reimplementation of cpp in Haskell
+
+DISTNAME =	cpphs-1.20.9.1
 CATEGORIES =	devel
 MAINTAINER =	Matthias Kilian <k...@openbsd.org>
 
 # LGPL2.1
 PERMIT_PACKAGE =	Yes
 
-MULTI_PACKAGES =	-main -lib
-
-SUBST_VARS +=		DISTNAME
+MODULES =		devel/cabal
+MODCABAL_EXECUTABLES =	cpphs
+MODCABAL_BUILD =	hackage
+MODCABAL_MANIFEST =	polyparse 1.13 1
 
-MODULES =		lang/ghc
-LIB_DEPENDS +=		converters/libiconv
+WANTLIB =		c charset ffi gmp m iconv pthread util
 
-WANTLIB-main =		c charset ffi gmp m iconv pthread util
-
-MODGHC_BUILD =		hackage cabal haddock register
-MODGHC_PACKAGE_KEY =	3CUnFHz9uegIX6e6hlBlNd
-LIB_DEPENDS-main =	${LIB_DEPENDS} \
+LIB_DEPENDS =		converters/libiconv \
 			devel/gmp \
 			devel/libffi
-RUN_DEPENDS-main =
-LIB_DEPENDS-lib =
-RUN_DEPENDS-lib =	devel/hs-old-locale \
-			devel/hs-old-time \
-			lang/ghc=${MODGHC_VER} \
-			textproc/hs-polyparse>=1.9
-BUILD_DEPENDS +=	${RUN_DEPENDS-lib}
-WANTLIB-lib =
-DIST_SUBDIR =
 
 post-install:
 	${INSTALL_MAN}     ${WRKSRC}/docs/cpphs.1 ${PREFIX}/man/man1
 
-do-test:
-	cd ${WRKSRC}/tests && /bin/sh ./runtests
-
 .include <bsd.port.mk>
diff --git devel/cpphs/distinfo devel/cpphs/distinfo
index a69a8dd8800..4c9aab52ea9 100644
--- devel/cpphs/distinfo
+++ devel/cpphs/distinfo
@@ -1,2 +1,6 @@
-SHA256 (cpphs-1.19.3.tar.gz) = 4lRqo4LpwilCxcKEljHtxrHYy+osUHYvZrdAdV+vV9o=
-SIZE (cpphs-1.19.3.tar.gz) = 44306
+SHA256 (hackage/cpphs-1.20.9.1.tar.gz) = f1mxC8M3QATO48BPpO5KG5DQ3KhKPQ5DbVhhoao7kZ8=
+SHA256 (hackage/polyparse-1.13.tar.gz) = HExymA4eWk8H/qZcoIsjmVgdKmqiHrEHj3rShsJ5cHs=
+SHA256 (hackage/polyparse-1.13_1.cabal) = aLk8AwrruIqr71sNyhlaHTW1DPL59U2HlZMOf42wTCY=
+SIZE (hackage/cpphs-1.20.9.1.tar.gz) = 45496
+SIZE (hackage/polyparse-1.13.tar.gz) = 33144
+SIZE (hackage/polyparse-1.13_1.cabal) = 2726
diff --git devel/cpphs/pkg/DESCR-main devel/cpphs/pkg/DESCR
similarity index 100%
rename from devel/cpphs/pkg/DESCR-main
rename to devel/cpphs/pkg/DESCR
diff --git devel/cpphs/pkg/DESCR-lib devel/cpphs/pkg/DESCR-lib
deleted file mode 100644
index c7a2a6defcd..00000000000
--- devel/cpphs/pkg/DESCR-lib
+++ /dev/null
@@ -1 +0,0 @@
-This library provides the functioninality of cpphs to other programs.
diff --git devel/cpphs/pkg/PLIST devel/cpphs/pkg/PLIST
new file mode 100644
index 00000000000..e6f9789edb6
--- /dev/null
+++ devel/cpphs/pkg/PLIST
@@ -0,0 +1,5 @@
+@comment $OpenBSD: PLIST,v$
+@pkgpath devel/cpphs
+@bin bin/cpphs
+libexec/cabal/
+@man man/man1/cpphs.1
diff --git devel/cpphs/pkg/PLIST-lib devel/cpphs/pkg/PLIST-lib
deleted file mode 100644
index bf816c6c64d..00000000000
--- devel/cpphs/pkg/PLIST-lib
+++ /dev/null
@@ -1,59 +0,0 @@
-@comment $OpenBSD: PLIST-lib,v 1.11 2019/09/30 12:51:25 kili Exp $
-@tag ghc-pkg-recache
-lib/ghc/${DISTNAME}/
-lib/ghc/${DISTNAME}/Language/
-lib/ghc/${DISTNAME}/Language/Preprocessor/
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/CppIfdef.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/CppIfdef.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/CppIfdef.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/HashDefine.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/HashDefine.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/HashDefine.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/MacroPass.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/MacroPass.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/MacroPass.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Options.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Options.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Options.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Position.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Position.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Position.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/ReadFirst.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/ReadFirst.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/ReadFirst.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/RunCpphs.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/RunCpphs.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/RunCpphs.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/SymTab.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/SymTab.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/SymTab.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Tokenise.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Tokenise.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Cpphs/Tokenise.p_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Unlit.dyn_hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Unlit.hi
-lib/ghc/${DISTNAME}/Language/Preprocessor/Unlit.p_hi
-lib/ghc/cpphs-${MODGHC_HACKAGE_VERSION}/libHScpphs-${MODGHC_HACKAGE_VERSION}-${MODGHC_PACKAGE_KEY}-ghc${MODGHC_VER}.so
-lib/ghc/${DISTNAME}/libHS${DISTNAME}-${MODGHC_PACKAGE_KEY}.a
-lib/ghc/${DISTNAME}/libHS${DISTNAME}-${MODGHC_PACKAGE_KEY}_p.a
-lib/ghc/package.conf.d/${DISTNAME}.conf
-share/doc/hs-${DISTNAME}/
-share/doc/hs-${DISTNAME}/LICENCE-LGPL
-share/doc/hs-${DISTNAME}/html/
-share/doc/hs-${DISTNAME}/html/Language-Preprocessor-Cpphs.html
-share/doc/hs-${DISTNAME}/html/Language-Preprocessor-Unlit.html
-share/doc/hs-${DISTNAME}/html/cpphs.haddock
-share/doc/hs-${DISTNAME}/html/doc-index.html
-share/doc/hs-${DISTNAME}/html/haddock-bundle.min.js
-share/doc/hs-${DISTNAME}/html/hslogo-16.png
-share/doc/hs-${DISTNAME}/html/index.html
-share/doc/hs-${DISTNAME}/html/meta.json
-share/doc/hs-${DISTNAME}/html/minus.gif
-share/doc/hs-${DISTNAME}/html/ocean.css
-share/doc/hs-${DISTNAME}/html/plus.gif
-share/doc/hs-${DISTNAME}/html/quick-jump.css
-share/doc/hs-${DISTNAME}/html/synopsis.png
diff --git devel/cpphs/pkg/PLIST-main devel/cpphs/pkg/PLIST-main
deleted file mode 100644
index 4d8937ea234..00000000000
--- devel/cpphs/pkg/PLIST-main
+++ /dev/null
@@ -1,4 +0,0 @@
-@comment $OpenBSD: PLIST-main,v 1.1 2010/09/26 13:32:44 kili Exp $
-@pkgpath devel/cpphs
-@bin bin/cpphs
-@man man/man1/cpphs.1
-- 
2.28.0

Reply via email to