Here's a variation of my original proposal after feedback from sthen@.

The key points are:

* Enable erlang26 FLAVOR in erlang.port.mk
* Handle FLAVORS for differen erlang version similarly to how ruby and python
do things
* This actually affects only rebar3.
* Being able to install rebar3 for both versions of erlang in parallel is 
the whole point of this exercise
* ... and we can make the rebar3 Makefile a lot simpler.

Feedback? ok?

On Sat Jul 1, 2023 at 5:02 PM CEST, Volker Schlecht wrote:
> Here's an update to erlang.port.mk that enables the erlang26 FLAVOR for
> erlang ports.
>
> The idea is that if a specific MODERL_VERSION is set on a port, the port
> will only be built for that version of erlang, otherwise the port will
> be built with erlang25 and erlang26 flavors.
>
> MODERL_VERSION is set for
>
>       * lang/lfe
>       * net/rabbitmq
>       * lang/elixir
>       * benchmarks/tsung
>
> Those are unaffected by this change, and will be transitioned at a later
> time.
>
> Unfortunately this change does impact
>
>       * lang/gleam
>
> which needs a minor adaptation to make that work (attached).
>
> With that in place, the devel/rebar3 port can be simplified, because it
> can reuse the MODERL_MODULES mechanism, that was largely taken over from
> that port.
> Also, since erlang/25 and erlang/26 can coexist, so should
> rebar3-erlang25 and rebar3-erlang26, thus @option no-default-conflict.
>
> Unfortunately that's a lot of stuff that needs to happen together, and I
> had to do some things with @pkpaths and pkgstems that I'm not 100%
> certain about, so feedback is highly welcome and probably direly needed
> :-)
>
> Tested on amd64.

Index: erlang.port.mk
===================================================================
RCS file: /cvs/ports/lang/erlang/erlang.port.mk,v
retrieving revision 1.35
diff -u -p -r1.35 erlang.port.mk
--- erlang.port.mk	23 Aug 2023 15:26:33 -0000	1.35
+++ erlang.port.mk	2 Sep 2023 17:44:06 -0000
@@ -5,29 +5,63 @@ CATEGORIES +=		lang/erlang
 USE_GMAKE ?=		Yes
 
 # Default Erlang version to use if MODERL_VERSION is not set.
-# XXX: Keep in sync with devel/rebar3/Makefile
-MODERL_DEFAULT_VERSION =25
+_MODERL_DEFAULT_VERSION =	25
 
-# If the port already has flavors, append ours to it unless the port requires
-# a specific version of Erlang.
-.if !defined(MODERL_VERSION) && !defined(FLAVORS)
-FLAVORS ?=		erlang25
-.else
-FLAVORS +=		erlang25
+# Default Erlang flavor to use if MODERL_VERSION is not set,
+# and MODERL_HANDLE_FLAVORS is set.
+_MODERL_DEFAULT_FLAVOR =	erlang${_MODERL_DEFAULT_VERSION}
+
+# Whether the erlang module should automatically add FLAVORs.
+MODERL_HANDLE_FLAVORS ?=	No
+
+# This permits adding FLAVORS automatically, unless FLAVORS are
+# already defined or the port defines MODERL_VERSION to tie the port
+# to a specific erlang version.
+.if !defined(MODERL_VERSION)
+.  if ${MODERL_HANDLE_FLAVORS:L:Myes}
+
+# If erlang.port.mk should handle FLAVORS, define a separate FLAVOR
+# for each erlang runtime
+.    if !defined(FLAVORS)
+FLAVORS =	erlang25 erlang26
+.    endif
+
+FULLPKGNAME ?=	${MODERL_PKG_PREFIX}-${PKGNAME}
+
+FLAVOR ?=
+.    if empty(FLAVOR)
+FLAVOR =	${MODERL_DEFAULT_FLAVOR}
+.    endif
+.  endif
 .endif
 
-FLAVOR?=		# empty
-
-# When no flavor is explicitly set, assume MODERL_DEFAULT_VERSION
-MODERL_VERSION ?=	${MODERL_DEFAULT_VERSION}
-_MODERL_FLAVOR ?=	# empty
+MODERL_PKG_PREFIX =	erl${MODERL_VERSION}
 
