diff --git a/nix/sources-mingw.json b/nix/sources-pmnsh.json similarity index 87% rename from nix/sources-mingw.json rename to nix/sources-pmnsh.json index e3923bfdff..cd3e8a30fc 100644 --- a/nix/sources-mingw.json +++ b/nix/sources-pmnsh.json @@ -3,7 +3,7 @@ "branch": "master", "description": "A command line tool and library for transferring data with URL syntax", "homepage": "http://curl.se/", - "mingw": { + "pmnsh": { "include": "include", "lib": "lib/.libs", "prepare": "autoreconf -vfi && ./configure --disable-shared --disable-ldap --disable-rtsp --without-brotli --without-libidn2 --without-libpsl --without-nghttp2 --with-openssl", @@ -20,7 +20,7 @@ "branch": "mdb.master", "description": "LMDB library", "homepage": "http://www.lmdb.tech/", - "mingw": { + "pmnsh": { "strip": 2, "make": "liblmdb.a" }, @@ -35,7 +35,7 @@ "branch": "master", "description": "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1.", "homepage": null, - "mingw": { + "pmnsh": { "include": "include", "lib": ".libs", "prepare": "./autogen.sh && ./configure --disable-shared --enable-module-recovery CFLAGS=-DSECP256K1_API=", @@ -52,11 +52,14 @@ "branch": "v1.x", "description": "Cross-platform asynchronous I/O", "homepage": "http://libuv.org/", - "mingw": { + "pmnsh": { "include": "include", "lib": ".libs", "prepare": "./autogen.sh && ./configure --disable-shared", - "make": "libuv.la" + "make": "libuv.la", + "compat": { + "m1brew": false + } }, "owner": "libuv", "repo": "libuv", @@ -66,17 +69,22 @@ "url_template": "https://github.com///archive/.tar.gz" }, "ent": { - "mingw": { + "pmnsh": { "prepare": "./configure" } }, "ge-additions": { - "mingw": { + "pmnsh": { "make": "CFLAGS=-I../ed25519" } }, "libaes_siv": { - "mingw": { + "pmnsh": { + "compat": { + "m1brew": { + "make": "CFLAGS=$(pkg-config --cflags openssl)" + } + } } } } diff --git a/nix/sources.json b/nix/sources.json index 4a4b8470d2..adb772dc2f 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -3,7 +3,7 @@ "branch": "master", "description": "With argon2u. Based off https://github.com/P-H-C/phc-winner-argon2", "homepage": "", - "mingw": { + "pmnsh": { "include": ["include", "src/blake2"], "make": "libargon2.a" }, @@ -19,7 +19,7 @@ "branch": "master", "description": "Submodule included by Urbit", "homepage": null, - "mingw": { + "pmnsh": { "strip": 1, "make": "all" }, @@ -35,10 +35,15 @@ "branch": "master", "description": "H2O - the optimized HTTP/1, HTTP/2, HTTP/3 server", "homepage": "https://h2o.examp1e.net", - "mingw": { + "pmnsh": { "include": "include", - "prepare": "cmake -G\"MSYS Makefiles\" .", - "make": "libh2o" + "prepare": "cmake .", + "make": "libh2o", + "compat": { + "mingw": { + "prepare": "cmake -G\"MSYS Makefiles\" ." + } + } }, "owner": "h2o", "repo": "h2o", @@ -76,7 +81,7 @@ "branch": "master", "description": null, "homepage": null, - "mingw": { + "pmnsh": { "make": "libscrypt.a CFLAGS_EXTRA=-ffast-math" }, "owner": "urbit", @@ -91,7 +96,7 @@ "branch": "master", "description": null, "homepage": null, - "mingw": { + "pmnsh": { "make": "static" }, "owner": "urbit", @@ -130,10 +135,18 @@ "branch": "master", "description": null, "homepage": null, - "mingw": { + "pmnsh": { "include": "source/include", - "lib": "build/Win64-MinGW-w64", - "make": "-C build/Win64-MinGW-w64 libsoftfloat3.a" + "compat": { + "m1brew": { + "lib": "build/template-FAST_INT64", + "make": "-C build/template-FAST_INT64 libsoftfloat3.a" + }, + "mingw": { + "lib": "build/Win64-MinGW-w64", + "make": "-C build/Win64-MinGW-w64 libsoftfloat3.a" + } + } }, "owner": "urbit", "repo": "berkeley-softfloat-3", diff --git a/pkg/urbit/compat/m1brew/compat.mk b/pkg/urbit/compat/m1brew/compat.mk new file mode 100644 index 0000000000..1c9733a036 --- /dev/null +++ b/pkg/urbit/compat/m1brew/compat.mk @@ -0,0 +1,7 @@ +# paths to brew packages +CFLAGS := $(CFLAGS) -I/opt/homebrew/include +LDFLAGS := $(LDFLAGS) -L/opt/homebrew/lib +# force linker to use static libraries +LDFLAGS := $(shell compat/m1brew/use-static-libs.sh $(LDFLAGS)) +# add extra osx libraries +LDFLAGS := $(LDFLAGS) -framework SystemConfiguration diff --git a/pkg/urbit/compat/m1brew/ed25519.patch b/pkg/urbit/compat/m1brew/ed25519.patch new file mode 100644 index 0000000000..1dfa957f1d --- /dev/null +++ b/pkg/urbit/compat/m1brew/ed25519.patch @@ -0,0 +1,13 @@ +diff --git a/Makefile b/Makefile +new file mode 100644 +--- /dev/null ++++ b/Makefile +@@ -0,0 +1,8 @@ ++.PHONY: all clean ++ ++all: *.c *.h ++ $(CC) -c -O3 -Wall -Werror *.c ++ $(AR) rcs libed25519.a *.o ++ ++clean: ++ rm -f *.o *.a diff --git a/pkg/urbit/compat/m1brew/ent.patch b/pkg/urbit/compat/m1brew/ent.patch new file mode 100644 index 0000000000..f26edf7a83 --- /dev/null +++ b/pkg/urbit/compat/m1brew/ent.patch @@ -0,0 +1,12 @@ +diff --git a/configure b/configure +--- a/configure ++++ b/configure +@@ -15,7 +15,7 @@ do + log "Trying IMPL=$IMPL" + + if IMPL=$impl make >/dev/null 2>/dev/null +- then sed -i 's|$(error IMPL must be set)|IMPL='"$impl"'|' Makefile ++ then sed -i "" 's|$(error IMPL must be set)|IMPL='"$impl"'|' Makefile + log "IMPL=$IMPL works" + exit 0 + else log "IMPL=$IMPL failed" diff --git a/pkg/urbit/compat/m1brew/libscrypt.patch b/pkg/urbit/compat/m1brew/libscrypt.patch new file mode 100644 index 0000000000..03e88629e8 --- /dev/null +++ b/pkg/urbit/compat/m1brew/libscrypt.patch @@ -0,0 +1,17 @@ +diff --git a/Makefile b/Makefile +index 783c537..3156ee2 100644 +--- a/Makefile ++++ b/Makefile +@@ -12,10 +12,9 @@ LDFLAGS_EXTRA?=-Wl,-z,relro + + all: reference + +-OBJS= crypto_scrypt-nosse.o sha256.o crypto-mcf.o b64.o crypto-scrypt-saltgen.o crypto_scrypt-check.o crypto_scrypt-hash.o slowequals.o ++OBJS= crypto_scrypt-nosse.o sha256.o crypto-mcf.o b64.o slowequals.o + +-libscrypt.so.0: $(OBJS) +- $(CC) $(LDFLAGS) -shared -o libscrypt.so.0 $(OBJS) -lm -lc ++libscrypt.a: $(OBJS) + ar rcs libscrypt.a $(OBJS) + + reference: libscrypt.so.0 main.o crypto_scrypt-hexconvert.o diff --git a/pkg/urbit/compat/m1brew/murmur3.patch b/pkg/urbit/compat/m1brew/murmur3.patch new file mode 100644 index 0000000000..cd83e9fdda --- /dev/null +++ b/pkg/urbit/compat/m1brew/murmur3.patch @@ -0,0 +1,13 @@ +diff --git a/makefile b/makefile +--- a/makefile ++++ b/makefile +@@ -12,5 +12,9 @@ shared: murmur3.c murmur3.h + $(CC) -fPIC -O3 -c murmur3.c + $(CC) -shared -Wl,--export-dynamic murmur3.o -o libmurmur3.so + ++static: murmur3.c murmur3.h ++ $(CC) -fPIC -O3 -c murmur3.c ++ $(AR) rcs libmurmur3.a murmur3.o ++ + clean: + rm -rf example *.o *.so diff --git a/pkg/urbit/compat/m1brew/softfloat3.patch b/pkg/urbit/compat/m1brew/softfloat3.patch new file mode 100644 index 0000000000..888d566f49 --- /dev/null +++ b/pkg/urbit/compat/m1brew/softfloat3.patch @@ -0,0 +1,85 @@ +diff --git a/build/template-FAST_INT64/Makefile b/build/template-FAST_INT64/Makefile +--- a/build/template-FAST_INT64/Makefile ++++ b/build/template-FAST_INT64/Makefile +@@ -34,28 +34,27 @@ + # + #============================================================================= + +-# Edit lines marked with `==>'. See "SoftFloat-source.html". ++SOURCE_DIR ?= ../../source ++SPECIALIZE_TYPE ?= 8086-SSE + +-==> SOURCE_DIR ?= ../../source +-==> SPECIALIZE_TYPE ?= 8086 ++SOFTFLOAT_OPTS ?= \ ++ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ ++ -DSOFTFLOAT_FAST_DIV64TO32 + +-==> SOFTFLOAT_OPTS ?= \ +-==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ +-==> -DSOFTFLOAT_FAST_DIV64TO32 ++DELETE = rm -f ++C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include ++COMPILE_C = \ ++ cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ ++MAKELIB = ar crs $@ ++LIBNAME = libsoftfloat3 + +-==> DELETE = rm -f +-==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include +-==> COMPILE_C = \ +-==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ +-==> MAKELIB = ar crs $@ ++OBJ = .o ++LIB = .a + +-==> OBJ = .o +-==> LIB = .a +- +-==> OTHER_HEADERS = ++OTHER_HEADERS = + + .PHONY: all +-all: softfloat$(LIB) ++all: $(LIBNAME)$(LIB) + + OBJS_PRIMITIVES = \ + s_eq128$(OBJ) \ +@@ -381,11 +380,11 @@ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c + $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c + $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c + +-softfloat$(LIB): $(OBJS_ALL) ++$(LIBNAME)$(LIB): $(OBJS_ALL) + $(DELETE) $@ + $(MAKELIB) $^ + + .PHONY: clean + clean: +- $(DELETE) $(OBJS_ALL) softfloat$(LIB) ++ $(DELETE) $(OBJS_ALL) $(LIBNAME)$(LIB) + +diff --git a/build/template-FAST_INT64/platform.h b/build/template-FAST_INT64/platform.h +--- a/build/template-FAST_INT64/platform.h ++++ b/build/template-FAST_INT64/platform.h +@@ -34,17 +34,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + =============================================================================*/ + +-// Edit lines marked with `==>'. See "SoftFloat-source.html". +- + /*---------------------------------------------------------------------------- + *----------------------------------------------------------------------------*/ +-==> #define LITTLEENDIAN 1 ++#define LITTLEENDIAN 1 + + /*---------------------------------------------------------------------------- + *----------------------------------------------------------------------------*/ +-==> #define INLINE inline ++#define INLINE inline + + /*---------------------------------------------------------------------------- + *----------------------------------------------------------------------------*/ +-==> #define THREAD_LOCAL _Thread_local ++#define THREAD_LOCAL _Thread_local + diff --git a/pkg/urbit/compat/m1brew/use-static-libs.sh b/pkg/urbit/compat/m1brew/use-static-libs.sh new file mode 100755 index 0000000000..7f7cf83a1c --- /dev/null +++ b/pkg/urbit/compat/m1brew/use-static-libs.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -euo pipefail +declare -a ldirs +for i in $@ +do + case $i in + -L*) ldirs+=(${i:2});; + esac +done +for i in $@ +do + case $i in + -l*) + lib=$(find ${ldirs[@]} -name lib${i:2}.a) + if [ "$lib" != "" ] + then + echo $lib + else + echo $i + fi;; + *) echo $i;; + esac +done diff --git a/pkg/urbit/compat/mingw/poor-mans-nix-shell.sh b/pkg/urbit/compat/poor-mans-nix-shell.sh similarity index 74% rename from pkg/urbit/compat/mingw/poor-mans-nix-shell.sh rename to pkg/urbit/compat/poor-mans-nix-shell.sh index 16e40d1fc8..ba8c5903bc 100644 --- a/pkg/urbit/compat/mingw/poor-mans-nix-shell.sh +++ b/pkg/urbit/compat/poor-mans-nix-shell.sh @@ -1,12 +1,10 @@ -# ensure required mingw packages are installed -mpkgs=(cmake curl gcc jq libuv make wslay) -pacman -S --needed autoconf automake-wrapper libtool patch ${mpkgs[@]/#/mingw-w64-x86_64-} - declare -a cdirs declare -a ldirs declare -A hdeps -sources=(../../nix/sources.json ../../nix/sources-mingw.json) -deriver=urbit-mingw-build +sources=(../../nix/sources.json ../../nix/sources-pmnsh.json) +patches=compat/$1 +deriver=urbit-$1-build +markfil=.$1~ depdirs= nixpath=${NIX_STORE-../build} @@ -50,7 +48,7 @@ buildnixdep () { then hash=${hdeps[$key]} dir=$nixpath/$hash-$key - if [ -e $dir/.mingw~ ] + if [ -e $dir/$markfil ] then # dependency present, don't reupload hash= @@ -79,14 +77,14 @@ buildnixdep () { fi # patch and build the dependency if necessary - if [ ! -e $dir/.mingw~ ] + if [ ! -e $dir/$markfil ] then - local patch=compat/mingw/$key.patch + local patch=$patches/$key.patch [ -e $patch ] && patch -d $dir -p 1 <$patch pushd $dir eval "$cmdprep" eval make "$cmdmake" - touch .mingw~ + touch $markfil popd fi @@ -118,30 +116,30 @@ EOF # I have to go over the sources files several times # because jq does not have a way to invoke external programs +jqprep='add|to_entries|.[]|.value.pmnsh as $p|select($p and $p.compat.'$1' != false)|(($p + $p.compat.'$1')|del(.compat)) as $o|' # list external dependencies, create hash map and directory replacement regex # use -j and \u0000 to work around https://github.com/stedolan/jq/issues/1870 while read -rd "" key json do # create 'store hash' from sources.json data and patch - patch=compat/mingw/$key.patch + patch=$patches/$key.patch read hash _ < <(( echo -n $json [ -e $patch ] && cat $patch)|sha256sum) hash=$(hex2nixbase32 $hash) hdeps[$key]=$hash - # NB: this path substitution works only in local dependencies - depdirs="$depdirs|gsub(\"\\\\.\\\\./$key\";\"$nixpath/$hash-$key\")" -done < <(jq --arg deriver "$deriver" -Sscrj 'add|to_entries|.[]|select(.value.mingw)|select(.value.url)|.key," ",{($deriver):(.value)},"\u0000"' ${sources[@]}) + depdirs="$depdirs|gsub(\"\\\\.\\\\./$key\";\"\\(\$d)/$hash-$key\")" +done < <(jq --arg deriver "$deriver" -Sscrj "$jqprep"'select(.value.url)|.key," ",{($deriver):(.value|del(.pmnsh) + ({'$1':$o}))},"\u0000"' ${sources[@]}) # build dependencies, create include and library directory arrays -. <(jq -sr 'add|to_entries|.[]|select(.value.mingw)|" +. <(jq --arg nixpath "$nixpath" -sr "$jqprep"'(if .value.url then ".." else $nixpath end) as $d|" unset dir key=\(.key|@sh) \\ url=\(.value.url//""|@sh) \\ -strip=\(.value.mingw.strip+1) \\ -cmdprep=\(.value.mingw.prepare//""'"$depdirs"'|@sh) \\ -cmdmake=\(.value.mingw.make//""'"$depdirs"'|@sh) \\ +strip=\($o.strip+1) \\ +cmdprep=\($o.prepare//""'"$depdirs"'|@sh) \\ +cmdmake=\($o.make//""'"$depdirs"'|@sh) \\ buildnixdep # sets dir -\(.value.mingw.include//"."|if type == "array" then . else [.] end|map("cdirs+=(-I$dir/\(.))")|join("\n")) -\(.value.mingw.lib//"."|if type == "array" then . else [.] end|map("ldirs+=(-L$dir/\(.))")|join("\n"))"' ${sources[@]}) +\($o.include//"."|if type == "array" then . else [.] end|map("cdirs+=(-I$dir/\(.))")|join("\n")) +\($o.lib//"."|if type == "array" then . else [.] end|map("ldirs+=(-L$dir/\(.))")|join("\n"))"' ${sources[@]}) diff --git a/pkg/urbit/configure b/pkg/urbit/configure index 3789b397dc..5646eb4379 100755 --- a/pkg/urbit/configure +++ b/pkg/urbit/configure @@ -19,7 +19,7 @@ defmacro () { echo "#define $1 $2" >>include/config.h } -xxd () { +poor_mans_xxd () { cch=0 echo "unsigned char $2[] = {" while IFS='' read line @@ -93,14 +93,18 @@ esac # TODO Determine if the target cpu is little or big endian. case $(tr A-Z a-z <<< $os) in *mingw*) + # ensure required mingw packages are installed + mpkgs=(cmake curl gcc jq make) + pacman -S --needed autoconf automake-wrapper libtool patch ${mpkgs[@]/#/mingw-w64-x86_64-} + # set up dependencies and create cdirs and ldirs arrays - . compat/mingw/poor-mans-nix-shell.sh + . compat/poor-mans-nix-shell.sh mingw # support running off a tarball that doesn't contain binary pills (( $(stat -c %s ../../bin/ivory.pill) > 512 )) || curl -L https://github.com/urbit/urbit/raw/urbit-v$URBIT_VERSION/bin/ivory.pill > ../../bin/ivory.pill - [ -e include/ca-bundle.h ] || xxd /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt include_ca_bundle_crt >include/ca-bundle.h - [ -e include/ivory.h ] || xxd ../../bin/ivory.pill u3_Ivory_pill >include/ivory.h + [ -e include/ca-bundle.h ] || poor_mans_xxd /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt include_ca_bundle_crt >include/ca-bundle.h + [ -e include/ivory.h ] || poor_mans_xxd ../../bin/ivory.pill u3_Ivory_pill >include/ivory.h defmacro U3_OS_mingw 1 @@ -115,7 +119,45 @@ case $(tr A-Z a-z <<< $os) in compat="${compat-} mingw" CFLAGS="${CFLAGS-} ${cdirs[@]}" LDFLAGS="${LDFLAGS-} ${ldirs[@]} -static" - PKG_CONFIG=">/dev/null echo" + PKG_CONFIG=false + ;; + m1brew) + # ensure required packages are installed + brew install -q autoconf automake bash cmake coreutils gmp jq libsigsegv libtool libuv openssl pkgconfig + + if (( ${BASH_VERSION%%.*} < 5 )) + then + echo Running bash version $BASH_VERSION is too low, please restart bash to use freshly installed one + exit 1 + fi + + # for some reason pkg-config does not pick up openssl + export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig:${PKG_CONFIG_PATH-}" + + # set up dependencies and create cdirs and ldirs arrays + . compat/poor-mans-nix-shell.sh m1brew + + # support running off a tarball that doesn't contain binary pills + (( $(stat -f %z ../../bin/ivory.pill) > 512 )) || curl -L https://github.com/urbit/urbit/raw/urbit-v$URBIT_VERSION/bin/ivory.pill > ../../bin/ivory.pill + + [ -e include/ca-bundle.h ] || poor_mans_xxd /etc/ssl/cert.pem include_ca_bundle_crt >include/ca-bundle.h + [ -e include/ivory.h ] || poor_mans_xxd ../../bin/ivory.pill u3_Ivory_pill >include/ivory.h + + defmacro U3_OS_osx 1 + + deps="${deps/ssl/openssl}" + deps="${deps/uv/libuv}" + if ((opt_debug)) + then + CFLAGS="${CFLAGS-} -O0 -g" + else + # clang hangs on noun/allocate.c if -g is specified + CFLAGS="${CFLAGS-} -O3" + fi + + compat="${compat-} posix m1brew" + CFLAGS="${CFLAGS-} ${cdirs[@]}" + LDFLAGS="${LDFLAGS-} ${ldirs[@]}" ;; *linux*) defmacro U3_OS_linux 1 @@ -143,8 +185,9 @@ case $(tr A-Z a-z <<< $os) in esac for dep in ${osdeps-} $deps -do LDFLAGS="${LDFLAGS-} -l$dep" - ${PKG_CONFIG-pkg-config} --cflags --libs $dep 2>/dev/null || true +do + LDFLAGS="${LDFLAGS-} $(${PKG_CONFIG-pkg-config} --libs $dep 2>/dev/null || echo -l$dep)" + CFLAGS="${CFLAGS-} $(${PKG_CONFIG-pkg-config} --cflags $dep 2>/dev/null || true)" done for header in $headers diff --git a/pkg/urbit/include/c/portable.h b/pkg/urbit/include/c/portable.h index 16921ec681..4204769bf5 100644 --- a/pkg/urbit/include/c/portable.h +++ b/pkg/urbit/include/c/portable.h @@ -116,6 +116,9 @@ # define U3_OS_LoomBase 0x36000000 # endif # define U3_OS_LoomBits 29 // ie, 2^29 words == 2GB +# elif defined(U3_OS_osx) && defined(U3_CPU_aarch64) || defined(U3_OS_mingw) +# define U3_OS_LoomBase 0x28000000000 +# define U3_OS_LoomBits 29 // ie, 2^29 words == 2GB # elif defined(U3_OS_osx) || defined(U3_OS_bsd) # ifdef __LP64__ # define U3_OS_LoomBase 0x200000000 @@ -123,9 +126,6 @@ # define U3_OS_LoomBase 0x4000000 # endif # define U3_OS_LoomBits 29 // ie, 2^29 words == 2GB -# elif defined(U3_OS_mingw) -# define U3_OS_LoomBase 0x28000000000 -# define U3_OS_LoomBits 29 // ie, 2^29 words == 2GB # else # error "port: LoomBase" # endif