diff --git a/contrib/libucl/lua/lua_ucl.c b/contrib/libucl/lua/lua_ucl.c --- a/contrib/libucl/lua/lua_ucl.c +++ b/contrib/libucl/lua/lua_ucl.c @@ -30,6 +30,8 @@ #include "lua_ucl.h" #include +#include "bootstrap.h" + /*** * @module ucl * This lua module allows to parse objects from strings and to store data into @@ -1528,3 +1530,5 @@ return (struct ucl_lua_funcdata*)obj->value.ud; } + +FLUA_MODULE(ucl); diff --git a/contrib/lyaml/ext/yaml/yaml.c b/contrib/lyaml/ext/yaml/yaml.c index 54478610134fec5853580fd232b711074cf2a37f..6a5ddc605e0fd3640955adda8a2d867915524504 GIT binary patch literal 2021 zc${rjTW_mI5PmklV&pv3PC3p+eL2bLQHhOXR16m2q*hg-HLT567|`x=EGx?2?sI1V z$BtXc7wzmf-#0ggn`;BE;lOtJC^5km>y(JKSVb!N z9ww~7d!3nZe|!5CF$5cz)j^7FreQE1;>F!BU+!=3@8Oxr1H6pjh1J`P75@jl{d&pV zaW1&r38h3?fKZTe$uWqnWQFFb2^+~dlp9DgCb!%KT>>i(P;sfypUH;%rT5aQtQe)I@DAbYa)amX@ zWh~EO&AalUxM+rltjEkGg`qUggJ3ySI60(ynepft$IOP%pGL1%V1pCFBJf|Fi9Lb7 z72>&X!mAU_{AC1)2rMsJfj@Fvc_Y6iH44&fJNRH}V_Jj?J+{;+xySc!o#o$#I=%WfIrai9BMS`T{`y;go!n`p6$lVN1`T4LbhST>&zxAsap6MM~?4NK4agD0z8_SZV-KV zzdE69f)zL+Rc0Fa^CnZOE;{)Q54w7GOGK6b+#rO|c^TRtoG`I17wNED-ep6NOfIQ|RX3pUjh@P4JIcO)vZc9LlkLoy*X%#We%|cjtbcA>m!(ElR<-t&Z$!ai zzVfWO-Rt$qqkm?8!3JYBdo2L^xM4>}ux50pCLK=U?!v@pg(A2RB%e2fSU7nn1tr zMz6zQuXgknlD(mMW~`W0X!~qb2`h>gc~uvv)d?BBH*e{>CeZJ@@&0HSSP<8Fimio% zgP{$Kw5)g$Q(0kvr#Qq!I9$6!3>yGiy%=9B`08?pk7VoQ&WvPjl9qgno0`i3inhHn zAvgizs#aMp5WsSReDtp+CWPX8BY2+D^_P2O`GMOS$GhLLNUm`=!`-9tZWvSQ@7$j( KU3)-ki1`J4YHVbiq^PQ_#a{4MW{q~&7ojMByU(35 zCM2{HAKJ4s=ggPKH`f+i!+~wfL1u$5R!e8*!%E0p$PKJ31%A!QhRjCQ?x4h`Fwh(I@#5~6FT>m65T2Mi!1Dl}S-mNk{6Ev%ub0d% z=bWpp&{|Xygoc7EjzMe`lZNLutQF@_tsyIz+Hf081xy}b$CXBhYGs&^lna9l1&I%h zO@U0hTAMvn9PM*pT34B1NC|nB)mttNGbFhdCD+h11&40jdUX4ZPR?0LghB#cpKf6< zOi|Sa6xT+HjA(2$%F4Q_>gl=^ThWS;ds7Qdd`MkuOoalrVO!;5P5->fZ&$BMp|R?@ zAof*l5Yz-_T#^@NbAx@;yljF)5`hUcNuOhE%t&ZQ#WiiYG$H$<+J4SQG*PWT1jIZEBXD5uM2Ry=9KDrp6 z^XR)rHOy}0JKoHOu`_d?+{P`bP5|DbPe1i5mo+kgV2P|i`aeVgt6=RNQd1DE*pAk^8C{f ze0py?1|qT7dY>)g{O4rpIz~fczf=0XOgsr~B|*wqtTo zsm=GJ-i>8lwF3&@=&6*OLGk?)mX~5h*axtz*?+)p+3ez?i&)OrLUNcb183%TI$gTy zet@5`kyy3P(Ez%*P*#feEUoP>_zNd(P4IMs-}ZE-_9@vkjgu(7>!rHi>0PB7eulgL zg~{2XbLnGQnwD5bkG#gERx>}1_y(ds|AJqw*K@o$pwW^%;Pryk2Ks%oI;{=%WJ_-w z)#=+Gz#UT>vCp8+n3PA$t6HK~D`a(EgN5(gK)-L++k<6cL45Bqb>Agq=90210Ht@s8vGFLqmJ@(3m=xmVgYF(59 q4OmGg@BKRxlZEDHEqIyJ^_L;C{J^b@W87_76gRko;qJkDv;GCB!dqAX diff --git a/libexec/flua/Makefile b/libexec/flua/Makefile --- a/libexec/flua/Makefile +++ b/libexec/flua/Makefile @@ -1,10 +1,29 @@ .include -SUBDIR+= libfreebsd -SUBDIR+= libhash -SUBDIR+= libjail -SUBDIR+= libucl -SUBDIR+= liblyaml +FLUA_MODULES+= libhash +FLUA_MODULES+= libjail +FLUA_MODULES+= libucl +FLUA_MODULES+= liblyaml + +.ifdef BOOTSTRAPPING +FLUA_MODULES+= libfreebsd/sys/linker +FLUA_MODULES+= libfreebsd/kenv +CFLAGS+= -I${.CURDIR} -DBOOTSTRAPPING + +SHAREDIR= ${WORLDTMP}/legacy/usr/share/flua +FLUA_PATH= ${SHAREDIR}/?.lua;${SHAREDIR}/?/init.lua +CFLAGS+= -DBOOTSTRAP_FLUA_PATH=\"${FLUA_PATH:Q}\" + +.for mod in ${FLUA_MODULES} +.include "${mod}/Makefile.inc" +.endfor + +.else + +FLUA_MODULES+= libfreebsd +SUBDIR+= ${FLUA_MODULES} + +.endif LUASRC?= ${SRCTOP}/contrib/lua/src .PATH: ${LUASRC} @@ -14,7 +33,7 @@ CWARNFLAGS.gcc+= -Wno-format-nonliteral -LIBADD= lua +LIBADD+= lua # Entry point SRCS+= lua.c diff --git a/libexec/flua/Makefile.inc b/libexec/flua/Makefile.inc --- a/libexec/flua/Makefile.inc +++ b/libexec/flua/Makefile.inc @@ -2,4 +2,9 @@ CFLAGS+= \ -I${SRCTOP}/contrib/lua/src \ - -I${SRCTOP}/lib/liblua + -I${SRCTOP}/lib/liblua \ + -I${SRCTOP}/libexec/flua + +.ifdef BOOTSTRAPPING +CFLAGS+= -DBOOTSTRAPPING +.endif diff --git a/libexec/flua/bootstrap.h b/libexec/flua/bootstrap.h new file mode 100644 --- /dev/null +++ b/libexec/flua/bootstrap.h @@ -0,0 +1,30 @@ +/*- + * Copyright (c) 2025 Kyle Evans + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#ifndef FLUA_BOOTSTRAP_H +#define FLUA_BOOTSTRAP_H + +#ifdef BOOTSTRAPPING +#include + +#include + +SET_DECLARE(flua_module_set, const luaL_Reg); +#define FLUA_MODULE_DEF(ident, modname, openfn) \ + static const luaL_Reg ident = { modname, openfn }; \ + DATA_SET(flua_module_set, ident) + +#define FLUA_MODULE_NAMED(mod, name) \ + FLUA_MODULE_DEF(module_ ## mod, name, luaopen_ ## mod) +#define FLUA_MODULE(mod) \ + FLUA_MODULE_DEF(module_ ## mod, #mod, luaopen_ ## mod) +#else /* !BOOTSTRAPPING */ +#define FLUA_MODULE_DEF(ident, modname, openfn) +#define FLUA_MODULE_NAMED(mod, name) +#define FLUA_MODULE(modname) +#endif /* BOOTSTRAPPING */ + +#endif /* FLUA_BOOTSTRAP_H */ diff --git a/libexec/flua/libfreebsd/kenv/Makefile b/libexec/flua/libfreebsd/kenv/Makefile --- a/libexec/flua/libfreebsd/kenv/Makefile +++ b/libexec/flua/libfreebsd/kenv/Makefile @@ -1,5 +1,5 @@ SHLIB_NAME= kenv.so -SRCS+= kenv.c MAN= freebsd.kenv.3lua +.include "Makefile.inc" .include diff --git a/libexec/flua/libfreebsd/kenv/Makefile.inc b/libexec/flua/libfreebsd/kenv/Makefile.inc new file mode 100644 --- /dev/null +++ b/libexec/flua/libfreebsd/kenv/Makefile.inc @@ -0,0 +1,2 @@ +.PATH: ${.PARSEDIR} +SRCS+= kenv.c diff --git a/libexec/flua/libfreebsd/kenv/kenv.c b/libexec/flua/libfreebsd/kenv/kenv.c --- a/libexec/flua/libfreebsd/kenv/kenv.c +++ b/libexec/flua/libfreebsd/kenv/kenv.c @@ -14,6 +14,8 @@ #include #include +#include "bootstrap.h" + int luaopen_freebsd_kenv(lua_State *L); static int @@ -94,3 +96,5 @@ return (1); } + +FLUA_MODULE_NAMED(freebsd_kenv, "freebsd.kenv"); diff --git a/libexec/flua/libfreebsd/sys/linker/Makefile b/libexec/flua/libfreebsd/sys/linker/Makefile --- a/libexec/flua/libfreebsd/sys/linker/Makefile +++ b/libexec/flua/libfreebsd/sys/linker/Makefile @@ -1,7 +1,6 @@ SHLIB_NAME= linker.so -SRCS+= linker.c - MAN= freebsd.sys.linker.3lua +.include "Makefile.inc" .include diff --git a/libexec/flua/libfreebsd/sys/linker/Makefile.inc b/libexec/flua/libfreebsd/sys/linker/Makefile.inc new file mode 100644 --- /dev/null +++ b/libexec/flua/libfreebsd/sys/linker/Makefile.inc @@ -0,0 +1,2 @@ +.PATH: ${.PARSEDIR} +SRCS+= linker.c diff --git a/libexec/flua/libfreebsd/sys/linker/linker.c b/libexec/flua/libfreebsd/sys/linker/linker.c --- a/libexec/flua/libfreebsd/sys/linker/linker.c +++ b/libexec/flua/libfreebsd/sys/linker/linker.c @@ -15,6 +15,8 @@ #include #include +#include "bootstrap.h" + int luaopen_freebsd_sys_linker(lua_State *L); static int @@ -80,3 +82,5 @@ return (1); } + +FLUA_MODULE_NAMED(freebsd_sys_linker, "freebsd.sys.linker"); diff --git a/libexec/flua/libhash/Makefile b/libexec/flua/libhash/Makefile --- a/libexec/flua/libhash/Makefile +++ b/libexec/flua/libhash/Makefile @@ -1,9 +1,6 @@ SHLIB_NAME= hash.so -SRCS+= lhash.c - -LIBADD+= md - MAN= hash.3lua +.include "Makefile.inc" .include diff --git a/libexec/flua/libhash/Makefile.inc b/libexec/flua/libhash/Makefile.inc new file mode 100644 --- /dev/null +++ b/libexec/flua/libhash/Makefile.inc @@ -0,0 +1,3 @@ +.PATH: ${.PARSEDIR} +SRCS+= lhash.c +LIBADD+= md diff --git a/libexec/flua/libhash/lhash.c b/libexec/flua/libhash/lhash.c --- a/libexec/flua/libhash/lhash.c +++ b/libexec/flua/libhash/lhash.c @@ -11,6 +11,8 @@ #include #include +#include "bootstrap.h" + #define SHA256_META "SHA256 meta table" #define SHA256_DIGEST_LEN 32 @@ -175,3 +177,5 @@ return 1; } + +FLUA_MODULE(hash); diff --git a/libexec/flua/libjail/Makefile b/libexec/flua/libjail/Makefile --- a/libexec/flua/libjail/Makefile +++ b/libexec/flua/libjail/Makefile @@ -1,9 +1,6 @@ SHLIB_NAME= jail.so -SRCS+= lua_jail.c - -LIBADD+= jail - MAN= jail.3lua +.include "Makefile.inc" .include diff --git a/libexec/flua/libjail/Makefile.inc b/libexec/flua/libjail/Makefile.inc new file mode 100644 --- /dev/null +++ b/libexec/flua/libjail/Makefile.inc @@ -0,0 +1,3 @@ +.PATH: ${.PARSEDIR} +SRCS+= lua_jail.c +LIBADD+= jail diff --git a/libexec/flua/libjail/lua_jail.c b/libexec/flua/libjail/lua_jail.c --- a/libexec/flua/libjail/lua_jail.c +++ b/libexec/flua/libjail/lua_jail.c @@ -38,6 +38,8 @@ #include #include +#include "bootstrap.h" + #define JAIL_METATABLE "jail iterator metatable" /* @@ -716,3 +718,5 @@ return (1); } + +FLUA_MODULE(jail); diff --git a/libexec/flua/liblyaml/Makefile b/libexec/flua/liblyaml/Makefile --- a/libexec/flua/liblyaml/Makefile +++ b/libexec/flua/liblyaml/Makefile @@ -1,22 +1,4 @@ SHLIB_NAME= yaml.so -WARNS= 1 -LYAMLSRC?= ${SRCTOP}/contrib/lyaml -.PATH: ${LYAMLSRC}/ext/yaml ${LYAMLSRC}/lib/lyaml -SRCS= emitter.c \ - parser.c \ - scanner.c \ - yaml.c -CFLAGS+= \ - -I${LYAMLSRC}/ext/yaml \ - -I${SRCTOP}/contrib/libyaml/include \ - -DVERSION=\"6.2.8\" -LIBADD+= yaml - -FILES= explicit.lua \ - functional.lua \ - implicit.lua \ - init.lua -FILESDIR= ${SHAREDIR}/flua/lyaml - +.include "Makefile.inc" .include diff --git a/libexec/flua/liblyaml/Makefile b/libexec/flua/liblyaml/Makefile.inc copy from libexec/flua/liblyaml/Makefile copy to libexec/flua/liblyaml/Makefile.inc --- a/libexec/flua/liblyaml/Makefile +++ b/libexec/flua/liblyaml/Makefile.inc @@ -1,9 +1,8 @@ -SHLIB_NAME= yaml.so - WARNS= 1 + LYAMLSRC?= ${SRCTOP}/contrib/lyaml .PATH: ${LYAMLSRC}/ext/yaml ${LYAMLSRC}/lib/lyaml -SRCS= emitter.c \ +SRCS+= emitter.c \ parser.c \ scanner.c \ yaml.c @@ -13,10 +12,9 @@ -DVERSION=\"6.2.8\" LIBADD+= yaml -FILES= explicit.lua \ +FILESGROUPS+= YAML +YAML= explicit.lua \ functional.lua \ implicit.lua \ init.lua -FILESDIR= ${SHAREDIR}/flua/lyaml - -.include +YAMLDIR= ${SHAREDIR}/flua/lyaml diff --git a/libexec/flua/libucl/Makefile b/libexec/flua/libucl/Makefile --- a/libexec/flua/libucl/Makefile +++ b/libexec/flua/libucl/Makefile @@ -1,14 +1,4 @@ SHLIB_NAME= ucl.so -WARNS= 2 - -UCLSRC?= ${SRCTOP}/contrib/libucl -.PATH: ${UCLSRC}/lua -SRCS+= lua_ucl.c -CFLAGS+= \ - -I${UCLSRC}/include \ - -I${UCLSRC}/src \ - -I${UCLSRC}/uthash -LIBADD+= ucl - +.include "Makefile.inc" .include diff --git a/libexec/flua/libucl/Makefile b/libexec/flua/libucl/Makefile.inc copy from libexec/flua/libucl/Makefile copy to libexec/flua/libucl/Makefile.inc --- a/libexec/flua/libucl/Makefile +++ b/libexec/flua/libucl/Makefile.inc @@ -1,8 +1,8 @@ -SHLIB_NAME= ucl.so - +.if ${WARNS:U6} > 2 WARNS= 2 +.endif -UCLSRC?= ${SRCTOP}/contrib/libucl +UCLSRC?= ${SRCTOP}/contrib/libucl .PATH: ${UCLSRC}/lua SRCS+= lua_ucl.c CFLAGS+= \ @@ -10,5 +10,3 @@ -I${UCLSRC}/src \ -I${UCLSRC}/uthash LIBADD+= ucl - -.include diff --git a/libexec/flua/linit_flua.c b/libexec/flua/linit_flua.c --- a/libexec/flua/linit_flua.c +++ b/libexec/flua/linit_flua.c @@ -26,8 +26,8 @@ #include "lprefix.h" - #include +#include #include "lua.h" @@ -37,6 +37,8 @@ #include "lposix.h" #include "lfbsd.h" +#include "bootstrap.h" + /* ** these libs are loaded by lua.c and are readily available to any Lua ** program @@ -62,6 +64,28 @@ {NULL, NULL} }; +#ifdef BOOTSTRAPPING +static void __attribute__((constructor)) flua_init_env(void) { + /* + * This happens in the middle of luaopen_package(). We could move it into + * flua_setup_mods(), but it seems better to avoid its timing being so + * important that it would break some of our bootstrap modules if someone + * were to reorder things. + */ + if (getenv("LUA_PATH") == NULL) + setenv("LUA_PATH", BOOTSTRAP_FLUA_PATH, 1); +} + +static void flua_setup_mods (lua_State *L) { + const luaL_Reg **flib; + + SET_FOREACH(flib, flua_module_set) { + luaL_requiref(L, (*flib)->name, (*flib)->func, 1); + lua_pop(L, 1); /* remove lib */ + } +}; +#endif + LUALIB_API void luaL_openlibs (lua_State *L) { const luaL_Reg *lib; /* "require" functions from 'loadedlibs' and set results to global table */ @@ -69,4 +93,7 @@ luaL_requiref(L, lib->name, lib->func, 1); lua_pop(L, 1); /* remove lib */ } +#ifdef BOOTSTRAPPING + flua_setup_mods(L); +#endif } diff --git a/tools/build/Makefile b/tools/build/Makefile --- a/tools/build/Makefile +++ b/tools/build/Makefile @@ -496,6 +496,7 @@ lib/geom \ usr/include/casper \ usr/include/private/ucl \ + usr/include/private/yaml \ usr/include/private/zstd \ usr/lib \ usr/libdata/pkgconfig \