-.if ${MODERL_VERSION} == 25
+.if defined(MODERL_VERSION)
+.  if ${MODERL_VERSION} == 25
 _MODERL_FLAVOR =	erlang25
-.else
+.  elif ${MODERL_VERSION} == 26
+_MODERL_FLAVOR =	erlang26
+.  else
 ERRORS +=		"Invalid MODERL_VERSION set: ${MODERL_VERSION}."
+.  endif
+.else
+# When only flavour is set, derive version
+.  if !empty(FLAVOR)
+.    if ${FLAVOR} == erlang25
+MODERL_VERSION ?=	25
+_MODERL_FLAVOR ?=	erlang25
+.    elif ${FLAVOR} == erlang26
+MODERL_VERSION ?=	26
+_MODERL_FLAVOR ?=	erlang26
+.    endif
+.  endif
 .endif
 
+# Fall back to default
+MODERL_VERSION ?=	${_MODERL_DEFAULT_VERSION}
+_MODERL_FLAVOR ?=	${_MODERL_DEFAULT_FLAVOR}
+
 # If no configure style is set, then assume "rebar3"
 .if ${CONFIGURE_STYLE} == ""
 CONFIGURE_STYLE =	rebar3
@@ -54,6 +88,7 @@ _MODERL_RDEPS +=	${r},${_MODERL_FLAVOR}
 _MODERL_TDEPS +=	${t},${_MODERL_FLAVOR}
 .endfor
 
+
 MODERL_BUILDDEP ?=	Yes
 MODERL_RUNDEP ?=	Yes
 
