On Sat, Dec 30, 2023 at 07:32:18PM +0100, Sebastien Marie wrote: > Hi, > > We need a way to bump all ports built using lang/rust when the port is > updated (compiler change or rust stdlib changes). > > Currently, lang/go is using SYSTEM_VERSION-go variable for that, so I > intent to copy the mecanism for rustc. > > I can't simply use devel/cargo module for that: some (usually complexes) > ports aren't using it but are using rustc and rust stdlib. So I would > like to add a lang/rust module for this purpose, and move the bits > specific to rustc from devel/cargo to this new lang/rust module (mostly > the WANTLIB definition for code using rust stdlib). > > We have 77 ports with lang/rust inside BUILD_DEPENDS. So modifying all > of them is doable but require a bit of preparation. > > I intent to do the following: > > 1. add the lang/rust module and add the arch-defines.mk bits for > SYSTEM_VERSION-rust > > nothing is using it at this stage. no changes. > > > 2. modify all the ports (one by one) using lang/rust as compiler to use > the module lang/rust. > > as soon MODULES += lang/rust is added, the port will be automatically > bumped (due to SYSTEM_VERSION-rust), which is fine (I modified the rust > stdlib on 30.12.2023, and all ports would need a bump anyway). > > I will do the conversion from using MODCARGO_WANTLIB to MODRUST_WANTLIB > in the port at the same time. > > During the step, both "new way" and "old way" will coexist and shouldn't > conflict. A port will be either "new way" or "old way". > > > 3. modify the devel/cargo module to remove unused bits > (MODCARGO_WANTLIB), and add some checks for ensuring using devel/cargo > implies using also lang/rust. > > It is mostly a cleaning step, and to ensure a hard fail if the "old way" > is used (missing changes, and new code added using "old way"). > > > Diffs for 1 and 3 are below. Step 2 could be done on the fly with > MAINTAINER in Cc for the more complex cases. > > Any comments or OK ?
The outlined procedure makes sense to me and I like the approach, but I am a bit worried that it makes it harder for people to write Rust ports using the devel/cargo module, which is already tricky. Porters will now need to be able to grasp the separation of concerns to understand the distinction between the devel/cargo and lang/rust modules. They must now deal with two sets of variables: MODCARGO_* and MODRUST_*. The latter only has two user-visible bits for now, so maybe it's not that bad. A small nit below. At the end is a small diff for port-modules which you can tweak and commit once we decide to go ahead with your plan. > -- > Sebastien Marie > > > Step 1 diffs: > > diff /home/semarie/repos/openbsd/ports/mystuff/lang/rust > commit - 14500989167797cabee408b40583056fe24a9f23 > path + /home/semarie/repos/openbsd/ports/mystuff/lang/rust > blob - /dev/null > file + rust.port.mk (mode 640) > --- /dev/null > +++ rust.port.mk > @@ -0,0 +1,30 @@ > +# increment after rust compiler update to trigger updates of > +# all compiled rust packages (see arch-defines.mk) > +_MODRUST_SYSTEM_VERSION = 1 > + > +CATEGORIES += lang/rust > + > +# WANTLIB for Rust compiled code > +# it should be kept in sync with lang/rust code > +# - c/pthread : all syscalls > +# - c++abi / libgcc.a : unwind > +MODRUST_WANTLIB += c pthread > + > +.if "${MACHINE_ARCH}" != "sparc64" > +MODRUST_WANTLIB += c++abi > +.else > +# libgcc.a is static > +MODRUST_WANTLIB += > +.endif > + > +CHECK_LIB_DEPENDS_ARGS += -S MODRUST_WANTLIB="${MODRUST_WANTLIB}" > +CHECK_LIB_DEPENDS_ARGS += -F c++abi > + > +MODRUST_BUILDDEP ?= Yes > +.if ${MODRUST_BUILDDEP:L} == "yes" > +BUILD_DEPENDS += lang/rust > +.endif > + > +# Location of rustc/rustdoc binaries > +MODRUST_RUSTC_BIN = ${LOCALBASE}/bin/rustc > +MODRUST_RUSTDOC_BIN = ${LOCALBASE}/bin/rustdoc > > > diff /home/semarie/repos/openbsd/ports > commit - a1995e6a715404d542f5d69eadb9a9bac7bbca61 > path + /home/semarie/repos/openbsd/ports > blob - dacb59716e3724cd0aad0110c42d6b2c1f672bfb > file + infrastructure/mk/arch-defines.mk > --- infrastructure/mk/arch-defines.mk > +++ infrastructure/mk/arch-defines.mk > @@ -105,6 +105,12 @@ _SYSTEM_VERSION-clang = 2 > _SYSTEM_VERSION-go = ${_MODGO_SYSTEM_VERSION} > .endif > > +# defined in rust.port.mk; added to version for all rust arches so that > +# rust-compiled packages can be updated easily for a new rust compiler > +.if defined(MODULES) && ${MODULES:Mlang/rust} > +_SYSTEM_VERSION-rust = ${_MODRUST_SYSTEM_VERSION} > +.endif > + > # @version = ${_SYSTEM_VERSION} + ${_SYSTEM_VERSION-${MACHINE_ARCH}} > _PKG_ARGS_VERSION += -V ${_SYSTEM_VERSION} -V > ${_SYSTEM_VERSION-${MACHINE_ARCH}} > .if ${ARCH} != ${MACHINE_ARCH} > > > > Step 3 diff: > diff /home/semarie/repos/openbsd/ports > commit - a1995e6a715404d542f5d69eadb9a9bac7bbca61 > path + /home/semarie/repos/openbsd/ports > blob - 4c5723bf509e5aaaf1541b76acd3b48119bb5b7c > file + devel/cargo/cargo.port.mk > --- devel/cargo/cargo.port.mk > +++ devel/cargo/cargo.port.mk > @@ -1,4 +1,8 @@ > -CATEGORIES += lang/rust > +# we can't just add lang/rust to MODULES > +# it makes _SYSTEM_VERSION-rust (in arch-defines.mk) not properly defined > +.if defined(MODULES) && ! ${MODULES:Mlang/rust} > +ERRORS += "devel/cargo module needs also lang/rust in MODULES" this should be 'also needs' ERRORS += "devel/cargo requires lang/rust to be set in MODULES" > +.endif > > # List of static dependencies. The format is cratename-version. > # MODCARGO_CRATES will be downloaded from SITES_CRATESIO. > @@ -23,22 +27,6 @@ MODCARGO_VENDOR_DIR ?= ${WRKSRC}/modcargo-crates > # Default path for cargo manifest. > MODCARGO_CARGOTOML ?= ${WRKSRC}/Cargo.toml > > -# WANTLIB for Rust compiled code > -# it should be kept in sync with lang/rust code > -# - c/pthread : all syscalls > -# - c++abi / libgcc.a : unwind > -MODCARGO_WANTLIB = c pthread > - > -.if "${MARCHINE_ARCH}" != "sparc64" > -MODCARGO_WANTLIB += c++abi > -.else > -# libgcc.a is static > -MODCARGO_WANTLIB += > -.endif > - > -CHECK_LIB_DEPENDS_ARGS += -S MODCARGO_WANTLIB="${MODCARGO_WANTLIB}" > -CHECK_LIB_DEPENDS_ARGS += -F c++abi > - > # Define SITES_CRATESIO for crates.io > SITES.cargo = https://crates.io/api/v1/crates/ > > @@ -274,16 +262,9 @@ MODCARGO_configure += ; > .endif > > # Build dependencies. > -MODCARGO_BUILD_DEPENDS = lang/rust > - > # devel/cargo-generate-vendor is mandatory for hooks. > BUILD_DEPENDS += devel/cargo-generate-vendor > > -MODCARGO_BUILDDEP ?= Yes > -.if ${MODCARGO_BUILDDEP:L} == "yes" > -BUILD_DEPENDS += ${MODCARGO_BUILD_DEPENDS} > -.endif > - > # Location of cargo binary (default to devel/cargo binary) > MODCARGO_CARGO_BIN ?= ${LOCALBASE}/bin/cargo > > @@ -305,8 +286,8 @@ MODCARGO_ENV += \ > CARGO_BUILD_JOBS=${MAKE_JOBS} \ > CARGO_TARGET_DIR=${MODCARGO_TARGET_DIR} \ > RUST_BACKTRACE=full \ > - RUSTC=${LOCALBASE}/bin/rustc \ > - RUSTDOC=${LOCALBASE}/bin/rustdoc \ > + RUSTC=${MODRUST_RUSTC_BIN} \ > + RUSTDOC=${MODRUST_RUSTDOC_BIN} \ > RUSTFLAGS="${MODCARGO_RUSTFLAGS}" > > # Helper to shorten cargo calls. > Index: port-modules.5 =================================================================== RCS file: /cvs/src/share/man/man5/port-modules.5,v diff -u -p -r1.266 port-modules.5 --- port-modules.5 14 Sep 2023 03:53:26 -0000 1.266 +++ port-modules.5 31 Dec 2023 08:33:48 -0000 @@ -978,6 +978,20 @@ See .It lang/ruby See .Xr ruby-module 5 . +.It lang/rust +Ports using Rust must use this module so a rebuild can be triggered via +.Ev SYSTEM_VERSION-rust +on updates of the lang/rust port or changes to the Rust standard library. +Sets +.Ev MODRUST_WANTLIB +as appropriate for the architecture so it can be added to +.Ev WANTLIB . +It adds lang/rust to the +.Ev BUILD_DEPENDS +unless +.Ev MODRUST_BUILDDEP +is set to anything but +.Dq yes . .It lang/tcl Sets .Ev MODTCL_VERSION ,