@@ -94,6 +129,7 @@ MODERL_ERLC =		${LOCALBASE}/bin/erlc${MO
 _MODERL_LINKS +=	erl${MODERL_VERSION} erl \
 			erlc${MODERL_VERSION} erlc \
 			erl_call${MODERL_VERSION} erl_call \
+			epmd${MODERL_VERSION} epmd \
 			escript${MODERL_VERSION} escript
 
 .if !empty(_MODERL_LINKS)
@@ -128,7 +164,7 @@ pre-build:
 # https://hex.pm.
 MASTER_SITE_HEX =	https://repo.hex.pm/tarballs/
 
-MASTER_SITES.erl	?= ${MASTER_SITE_HEX}
+MASTER_SITES.erl ?= 	${MASTER_SITE_HEX}
 MODERL_DIST_SUBDIR ?=	hex_modules
 
 .  for _m _v in ${MODERL_MODULES}
Index: Makefile
===================================================================
RCS file: /cvs/ports/devel/rebar3/Makefile,v
retrieving revision 1.12
diff -u -p -r1.12 Makefile
--- Makefile	2 Sep 2023 10:09:32 -0000	1.12
+++ Makefile	2 Sep 2023 17:42:37 -0000
@@ -10,35 +10,18 @@ MAINTAINER =		Volker Schlecht <openbsd-p
 # APLv2
 PERMIT_PACKAGE =	Yes
 
-FLAVORS =		erlang25 erlang26
-FLAVOR ?=		erlang25
-
-MASTER_SITES1 = 	https://repo.hex.pm/tarballs/
-
-.if ${FLAVOR:Merlang25} || ${FLAVOR:Merlang26}
-_EV =                   ${FLAVOR:C/.*([0-9][0-9]+\$)/\1/}
-RUN_DEPENDS =           lang/erlang/${_EV}
-ERL_VERSION =           ${_EV}
-.else
-ERRORS +=               "Invalid FLAVOR set: ${FLAVOR}"
-.endif
-
-EXTRACT_ONLY =		rebar3-${GH_TAGNAME}.tar.gz
+MODULES =		lang/erlang
 
 # for tests
-HEX_MODULES += \
-	meck			0.8.13
+MODERL_MODULES += \
+			meck	0.8.13
+MODERL_HANDLE_FLAVORS=	Yes
+CONFIGURE_STYLE =	None
 
 DISTFILES =		rebar3-{}${GH_TAGNAME}.tar.gz
-.for _m _v in ${HEX_MODULES}
-DISTFILES += ${_m}-${_v}.tar:1
-.endfor
 
 BUILD_DEPENDS += 	${RUN_DEPENDS}
 
-SUBST_VARS = 		ERL_VERSION
-
-
 pre-configure:
 	${SUBST_CMD} ${WRKSRC}/bootstrap \
 		${WRKSRC}/apps/rebar/src/rebar_prv_escriptize.erl \
@@ -49,18 +32,10 @@ do-build:
 	cd ${WRKBUILD} && ${SETENV} ${MAKE_ENV} ${WRKSRC}/bootstrap
 
 do-install:
-	${INSTALL_SCRIPT} ${WRKSRC}/rebar3 ${PREFIX}/bin/rebar3-${ERL_VERSION}
+	${INSTALL_SCRIPT} ${WRKSRC}/rebar3 ${PREFIX}/bin/rebar3-${MODERL_VERSION}
 
 PORTHOME=	${WRKDIR}
 do-test:
-.for _m _v in ${HEX_MODULES}
-	mkdir -p ${WRKDIR}/${_m}
-	tar xf ${FULLDISTDIR}/${_m}-${_v}.tar -C ${WRKDIR}/${_m}
-
-	mkdir -p ${WRKSRC}/_checkouts/${_m}
-	tar xzf ${WRKDIR}/${_m}/contents.tar.gz -C ${WRKSRC}/_checkouts/${_m}
-	cp -r ${WRKSRC}/_checkouts/${_m} ${WRKSRC}/_build/default/lib/
-.endfor
 	cd ${WRKSRC} && \
 	    ${SETENV} ${ALL_TEST_ENV} ./rebar3 escriptize && \
 	    ${SETENV} ${ALL_TEST_ENV} ./rebar3 ct
Index: distinfo
===================================================================
RCS file: /cvs/ports/devel/rebar3/distinfo,v
retrieving revision 1.6
diff -u -p -r1.6 distinfo
--- distinfo	2 Sep 2023 10:09:32 -0000	1.6
+++ distinfo	2 Sep 2023 17:42:37 -0000
@@ -1,4 +1,4 @@
-SHA256 (meck-0.8.13.tar) = 008BPBVttRrVfMVWiRuXIOahwd9f4uFa+ZnITWzr6xo=
+SHA256 (hex_modules/meck-0.8.13.tar) = 008BPBVttRrVfMVWiRuXIOahwd9f4uFa+ZnITWzr6xo=
 SHA256 (rebar3-3.22.1.tar.gz) = KFW1eEMAhl0uQ8t6E1yyu6FEzxUhTGGQZbkYr8jMbrk=
-SIZE (meck-0.8.13.tar) = 34304
+SIZE (hex_modules/meck-0.8.13.tar) = 34304
 SIZE (rebar3-3.22.1.tar.gz) = 797521
Index: patches/patch-apps_rebar_src_rebar_prv_escriptize_erl
===================================================================
RCS file: /cvs/ports/devel/rebar3/patches/patch-apps_rebar_src_rebar_prv_escriptize_erl,v
retrieving revision 1.1
diff -u -p -r1.1 patch-apps_rebar_src_rebar_prv_escriptize_erl
--- patches/patch-apps_rebar_src_rebar_prv_escriptize_erl	15 Mar 2023 13:15:13 -0000	1.1
+++ patches/patch-apps_rebar_src_rebar_prv_escriptize_erl	2 Sep 2023 17:42:37 -0000
@@ -8,7 +8,7 @@ Index: apps/rebar/src/rebar_prv_escripti
      EscriptSections =
          [ {shebang,
 -           def("#!", State, escript_shebang, "#!/usr/bin/env escript\n")}
-+           def("#!", State, escript_shebang, "#!/usr/bin/env escript${ERL_VERSION}\n")}
++           def("#!", State, escript_shebang, "#!/usr/bin/env escript${MODERL_VERSION}\n")}
          , {comment, def("%%", State, escript_comment, "%%\n")}
          , {emu_args, def("%%!", State, escript_emu_args, DefaultEmuArgs)}
          , {archive, Files, []} ],
Index: patches/patch-bootstrap
===================================================================
RCS file: /cvs/ports/devel/rebar3/patches/patch-bootstrap,v
retrieving revision 1.2
diff -u -p -r1.2 patch-bootstrap
--- patches/patch-bootstrap	11 Mar 2022 18:53:09 -0000	1.2
+++ patches/patch-bootstrap	2 Sep 2023 17:42:37 -0000
@@ -5,7 +5,7 @@ Index: bootstrap
 +++ bootstrap
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env escript
-+#!/usr/bin/env escript${ERL_VERSION}
++#!/usr/bin/env escript${MODERL_VERSION}
  %% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
  %% ex: ft=erlang ts=4 sw=4 et
  
Index: patches/patch-vendor_relx_priv_templates_bin
===================================================================
RCS file: /cvs/ports/devel/rebar3/patches/patch-vendor_relx_priv_templates_bin,v
retrieving revision 1.1
diff -u -p -r1.1 patch-vendor_relx_priv_templates_bin
--- patches/patch-vendor_relx_priv_templates_bin	15 Mar 2023 13:15:13 -0000	1.1
+++ patches/patch-vendor_relx_priv_templates_bin	2 Sep 2023 17:42:37 -0000
@@ -8,7 +8,7 @@ Index: vendor/relx/priv/templates/bin
          ERTS_DIR="$__erts_dir";
      else
 -        __erl="$(command -v erl)"
-+        __erl="$(command -v erl${ERL_VERSION})"
++        __erl="$(command -v erl${MODERL_VERSION})"
          code="io:format(\"~s\", [code:root_dir()]), halt()."
          __erl_root="$("$__erl" -boot no_dot_erlang -noshell -eval "$code")"
          ERTS_DIR="$__erl_root/erts-$ERTS_VSN"
Index: patches/patch-vendor_relx_priv_templates_extended_bin
===================================================================
RCS file: /cvs/ports/devel/rebar3/patches/patch-vendor_relx_priv_templates_extended_bin,v
retrieving revision 1.1
diff -u -p -r1.1 patch-vendor_relx_priv_templates_extended_bin
--- patches/patch-vendor_relx_priv_templates_extended_bin	15 Mar 2023 13:15:13 -0000	1.1
+++ patches/patch-vendor_relx_priv_templates_extended_bin	2 Sep 2023 17:42:37 -0000
@@ -8,7 +8,7 @@ Index: vendor/relx/priv/templates/extend
          ERTS_DIR="$__erts_dir";
      else
 -        __erl="$(command -v erl)"
-+        __erl="$(command -v erl${ERL_VERSION})"
++        __erl="$(command -v erl${MODERL_VERSION})"
          code="io:format(\"~s\", [code:root_dir()]), halt()."
          __erl_root="$("$__erl" -boot no_dot_erlang -sasl errlog_type error -noshell -eval "$code")"
          ERTS_DIR="$__erl_root/erts-$ERTS_VSN"
Index: pkg/PLIST
===================================================================
RCS file: /cvs/ports/devel/rebar3/pkg/PLIST,v
retrieving revision 1.3
diff -u -p -r1.3 PLIST
--- pkg/PLIST	16 Jan 2023 18:21:24 -0000	1.3
+++ pkg/PLIST	2 Sep 2023 17:42:37 -0000
@@ -1,2 +1,3 @@
 @pkgpath devel/rebar
-bin/rebar3-${ERL_VERSION}
+@conflict rebar3-*-erlang${MODERL_VERSION}
+bin/rebar3-${MODERL_VERSION}
Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/lfe/Makefile,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile
--- Makefile	25 Aug 2023 17:42:45 -0000	1.2
+++ Makefile	2 Sep 2023 17:41:12 -0000
@@ -3,6 +3,7 @@ COMMENT =		Lisp Flavoured Erlang (LFE)
 GH_ACCOUNT =		lfe
 GH_PROJECT =		lfe
 GH_TAGNAME =		2.1.2
+REVISION = 		0
 
 CATEGORIES =		lang
 

Reply via email to