From fd63cea0a34a11f4849aeb40667dbfdd25f13c9b Mon Sep 17 00:00:00 2001 From: Jonah Beckford <71855677+jonahbeckford@users.noreply.github.com> Date: Sun, 3 Sep 2023 13:56:18 -0700 Subject: [PATCH 01/14] Add ./dk The ./dk script downloads other DkML scripts. We want it to download the CI scripts. --- cmake/FindDkToolScripts.cmake | 235 +++++++++++ dk | 723 ++++++++++++++++++++++++++++++++++ dk.cmd | 183 +++++++++ 3 files changed, 1141 insertions(+) create mode 100644 cmake/FindDkToolScripts.cmake create mode 100644 dk create mode 100644 dk.cmd diff --git a/cmake/FindDkToolScripts.cmake b/cmake/FindDkToolScripts.cmake new file mode 100644 index 00000000..94090176 --- /dev/null +++ b/cmake/FindDkToolScripts.cmake @@ -0,0 +1,235 @@ +########################################################################## +# File: dktool/cmake/FindDkToolScripts.cmake # +# # +# Copyright 2023 Diskuv, Inc. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # +# implied. See the License for the specific language governing # +# permissions and limitations under the License. # +# # +########################################################################## + +# Recommendation: Place this file in source control. +# Auto-generated by `./dk dksdk.project.new` of dktool. + +include(FetchContent) + +function(parse_dktool_command_line) + # The first argument is . All dots will be replaced with a + # triple underscore as a convenience and to be pretty for the user. + # However, we do not error if no is given ... we'll do + # that later. + set(command) + set(expected_function_name) + set(quotedArgs "") + if(ARGC EQUAL 0 OR (ARGC EQUAL 1 AND ARGV0 STREQUAL HELP)) + message(NOTICE [[Usage: + ./dk HELP + ./dk [args] +]]) + else() + set(command ${ARGV0}) + string(REPLACE "." "___" expected_function_name ${command}) + message(VERBOSE "Searching for ${expected_function_name}") + + # Parse the remainder of the arguments [args] + # * Use technique from [Professional CMake: A Practical Guide - Forwarding Command Arguments] + # to be able to forward arguments correctly to an inner function (the function). + cmake_parse_arguments(PARSE_ARGV 1 FWD "" "" "") + foreach(arg IN LISTS FWD_UNPARSED_ARGUMENTS) + string(APPEND quotedArgs " [===[${arg}]===]") + endforeach() + endif() + + # Set policies (we are in a new EVAL CODE context) + # Included scripts do automatic cmake_policy PUSH and POP + if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) + endif() + # Allow GIT_SUBMODULES empty to mean no submodules + if(POLICY CMP0097) + cmake_policy(SET CMP0097 NEW) + endif() + + # Setup the binary directory + if(NOT DKTOOL_WORKDIR) + message(FATAL_ERROR "Illegal state. Expecting DKTOOL_WORKDIR") + endif() + set(CMAKE_BINARY_DIR ${DKTOOL_WORKDIR}) + set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_BINARY_DIR}) + + # Search in all the user scripts + set(dot_function_names) + file(GLOB_RECURSE command_files + LIST_DIRECTORIES FALSE + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts + cmake/scripts/*.cmake) + foreach(command_file IN LISTS command_files) + # Normalize and lowercase + cmake_path(NORMAL_PATH command_file) + string(TOLOWER "${command_file}" command_file) + cmake_path(REMOVE_EXTENSION command_file OUTPUT_VARIABLE command_file_no_ext) + + # Convert to list + string(REPLACE "/" ";" command_stems_no_namespace ${command_file_no_ext}) + + # Make a pretty description only for validation + set(pretty_stems ${command_stems_no_namespace}) + list(TRANSFORM pretty_stems PREPEND "'") + list(TRANSFORM pretty_stems APPEND "'") + string(JOIN ", " pretty_stems_str ${pretty_stems}) + string(REGEX REPLACE ",([^,]*)" " and \\1" pretty_stems_str "${pretty_stems_str}") + + # Validate that only alphanumeric with underscores (but not the reserved three underscores) + string(REGEX MATCH "[/a-z0-9_]*" only_alphanum_and_underscores "${command_file_no_ext}") + if(NOT only_alphanum_and_underscores STREQUAL "${command_file_no_ext}") + message(WARNING "Ignoring user script ${CMAKE_CURRENT_SOURCE_DIR}/${command_file}. +The stems of the user script (${pretty_stems_str}) must only contain letters, numbers and underscores.") + continue() + endif() + string(FIND "${command_file_no_ext}" "___" reserved_underscores) + if(reserved_underscores GREATER_EQUAL 0) + message(WARNING "Ignoring user script ${CMAKE_CURRENT_SOURCE_DIR}/${command_file}. +No stem of the user script (${pretty_stems_str}) can contain a triple underscore ('___').") + continue() + endif() + + # Translate dev/xxx.cmake to the "user" namespaced function name + # `user__dev__xxx` and `user.dev.xxx`. + set(command_stems ${command_stems_no_namespace}) + list(PREPEND command_stems "user") + string(JOIN "___" command_function_name ${command_stems}) + string(JOIN "." dot_function_name ${command_stems}) + list(APPEND dot_function_names ${dot_function_name}) + + # In a new scope (to avoid a global, leaky namespace) register the function. + message(VERBOSE "Shimming ${command_function_name}") + cmake_language(EVAL CODE " +function(${command_function_name}) + include(\"${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts/${command_file}\") + if(COMMAND run) + run(${quotedArgs}) + else() + message(FATAL_ERROR [[The user script ${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts/${command_file} was missing: + function(run) + # Your user code + endfunction() +]]) + endif() +endfunction() +") + endforeach() + + # Include all the system scripts. + # - Since the system scripts come after the user scripts, the user scripts + # don't override the system scripts unless the user scripts use deferred + # hooks or redefine CMake built-in functions. Regardless, the user + # scripts are namespaced with `user__` prefix + if(NOT IS_DIRECTORY cmake/scripts/dksdk) + # If this project (ex. dktool) has the system scripts, it must + # have all of them. Otherwise we download the system scripts. + FetchContent_Populate(dktool + QUIET + GIT_REPOSITORY https://gitlab.com/diskuv/dktool.git + GIT_TAG 1.0 + # As of 3.25.3 the bug https://gitlab.kitware.com/cmake/cmake/-/issues/24578 + # has still not been fixed. That means empty strings get removed. + # ExternalProject_Add(GIT_SUBMODULES) in dktool-subbuild/CMakeLists.txt + # means fetch all submodules. + # https://gitlab.kitware.com/cmake/cmake/-/issues/20579#note_734045 + # has a workaround. + GIT_SUBMODULES cmake # Non-git-submodule dir that already exists + GIT_SUBMODULES_RECURSE OFF + ) + file(GLOB_RECURSE system_command_files + LIST_DIRECTORIES FALSE + RELATIVE ${dktool_SOURCE_DIR}/cmake/scripts + ${dktool_SOURCE_DIR}/cmake/scripts/dkml/*.cmake + ${dktool_SOURCE_DIR}/cmake/scripts/dksdk/*.cmake) + foreach(command_file IN LISTS system_command_files) + # Normalize and lowercase + cmake_path(NORMAL_PATH command_file) + string(TOLOWER "${command_file}" command_file) + cmake_path(REMOVE_EXTENSION command_file OUTPUT_VARIABLE command_file_no_ext) + + # Convert to list + string(REPLACE "/" ";" command_stems_no_namespace ${command_file_no_ext}) + + # Translate dksdk/xxx.cmake to the function name `dksdk__xxx` and `dksdk.xxx` + set(command_stems ${command_stems_no_namespace}) + string(JOIN "___" command_function_name ${command_stems}) + string(JOIN "." dot_function_name ${command_stems}) + list(APPEND dot_function_names ${dot_function_name}) + + # In a new scope (to avoid a global, leaky namespace) register the function. + message(VERBOSE "Shimming ${command_function_name}") + cmake_language(EVAL CODE " +function(${command_function_name}) + include(\"${dktool_SOURCE_DIR}/cmake/scripts/${command_file}\") + if(COMMAND run) + run(${quotedArgs}) + else() + message(FATAL_ERROR [[The system script ${dktool_SOURCE_DIR}/cmake/scripts/${command_file} was missing: + function(run) + # The system code + endfunction() +]]) + endif() +endfunction() +") + + endforeach() + endif() + + # Pretty function names that are available + set(pretty_function_names ${dot_function_names}) + list(TRANSFORM pretty_function_names PREPEND " ") + list(TRANSFORM pretty_function_names APPEND "\n") + string(JOIN "" str_pretty_function_names ${pretty_function_names}) + + # Exit if no + if(NOT command) + message(NOTICE "The following commands are available: +${str_pretty_function_names}") + return() + endif() + + # Validate the exists + if(NOT COMMAND ${expected_function_name}) + message(FATAL_ERROR "No command '${command}' exists. The following commands are available: +${str_pretty_function_names}") + message(FATAL_ERROR "No command '${command}' exists") + endif() + + # Call the function + cmake_language(EVAL CODE "${expected_function_name}()") +endfunction() + +# DkML data home +if(WIN32) + set(DKML_DATA_HOME "$ENV{LOCALAPPDATA}/Programs/DiskuvOCaml") +elseif(DEFINED ENV{XDG_DATA_HOME}) + set(DKML_DATA_HOME "$ENV{XDG_DATA_HOME}/diskuv-ocaml") +else() + set(DKML_DATA_HOME "$ENV{HOME}/.local/share/diskuv-ocaml") +endif() + +# DkSDK data home +if(WIN32) + set(DKSDK_DATA_HOME "$ENV{LOCALAPPDATA}/Programs/DkSDK") +elseif(DEFINED ENV{XDG_DATA_HOME}) + set(DKSDK_DATA_HOME "$ENV{XDG_DATA_HOME}/dksdk") +else() + set(DKSDK_DATA_HOME "$ENV{HOME}/.local/share/dksdk") +endif() + +# Splat DKTOOL_CMDLINE +cmake_language(EVAL CODE "parse_dktool_command_line(${DKTOOL_CMDLINE})") diff --git a/dk b/dk new file mode 100644 index 00000000..44d8adc3 --- /dev/null +++ b/dk @@ -0,0 +1,723 @@ +#!/bin/sh +########################################################################## +# File: dktool/dk # +# # +# Copyright 2023 Diskuv, Inc. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # +# implied. See the License for the specific language governing # +# permissions and limitations under the License. # +# # +########################################################################## + +# Recommendation: Place this file in source control. +# Auto-generated by `./dk dksdk.project.new` of dktool. +# +# Invoking: ./dk +# That works in Powershell on Windows, and in Unix. Copy-and-paste works! +# +# Purpose: Install CMake if not already. Then invoke CMake. + +set -euf + +dk_pwd=$PWD + +# --- Imports of dkml-runtime-common's crossplatform-functions.sh --- + +# Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`). +# +# Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not +# know whether the PATH has been set correctly, or when you do not know if the +# system binary exists. +# +# At some point in the future, this function will error out if the required system binaries +# do not exist. Most system binaries are common to all Unix/Linux/macOS installations but +# some (like `comm`) may need to be installed for proper functioning of DKML. +# +# Outputs: +# - env:DKMLSYS_MV - Location of `mv` +# - env:DKMLSYS_CHMOD - Location of `chmod` +# - env:DKMLSYS_UNAME - Location of `uname` +# - env:DKMLSYS_ENV - Location of `env` +# - env:DKMLSYS_AWK - Location of `awk` +# - env:DKMLSYS_SED - Location of `sed` +# - env:DKMLSYS_COMM - Location of `comm` +# - env:DKMLSYS_INSTALL - Location of `install` +# - env:DKMLSYS_RM - Location of `rm` +# - env:DKMLSYS_SORT - Location of `sort` +# - env:DKMLSYS_CAT - Location of `cat` +# - env:DKMLSYS_STAT - Location of `stat` +# - env:DKMLSYS_GREP - Location of `grep` +# - env:DKMLSYS_CURL - Location of `curl` (empty if not found) +# - env:DKMLSYS_WGET - Location of `wget` (empty if not found) +# - env:DKMLSYS_TR - Location of `tr` +autodetect_system_binaries() { + if [ -z "${DKMLSYS_MV:-}" ]; then + if [ -x /usr/bin/mv ]; then + DKMLSYS_MV=/usr/bin/mv + else + DKMLSYS_MV=/bin/mv + fi + fi + if [ -z "${DKMLSYS_CHMOD:-}" ]; then + if [ -x /usr/bin/chmod ]; then + DKMLSYS_CHMOD=/usr/bin/chmod + else + DKMLSYS_CHMOD=/bin/chmod + fi + fi + if [ -z "${DKMLSYS_UNAME:-}" ]; then + if [ -x /usr/bin/uname ]; then + DKMLSYS_UNAME=/usr/bin/uname + else + DKMLSYS_UNAME=/bin/uname + fi + fi + if [ -z "${DKMLSYS_ENV:-}" ]; then + if [ -x /usr/bin/env ]; then + DKMLSYS_ENV=/usr/bin/env + else + DKMLSYS_ENV=/bin/env + fi + fi + if [ -z "${DKMLSYS_AWK:-}" ]; then + if [ -x /usr/bin/awk ]; then + DKMLSYS_AWK=/usr/bin/awk + else + DKMLSYS_AWK=/bin/awk + fi + fi + if [ -z "${DKMLSYS_SED:-}" ]; then + if [ -x /usr/bin/sed ]; then + DKMLSYS_SED=/usr/bin/sed + else + DKMLSYS_SED=/bin/sed + fi + fi + if [ -z "${DKMLSYS_COMM:-}" ]; then + if [ -x /usr/bin/comm ]; then + DKMLSYS_COMM=/usr/bin/comm + else + DKMLSYS_COMM=/bin/comm + fi + fi + if [ -z "${DKMLSYS_INSTALL:-}" ]; then + if [ -x /usr/bin/install ]; then + DKMLSYS_INSTALL=/usr/bin/install + else + DKMLSYS_INSTALL=/bin/install + fi + fi + if [ -z "${DKMLSYS_RM:-}" ]; then + if [ -x /usr/bin/rm ]; then + DKMLSYS_RM=/usr/bin/rm + else + DKMLSYS_RM=/bin/rm + fi + fi + if [ -z "${DKMLSYS_SORT:-}" ]; then + if [ -x /usr/bin/sort ]; then + DKMLSYS_SORT=/usr/bin/sort + else + DKMLSYS_SORT=/bin/sort + fi + fi + if [ -z "${DKMLSYS_CAT:-}" ]; then + if [ -x /usr/bin/cat ]; then + DKMLSYS_CAT=/usr/bin/cat + else + DKMLSYS_CAT=/bin/cat + fi + fi + if [ -z "${DKMLSYS_STAT:-}" ]; then + if [ -x /usr/bin/stat ]; then + DKMLSYS_STAT=/usr/bin/stat + else + DKMLSYS_STAT=/bin/stat + fi + fi + if [ -z "${DKMLSYS_GREP:-}" ]; then + if [ -x /usr/bin/grep ]; then + DKMLSYS_GREP=/usr/bin/grep + else + DKMLSYS_GREP=/bin/grep + fi + fi + if [ -z "${DKMLSYS_CURL:-}" ]; then + if [ -x /usr/bin/curl ]; then + DKMLSYS_CURL=/usr/bin/curl + elif [ -x /bin/curl ]; then + DKMLSYS_CURL=/bin/curl + else + DKMLSYS_CURL= + fi + fi + if [ -z "${DKMLSYS_WGET:-}" ]; then + if [ -x /usr/bin/wget ]; then + DKMLSYS_WGET=/usr/bin/wget + elif [ -x /bin/wget ]; then + DKMLSYS_WGET=/bin/wget + else + DKMLSYS_WGET= + fi + fi + if [ -z "${DKMLSYS_TR:-}" ]; then + if [ -x /usr/bin/tr ]; then + DKMLSYS_TR=/usr/bin/tr + else + DKMLSYS_TR=/bin/tr + fi + fi + export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL + export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR +} + +# Is a Windows build machine if we are in a MSYS2 or Cygwin environment. +# +# Better alternatives +# ------------------- +# +# 1. If you are checking to see if you should do a cygpath, then just guard it +# like so: +# if [ -x /usr/bin/cygpath ]; then +# do_something $(/usr/bin/cygpath ...) ... +# fi +# This clearly guards what you are about to do (cygpath) with what you will +# need (cygpath). +# 2. is_arg_windows_platform +is_unixy_windows_build_machine() { + if is_msys2_msys_build_machine || is_cygwin_build_machine; then + return 0 + fi + return 1 +} + +# Is a MSYS2 environment with the MSYS or MINGW64 subsystem? +# * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml +# * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`) +# https://www.msys2.org/docs/environments/ +is_msys2_msys_build_machine() { + if [ -e /usr/bin/msys-2.0.dll ] && { + [ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ] + }; then + return 0 + fi + return 1 +} + +is_cygwin_build_machine() { + if [ -e /usr/bin/cygwin1.dll ]; then + return 0 + fi + return 1 +} + +# Tries to find the host ABI. +# +# Beware: This function uses `uname` probing which is inaccurate during +# cross-compilation. +# +# Outputs: +# - env:BUILDHOST_ARCH will contain the host ABI. +autodetect_buildhost_arch() { + # Set DKMLSYS_* + autodetect_system_binaries + + autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s) + autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m) + # list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m + case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in + Linux-armv7*) + BUILDHOST_ARCH=linux_arm32v7;; + Linux-armv6* | Linux-arm) + BUILDHOST_ARCH=linux_arm32v6;; + Linux-aarch64 | Linux-arm64 | Linux-armv8*) + BUILDHOST_ARCH=linux_arm64;; + Linux-i386 | Linux-i686) + BUILDHOST_ARCH=linux_x86;; + Linux-x86_64) + BUILDHOST_ARCH=linux_x86_64;; + Darwin-arm64) + BUILDHOST_ARCH=darwin_arm64;; + Darwin-x86_64) + BUILDHOST_ARCH=darwin_x86_64;; + *-i386 | *-i686) + if is_unixy_windows_build_machine; then + BUILDHOST_ARCH=windows_x86 + else + printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2 + exit 1 + fi + ;; + *-x86_64) + if is_unixy_windows_build_machine; then + BUILDHOST_ARCH=windows_x86_64 + else + printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2 + exit 1 + fi + ;; + *) + # Since: + # 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/) + # 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160) + # we do not support Windows ARM/ARM64 as a build machine + printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2 + exit 1 + ;; + esac +} + +# A function that will try to print an ISO8601 timestamp, but will fallback to +# the system default. Always uses UTC timezone. +try_iso8601_timestamp() { + date -u -Iseconds 2>/dev/null || TZ=UTC date +} + +# A function that will print the command and possibly time it (if and only if it uses a full path to +# an executable, so that 'time' does not fail on internal shell functions). +# If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the +# function will return the error code. +log_trace() { + log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF} + + log_trace_1="$1" + if [ "$log_trace_1" = "--return-error-code" ]; then + shift + log_trace_RETURN=ON + fi + + if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then + printf "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*" >&2 + if [ -x "$1" ]; then + time "$@" + else + "$@" + fi + else + # use judgement so we essentially have log at an INFO level + case "$1" in + rm|cp) + # debug level. only show when DKML_BUILD_TRACE=ON + ;; + git|make|ocaml_configure|ocaml_make|make_host|make_target) + # info level. and can show entire command without polluting the screen + printf "[%s] %s\n" "$(try_iso8601_timestamp)" "$*" >&2 + ;; + *) printf "[%s] %s\n" "$(try_iso8601_timestamp)" "$1" >&2 + esac + "$@" + fi + log_trace_ec="$?" + if [ "$log_trace_ec" -ne 0 ]; then + if [ "$log_trace_RETURN" = ON ]; then + return "$log_trace_ec" + else + printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2 + exit "$log_trace_ec" + fi + fi +} + +# [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output. +sha256compute() { + sha256compute_FILE="$1" + shift + # For reasons unclear doing the following in MSYS2: + # sha256sum 'Z:\source\README.md' + # will produce a backslash like: + # \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md + # So always cygpath the filename if available + if [ -x /usr/bin/cygpath ]; then + sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE") + fi + + if [ -x /usr/bin/shasum ]; then + /usr/bin/shasum -a 256 "$sha256compute_FILE" | awk '{print $1}' + elif [ -x /usr/bin/sha256sum ]; then + /usr/bin/sha256sum "$sha256compute_FILE" | awk '{print $1}' + else + printf "FATAL: %s\n" "No sha256 checksum utility found" >&2 + exit 107 + fi +} + +# [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM. +# The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match. +sha256check() { + sha256check_FILE="$1" + shift + sha256check_SUM="$1" + shift + if [ -x /usr/bin/shasum ]; then + printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/shasum -a 256 -c >&2 + elif [ -x /usr/bin/sha256sum ]; then + printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2 + else + printf "FATAL: %s\n" "No sha256 checksum utility found" >&2 + exit 107 + fi +} + +# [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM. +# If the FILE already exists with the correct checksum it is not redownloaded. +# The function will exit with failure if the checksum does not match. +downloadfile() { + downloadfile_URL="$1" + shift + downloadfile_FILE="$1" + shift + downloadfile_SUM="$1" + shift + + # Set DKMLSYS_* + autodetect_system_binaries + + if [ -e "$downloadfile_FILE" ]; then + if sha256check "$downloadfile_FILE" "$downloadfile_SUM"; then + return 0 + else + $DKMLSYS_RM -f "$downloadfile_FILE" + fi + fi + if [ "${CI:-}" = true ]; then + if [ -n "$DKMLSYS_CURL" ]; then + log_trace "$DKMLSYS_CURL" -L -s "$downloadfile_URL" -o "$downloadfile_FILE".tmp + elif [ -n "$DKMLSYS_WGET" ]; then + log_trace "$DKMLSYS_WGET" -q -O "$downloadfile_FILE".tmp "$downloadfile_URL" + else + echo "No curl or wget available on the system paths" >&2 + exit 107 + fi + else + if [ -n "$DKMLSYS_CURL" ]; then + log_trace "$DKMLSYS_CURL" -L "$downloadfile_URL" -o "$downloadfile_FILE".tmp + elif [ -n "$DKMLSYS_WGET" ]; then + log_trace "$DKMLSYS_WGET" -O "$downloadfile_FILE".tmp "$downloadfile_URL" + else + echo "No curl or wget available on the system paths" >&2 + exit 107 + fi + fi + if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then + printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2 + exit 1 + fi + $DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE" +} + +# --- Environment detection --- + +# Set DKMLSYS_* +autodetect_system_binaries + +# Find host ABI. Set in BUILDHOST_ARCH +autodetect_buildhost_arch + +# Use the project tree as the current directory +PROJ_DIR=$(dirname "$0") +PROJ_DIR=$(cd "$PROJ_DIR" && pwd) +cd "$PROJ_DIR" + +# --- Tool directory selection --- + +tools_dir= +tools_name=dktool +# 1. Check if CI since many CI providers can only cache content in a subdirectory +# of the project. +if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then + install -d "$PROJ_DIR/.tools" + tools_dir="$PROJ_DIR/.tools" +fi +# 2. Check in locations rooted under /opt/diskuv +# We look under a /opt/diskuv early because +# - Especially important for WSL2 to use a pure Linux filesystem (ext4) for +# best performance. +# - Using a canonical location (especially /opt/diskuv/usr/share) makes +# it easy to use CMake presets for non-Windows hosts. +if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then + install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name" + tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name" +fi +if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then + install -d "/opt/diskuv/$HOME/.local/share/$tools_name" + tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name" +fi +if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then + install -d "/opt/diskuv/usr/share/$tools_name" + tools_dir="/opt/diskuv/usr/share/$tools_name" +fi +# 3. Check in the conventional locations rooted under / +if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then + install -d "$XDG_DATA_HOME/$tools_name" + tools_dir="$XDG_DATA_HOME/$tools_name" +fi +if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then + install -d "$HOME/.local/share/$tools_name" + tools_dir="$HOME/.local/share/$tools_name" +fi +# 4. Validate +if [ -z "$tools_dir" ]; then + echo "FATAL: Could not find a location to install the tools necessary for this project." >&2 + echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2 + echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2 + echo " ...: creating the \$XDG_DATA_HOME directory." >&2 + exit 2 +fi + +# --- Tool downloads and installs --- + +# PREREQS +# ------- + +install_linux_prog() { + install_linux_prog_NAME=$1 + shift + install_linux_prog_PKG=$1 + shift + if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then + export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME" + else + if command -v yum > /dev/null 2> /dev/null; then + if [ "$(id -u)" -eq 0 ]; then + yum install -y "$install_linux_prog_PKG" + else + echo "Running: sudo yum install -y $install_linux_prog_PKG" + sudo yum install -y "$install_linux_prog_PKG" + fi + else + if [ "$(id -u)" -eq 0 ]; then + apt-get -q install -y "$install_linux_prog_PKG" + else + echo "Running: sudo -q apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG" + sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG" + fi + fi + DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME") + export DK_PROG_INSTALLED_LOCATION + fi +} + +get_homebrew_binary() { + get_homebrew_binary_NAME=$1 + shift + if command -v brew > /dev/null 2> /dev/null; then + get_homebrew_binary_PREFIX=$(brew --prefix) + if [ -x "$get_homebrew_binary_PREFIX/bin/$get_homebrew_binary_NAME" ]; then + export DK_PROG_INSTALLED_LOCATION="$get_homebrew_binary_PREFIX/bin/$get_homebrew_binary_NAME" + return 0 + fi + fi + return 1 +} + +install_macos_prog() { + install_macos_prog_NAME=$1 + shift + install_macos_prog_PKG=$1 + shift + if [ -x "/usr/bin/$install_macos_prog_NAME" ]; then + export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_macos_prog_NAME" + elif [ -x "/usr/local/bin/$install_macos_prog_NAME" ]; then + export DK_PROG_INSTALLED_LOCATION="/usr/local/bin/$install_macos_prog_NAME" + elif get_homebrew_binary "$install_macos_prog_NAME"; then + # DK_PROG_INSTALLED_LOCATION already set by [get_homebrew_binary] + true + else + if command -v brew > /dev/null 2> /dev/null; then + brew install --quiet --formula "$install_macos_prog_PKG" >&2 + get_homebrew_binary "$install_macos_prog_NAME" + # DK_PROG_INSTALLED_LOCATION already set by [get_homebrew_binary] + elif command -v port > /dev/null 2> /dev/null; then + if [ "$(id -u)" -eq 0 ]; then + port install "$install_macos_prog_PKG" + else + echo "Running: sudo port install $install_macos_prog_PKG" + sudo port install "$install_macos_prog_PKG" + fi + DK_PROG_INSTALLED_LOCATION=$(command -v "$install_macos_prog_NAME") + export DK_PROG_INSTALLED_LOCATION + else + echo "FATAL: Neither Homebrew nor MacPorts are available on your macOS. You can follow https://docs.brew.sh/Installation to install Homebrew." >&2 + exit 2 + fi + fi +} + +case $BUILDHOST_ARCH in + linux_*) + install_linux_prog wget wget # For [downloadfile] + install_linux_prog tar tar # For handling tar balls later in this script + ;; +esac + +# NINJA +# ----- +# We need a valid CMAKE_GENERATOR to do FetchContent_Populate() in script mode + +NINJA_EXE= +case $BUILDHOST_ARCH in + darwin_*) + install_macos_prog ninja ninja + NINJA_EXE=$DK_PROG_INSTALLED_LOCATION;; + linux_*) + install_linux_prog ninja ninja-build + NINJA_EXE=$DK_PROG_INSTALLED_LOCATION;; +esac + +# CMAKE +# ----- + +case $BUILDHOST_ARCH in + linux_*) + # This is for CMake to do FetchContent() + install_linux_prog git git ;; +esac +case $BUILDHOST_ARCH in + linux_x86) + # This is for Python wheel extraction + install_linux_prog unzip unzip ;; +esac + +cmake_base= +cmake_majmin_ver=3.25 +cmake_majminpat_ver=3.25.2 +cmake_bindir= +cmake_destdir=$tools_dir/cmake-$cmake_majminpat_ver +install -d "$tools_dir/dl" +download_cmake() { + case $BUILDHOST_ARCH in + darwin_*) + install_macos_prog cmake cmake + cmake_bindir=$(dirname "$DK_PROG_INSTALLED_LOCATION") + ;; + linux_x86_64) + cmake_base="cmake-$cmake_majminpat_ver-linux-x86_64" + printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux x86_64" >&2 + downloadfile \ + "https://github.com/Kitware/CMake/releases/download/v$cmake_majminpat_ver/$cmake_base.tar.gz" \ + "$tools_dir/dl/cmake.tar.gz" \ + 783da74f132fd1fea91b8236d267efa4df5b91c5eec1dea0a87f0cf233748d99 + cmake_bindir="$cmake_destdir/bin" ;; + linux_x86) + # CMake does not provide 32-bit binaries. But pypi does at https://pypi.org/project/cmake/ + printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux x86" >&2 + downloadfile \ + https://files.pythonhosted.org/packages/11/6e/aeeddf2f5b16542b6a30ceab4896421e8705d8e9a9296dba79395db11b00/cmake-3.25.2-py2.py3-none-manylinux_2_17_i686.manylinux2014_i686.whl \ + "$tools_dir/dl/cmake.whl" \ + 715ef82e81b48db3e4c7744614c15ff361d53f6987fd70b1b66b0880595f2e2c + cmake_bindir="$cmake_destdir/bin" ;; + linux_arm64) + cmake_base="cmake-$cmake_majminpat_ver-linux-aarch64" + printf "%s\n\n" "-- Downloading cmake-$cmake_majminpat_ver for Linux ARM64" >&2 + downloadfile \ + "https://github.com/Kitware/CMake/releases/download/v$cmake_majminpat_ver/$cmake_base.tar.gz" \ + "$tools_dir/dl/cmake.tar.gz" \ + 9216ecf0449ade700e66e0def11eeaebf9fa7d4428c02f49cb59f11418d3f8a5 + cmake_bindir="$cmake_destdir/bin" ;; + esac +} +export_cmake_vars() { + case $BUILDHOST_ARCH in + darwin_*) + if command -v brew > /dev/null 2> /dev/null; then + cmake_bindir=$(brew --prefix cmake)/bin + else + cmake_bindir=$(command -v cmake) + cmake_bindir=$(dirname "$cmake_bindir") + fi + ;; + linux_x86_64) + cmake_bindir="$cmake_destdir/bin" ;; + linux_x86) + cmake_bindir="$cmake_destdir/bin" ;; + esac +} +have_correct_cmake=0 +if [ -x "$tools_dir/cmake-$cmake_majminpat_ver/bin/cmake" ]; then + # shellcheck disable=SC2016 + have_correct_cmake_VER=$("$tools_dir/cmake-$cmake_majminpat_ver/bin/cmake" --version | $DKMLSYS_AWK 'NR==1{print $NF}') + if [ "$have_correct_cmake_VER" = "$cmake_majminpat_ver" ]; then + have_correct_cmake=1 + fi +fi +if [ $have_correct_cmake -eq 0 ]; then + download_cmake +fi +# Handle tarball +if [ -e "$tools_dir/dl/cmake.tar.gz" ] && [ -n "$cmake_base" ]; then + rm -rf "$tools_dir/cmake-$cmake_majminpat_ver" + install -d "$cmake_destdir" + tar xCfz "$cmake_destdir" "$tools_dir/dl/cmake.tar.gz" + rm -f "$tools_dir/dl/cmake.tar.gz" + set +f + if [ -e "$cmake_destdir/$cmake_base/CMake.app" ]; then + mv "$cmake_destdir/$cmake_base/CMake.app/Contents"/* "$cmake_destdir/" + else + mv "$cmake_destdir/$cmake_base"/* "$cmake_destdir/" + fi + set -f +fi +# Handle Python wheel +if [ -e "$tools_dir/dl/cmake.whl" ]; then + rm -rf "$tools_dir/cmake-$cmake_majminpat_ver" + cd "$tools_dir/dl" + rm -rf cmake/data + # Don't want cmake/data/{aclocal,bash-completion,emacs,vim} + unzip -q cmake.whl 'cmake/data/bin/**' + unzip -q cmake.whl 'cmake/data/doc/**' + # Don't want cmake/data/share/cmake-$cmake_majmin_ver/Help + unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'include/**' + unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'Modules/**' + unzip -q cmake.whl "cmake/data/share/cmake-$cmake_majmin_ver/"'Templates/**' + rm -f cmake.whl + cd - + set +f + install -d "$cmake_destdir/share" "$cmake_destdir/doc" "$cmake_destdir/bin" + mv "$tools_dir/dl/cmake/data/bin"/* "$cmake_destdir/bin/" + rm -rf "$cmake_destdir/share/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/cmake" + mv "$tools_dir/dl/cmake/data/share/cmake-$cmake_majmin_ver" "$cmake_destdir/share/" + if [ -e "$tools_dir/dl/cmake/data/doc/cmake" ]; then # Windows wheel + mv "$tools_dir/dl/cmake/data/doc/cmake" "$cmake_destdir/doc/" + fi + if [ -e "$tools_dir/dl/cmake/data/doc/cmake-$cmake_majmin_ver" ]; then # Linux wheel + mv "$tools_dir/dl/cmake/data/doc/cmake-$cmake_majmin_ver" "$cmake_destdir/doc/" + fi + set -f + # other dirs: aclocal bash-completion emacs vim + rm -rf "$tools_dir/dl/cmake/data/share" + # be pedantic. if we don't know about a directory, it may be important. so error + # if some directory is non-empty + rmdir "$tools_dir/dl/cmake/data/bin" "$tools_dir/dl/cmake/data/doc" + rmdir "$tools_dir/dl/cmake/data" +fi + +# Put tools in PATH +export_cmake_vars +if [ -n "$cmake_bindir" ] && [ -d "$cmake_bindir" ]; then + tools_bin_dir=$(cd "$cmake_bindir" && pwd) + export PATH="$tools_bin_dir:$PATH" +else + echo "This platform is not supported. No cmake 3.25+ download logic has been added" >&2 + exit 1 +fi + +# Validate +"$cmake_bindir/cmake" --version > /dev/null + +# --- Run finder script --- + +cd "$PROJ_DIR" +"$cmake_bindir/cmake" \ + -D CMAKE_GENERATOR=Ninja -D CMAKE_MAKE_PROGRAM="$NINJA_EXE" \ + -D "DKTOOL_PWD:FILEPATH=$dk_pwd" \ + -D "DKTOOL_WORKDIR:FILEPATH=$tools_dir/work" -D "DKTOOL_CMDLINE:STRING=$*" \ + -P cmake/FindDkToolScripts.cmake diff --git a/dk.cmd b/dk.cmd new file mode 100644 index 00000000..a523c9d2 --- /dev/null +++ b/dk.cmd @@ -0,0 +1,183 @@ +@ECHO OFF + +REM ########################################################################## +REM # File: dktool/dk.cmd # +REM # # +REM # Copyright 2023 Diskuv, Inc. # +REM # # +REM # Licensed under the Apache License, Version 2.0 (the "License"); # +REM # you may not use this file except in compliance with the License. # +REM # You may obtain a copy of the License at # +REM # # +REM # http://www.apache.org/licenses/LICENSE-2.0 # +REM # # +REM # Unless required by applicable law or agreed to in writing, software # +REM # distributed under the License is distributed on an "AS IS" BASIS, # +REM # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # +REM # implied. See the License for the specific language governing # +REM # permissions and limitations under the License. # +REM # # +REM ########################################################################## + +REM Recommendation: Place this file in source control. +REM Auto-generated by `./dk dksdk.project.new` of dktool. + +REM The canonical way to run this script is: ./dk +REM That works in Powershell on Windows, and in Unix. Copy-and-paste works! + +SETLOCAL + +REM Coding guidelines +REM 1. Microsoft way of getting around PowerShell permissions: +REM https://github.com/microsoft/vcpkg/blob/71422c627264daedcbcd46f01f1ed0dcd8460f1b/bootstrap-vcpkg.bat +REM 2. Write goto downward please so code flow is top to bottom. + +SET DK_CMAKE_VER=3.25.3 +SET DK_NINJA_VER=1.11.1 +SET DK_BUILD_TYPE=Release +SET DK_SHARE=%LOCALAPPDATA%\Programs\DkSDK\dktool +SET DK_PROJ_DIR=%~dp0 +SET DK_PWD=%CD% + +REM -------------- CMAKE -------------- + +REM Find CMAKE.EXE +where.exe /q cmake.exe >NUL 2>NUL +IF %ERRORLEVEL% neq 0 ( + goto FindDownloadedCMake +) +FOR /F "tokens=* usebackq" %%F IN (`where.exe cmake.exe`) DO ( + SET "DK_CMAKE_EXE=%%F" +) + +REM Check if present at /cmake-VER/bin/cmake.exe +:FindDownloadedCMake +IF EXIST %DK_SHARE%\cmake-%DK_CMAKE_VER%-windows-x86_64\bin\cmake.exe ( + SET "DK_CMAKE_EXE=%DK_SHARE%\cmake-%DK_CMAKE_VER%-windows-x86_64\bin\cmake.exe" + GOTO ValidateCMake +) + +REM Download CMAKE.EXE +bitsadmin /transfer dktool-cmake /download /priority FOREGROUND ^ + "https://github.com/Kitware/CMake/releases/download/v%DK_CMAKE_VER%/cmake-%DK_CMAKE_VER%-windows-x86_64.zip" ^ + "%TEMP%\cmake-%DK_CMAKE_VER%-windows-x86_64.zip" +IF %ERRORLEVEL% equ 0 ( + GOTO UnzipCMakeZip +) +REM Try PowerShell 3+ instead +powershell -NoProfile -ExecutionPolicy Bypass -Command ^ + "Invoke-WebRequest https://github.com/Kitware/CMake/releases/download/v%DK_CMAKE_VER%/cmake-%DK_CMAKE_VER%-windows-x86_64.zip -OutFile '%TEMP%\cmake-%DK_CMAKE_VER%-windows-x86_64.zip'" +IF %ERRORLEVEL% neq 0 ( + echo. + echo.Could not download CMake %DK_CMAKE_VER%. Make sure that PowerShell is installed + echo.and has not been disabled by a corporate policy. + echo. + EXIT /b 1 +) + +REM Unzip CMAKE.EXE (use PowerShell; could download unzip.exe and sha256sum.exe as well in case corporate policy) +:UnzipCMakeZip +powershell -NoProfile -ExecutionPolicy Bypass -Command ^ + "Expand-Archive '%TEMP%\cmake-%DK_CMAKE_VER%-windows-x86_64.zip' -DestinationPath '%DK_SHARE%'" +IF %ERRORLEVEL% neq 0 ( + echo. + echo.Could not unzip CMake %DK_CMAKE_VER%. Make sure that PowerShell is installed + echo.and has not been disabled by a corporate policy. + echo. + EXIT /b 1 +) +SET "DK_CMAKE_EXE=%DK_SHARE%\cmake-%DK_CMAKE_VER%-windows-x86_64\bin\cmake.exe" + +REM Validate cmake.exe +:ValidateCMake +"%DK_CMAKE_EXE%" -version >NUL 2>NUL +if %ERRORLEVEL% neq 0 ( + echo. + echo.%DK_CMAKE_EXE% + echo.is not responding to the -version option. Make sure that + echo.CMake is installed correctly. + echo. + exit /b 1 +) + +REM -------------- NINJA -------------- + +REM Find NINJA.EXE +where.exe /q ninja.exe >NUL 2>NUL +IF %ERRORLEVEL% neq 0 ( + goto FindDownloadedNinja +) +FOR /F "tokens=* usebackq" %%F IN (`where.exe ninja.exe`) DO ( + SET "DK_NINJA_EXE=%%F" +) + +REM Check if present at /ninja-VER/bin/ninja.exe +:FindDownloadedNinja +IF EXIST %DK_SHARE%\ninja-%DK_NINJA_VER%-windows-x86_64\bin\ninja.exe ( + SET "DK_NINJA_EXE=%DK_SHARE%\ninja-%DK_NINJA_VER%-windows-x86_64\bin\ninja.exe" + GOTO ValidateNinja +) + +REM Download NINJA.EXE +bitsadmin /transfer dktool-ninja /download /priority FOREGROUND ^ + "https://github.com/ninja-build/ninja/releases/download/v%DK_NINJA_VER%/ninja-win.zip" ^ + "%TEMP%\ninja-%DK_NINJA_VER%-windows-x86_64.zip" +IF %ERRORLEVEL% equ 0 ( + GOTO UnzipNinjaZip +) +REM Try PowerShell 3+ instead +powershell -NoProfile -ExecutionPolicy Bypass -Command ^ + "Invoke-WebRequest https://github.com/ninja-build/ninja/releases/download/v%DK_NINJA_VER%/ninja-win.zip -OutFile '%TEMP%\ninja-%DK_NINJA_VER%-windows-x86_64.zip'" +IF %ERRORLEVEL% neq 0 ( + echo. + echo.Could not download Ninja %DK_NINJA_VER%. Make sure that PowerShell is installed + echo.and has not been disabled by a corporate policy. + echo. + EXIT /b 1 +) + +REM Unzip NINJA.EXE (use PowerShell; could download unzip.exe and sha256sum.exe as well in case corporate policy) +:UnzipNinjaZip +powershell -NoProfile -ExecutionPolicy Bypass -Command ^ + "Expand-Archive '%TEMP%\ninja-%DK_NINJA_VER%-windows-x86_64.zip' -DestinationPath '%DK_SHARE%\ninja-%DK_NINJA_VER%-windows-x86_64\bin'" +IF %ERRORLEVEL% neq 0 ( + echo. + echo.Could not unzip Ninja %DK_NINJA_VER%. Make sure that PowerShell is installed + echo.and has not been disabled by a corporate policy. + echo. + EXIT /b 1 +) +SET "DK_NINJA_EXE=%DK_SHARE%\ninja-%DK_NINJA_VER%-windows-x86_64\bin\ninja.exe" + +REM Validate ninja.exe +:ValidateNinja +"%DK_NINJA_EXE%" --version >NUL 2>NUL +if %ERRORLEVEL% neq 0 ( + echo. + echo.%DK_NINJA_EXE% + echo.is not responding to the --version option. Make sure that + echo.Ninja is installed correctly. + echo. + exit /b 1 +) + +REM -------------- DkML PATH --------- +REM We get "git-sh-setup: file not found" in Git for Windows because +REM Command Prompt has the "Path" environment variable, while PowerShell +REM and `with-dkml` use the PATH environment variable. Sadly both +REM can be present in Command Prompt at the same time. Git for Windows +REM (called by FetchContent in CMake) does not comport with what Command +REM Prompt is using. So we let Command Prompt be the source of truth by +REM removing any duplicated PATH twice and resetting to what Command Prompt +REM thinks the PATH is. + +SET _DK_PATH=%PATH% +SET PATH= +SET PATH= +SET PATH=%_DK_PATH% +SET _DK_PATH= + +REM -------------- Run finder -------------- + +cd /d %DK_PROJ_DIR% +"%DK_CMAKE_EXE%" -D CMAKE_GENERATOR=Ninja -D "CMAKE_MAKE_PROGRAM=%DK_NINJA_EXE%" -D "DKTOOL_PWD:FILEPATH=%DK_PWD%" -D "DKTOOL_WORKDIR:FILEPATH=%DK_SHARE%\work" -D "DKTOOL_CMDLINE:STRING=%*" -P cmake/FindDkToolScripts.cmake From dad9cfde1c096d19c707437d1ac99a82063bcdc6 Mon Sep 17 00:00:00 2001 From: Jonah Beckford <71855677+jonahbeckford@users.noreply.github.com> Date: Sun, 3 Sep 2023 14:02:43 -0700 Subject: [PATCH 02/14] Add DkML compilers to bring MSVC Ran: ./dk dkml.workflow.compilers CI GitHub Desktop OS Windows --- .../pc/setup-dkml-windows_x86.ps1 | Bin 0 -> 225340 bytes .../pc/setup-dkml-windows_x86_64.ps1 | Bin 0 -> 225274 bytes .gitattributes | 6 ++ .github/workflows/dkml.yml | 102 ++++++++++++++++++ .gitignore | 10 ++ ci/build-test.sh | 84 +++++++++++++++ 6 files changed, 202 insertions(+) create mode 100644 .ci/dkml-compilers/pc/setup-dkml-windows_x86.ps1 create mode 100644 .ci/dkml-compilers/pc/setup-dkml-windows_x86_64.ps1 create mode 100644 .github/workflows/dkml.yml create mode 100644 ci/build-test.sh diff --git a/.ci/dkml-compilers/pc/setup-dkml-windows_x86.ps1 b/.ci/dkml-compilers/pc/setup-dkml-windows_x86.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..7e4d696543175898969950cab437d42610e0daa3 GIT binary patch literal 225340 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%0Ao3cmi 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

lws^-qJ!3uaJ?vI)unw)*pV0NGFckR+ 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 I=3RZ}KkQBNwg3PC literal 0 HcmV?d00001 diff --git a/.ci/dkml-compilers/pc/setup-dkml-windows_x86_64.ps1 b/.ci/dkml-compilers/pc/setup-dkml-windows_x86_64.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..e9ef297cc4d0f56a77be70b73483a43506ef5efa GIT binary patch literal 225274 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

0tSVL@RU}zQn~E{h2D_ZO+3c>S zRqT4Ef#1`Pc4#;vl#b52?j+wW)t}4HG9N>&Xc?dLLGYPCcC62fL(dj83P^Ax^YFZR zH}!)|4o-MoYj+s$ch~+&cm4Ns(Y&P8ec=+b_!n^&{wmxBOnB>yCLVz;d~!xJ5mv}= zy1srrXUjC2F}f$J+2e`6Q#^<(W3cdt?;m>p+&W<~{oJ|7eBR1=`9kCQIp?OPNNZlO zEt5RKMk}Sthw=^LO~4;#a^+}Jgq@#KieRZ=kB9z7ieSlDI#ZJuUHi3GoNZz5*VkP2 z_Hkz^!b$s*C$=Xx52Tm-MIPlnZRoD|C7!QfrPpFUhn7q5KQcMLGdAkgnB9{iQ;jFyEcE5K)_-`n_+?L;a(_e8 z=qMJ+ORaP~<8Aeub~Lv-m|Wk`{rmc{gqWj_QC`AP@RMKHn} zB4S4s{doJ-Up30_*Z!*SL|7sYXe%f03)yI`<7ddhF(1yNdby4xPDFI)Fzp#LaTE4{ za{L&@EO_Q7Y++Xae0Z1ZXt$e7atX+|AuG+hc8@e)@wSK;oloYtpW~wuk!AML1jHJM z#8Jne_)_e&*vj1RxFjM_oKmv(Al}7@p}^-_osP{u>Fz#|XAFK(5zo2X#Y`i@#?1Py8WF4WyE&q@ca@Ec{cE@dZ#ZFK?DsmJ!UiU8 zyx&~=xz*3RMEa4#d&2Ia#>ILgmO5_9KBHe`+8MPf$A(Wp92Nd-<9q5Lavt#Fvt>cXz4%Oc=er8q;;@VA zlUWRT^0jD9u45n{Zvo*U`|TAFiP&|CJ`hA_g8M~0A@z<=yXdS8ouRqM9%vZ8jRJ6`W{YQZyB z8M1?T@)!+~cx}oCl;gppMYlF?ttazQ=Xz#Yx~oqiYl_)=aZ?h(nxhY6NNV<jyt z7_{IHVKufo=Evo`g{d*tZwvor;L?Iy(`8JzAAQZl>Khw9Bkl7_z7_(?@!->b8o7xLT6R{^phQf}X#uKz=2fxMl=dr=dOp&mwy!XoP**NwoBLNI*tbBfCzCF|P z^2En}fDa!fO=N4s@i9DJ(=(nMgT*~R7f^nw4+o&qCrp8=RyV+3K_+G_#>q8p4KJn){KGZS7fxRA%=s2`Rj+#gh;t+PtW39;>AoFbQw z{SvZtoEb(|A9ga(l7;+haS=W(bKu$G{kh;4P_TPETh4tr3`Q}cR1-VmKQYGOC)>M> z)Hym{@9ZD>j(O{h@FnY-dH$2+6o26Y@(6rBXhYxNG~9M{Q5fn(Vl2Xtrf80d@OGeqk0m#1O3=%8804(f<*VeciD>mmuY*=#^THz zaS43)usOydhJFv-6MQ{8x>`PQ*cfdIC1w=9fzEv|AeVpV#e1`L1u)^!MRiP$%SFv` z@;z9A$W3&VBd_-apZxY`TBUwlsU;geOrDhiOv@%m#uCguUBB0iN{u}~wzpsMY1l*| z8L=m@&}*u2*73Db98;gz5J-$CozF}Zk=Z0#fZQT;moaVWe^YB+-Wn7rqZ?O6TjCS< z^nA!>JaS8aqT0lQtPL%*9qDq;UAb=!H-yJ%Y5ATs$Q!SuHGXXLK{Om$1gDWLihKoU z^a#1&K`HhOB6reRvtW~a%=NY3NV-rL;oVNAe<^sxoZtig`(C3aW0)*M$BN0Fv&NZ_mlxa)xD#`@d#(ZfdYYPE^E=2 zvpBeqd*}hUcXpgLsEO@SuU31w@x)k9`3Pbp!C&*O#4+gBo!I*5Y4{nA-4u5}>o~gP zR^qwCID2NxeUd3K&Q}#u1G|X5Wv?1b5^N-L;A|=CG$FS z{k^ysPuBd7Wbzukuk+NLY$gAcRS@T)>lHdiWqV@wlaXXYHbcI4mZ>kC%Lj%?M7Y5i z*`7TwTjifL%KSVWm~0$8%kw|~4;b-_{7<=yd(r}tKZSK#S}u-3Fjl0@t|XXqBdKTc zuC68jw{B_q9#m-iCZ&xKI~3IZc(cP4Jc-88H<0Fu71emO;!g9xu@~K+HSo9~3I4F7 zg<~MzPj5dvpMO2>bJiX?IP~FS6^_H9U4L9$y&^g1y}$lgxL?-Jpr;?JYu<|=?%}Fd zK3N;=Z}C)4Ext$I!d^Gy=zDe(Ik`b^!*^4UiQ{SxXO@WO^?3uG3wHyBU%vNkjlQK3 z&$Ge}tQ9}2%2iw^6KQE;*d7~knCzSgdw zeb>QdRWL53E>_=@u1|Vz?>L`1$R8nEMn1={JO7Gvgn7j2aAScA{19u%BVnh-S7Z`k zL1JHD)qi1ak_luD0nHzD*kBbgPp9WRvxSEku}|+wdj=x9YpiZ{G7YK_EhXX#wH!Aj zqWDDpK{d;AJObzRu%qjpdiciqKiJ6V0>}Qz3&75!HQqPhh^E#j$rvHt{(L9V;Etdu zR=A^z@W9how4|r-%f~pR95b!TC^`G;j2JGByqG+{#NIY@a=9C4J7>nUgG!!D_Du3o zpe4{7rqr97YX07kygw^{|DHbI(zQF1{^z>dPxtigoW8v-4Bymq?{wFH z*Xf75`umRB{Z6=XLg|yP@2H@E_Mp-Q+B&$3GkWW4LH&z!x(|kMkJlMqUT}Y32I2cM zHrhC|Bi7O0+P_p;J+<^1*RRp%{L+Ki3HKEIxv*11}W&VA)(%`lt1r4r`RfM*&a8Ec~lZ*72PciFD+D zevh`dX{m@MRB}yi8^PtPyT>{2D2~3@$!sGJ>wS|AUEArTzikAxt?eb(BSnsJ4xQTC zA8Y@Fng~SwPK)wiN>aTcxMw?g_m2LpM~$_ z?jQ$W@16+x_m=M6>tKJWdv_$)sGfIUy}YgK5A>bCZ+0+%OaDk(V85k)&#C{{^=bT& zr}sN7-cbv1yr*wp3f3EX?)UnO)aJbJJNl&x-yO9$tG{pQ9wS6@Q_BH7!26D_q1}U% zP1|4go>ETirf4+%-V>H2`zMe4{8O=|=G}I)k^vmWhR7i9`N5t9H6~N=Y1AjK2@%~OL271`OB0s;~Q^bRqF=h)( z+;uU+rVRPU`hBKVZ0jeoL*vvWwpDNuS+P6%&Y39Y-(C-PZ?Xlk#PMdZ+VhGC-s#7x z_J3$UEHkPn@H93dwvMZyn75)|aDz%%7OurWT^C38!w${i;Z@?j^SQ6T-g^UUp8#it zfOTu9=rC}2|K?3u&$ISyf)|`MfoAa>{*$nTL*bjF^bZW`Y$1Q`W9@71ztE5W`oD+W z$$svfI=Id!S6i{I4@9de@~op8SQ$IU1IF4;7JbTk^Hq2PkCt6za~+&MoKKretX;K3 z=SOCH--}L_MeJ*Y2LO~jQ+@VXioD;C#DT;{T|>kxXO@Rg`y|=0Qu@2~-*+=je8Blu zV|#ZSYTuUFtq2{y+V7?F!6LY}l`l|Z!1J}_nMbco|4hsWYhx%fn(UTYG12_V@CH(B zYFD{7yd{Enj+1e7RsXqy))mEpu1JQaw`}ZoQsYPYt&6lF5|`raKWUDbUv~A<9u)GN z)smhI8Z5>OuGG9}w3fbFR7#nF!x38AdTsalf_oP_=}w&be@blj1Nj^967R@KT*cdM z$mOEm@pVZxzsu!o<4*N#4!JS$}@BV^kdS8<{^l=xdP{c|U*B%J@iq z@Gd1z>|N0}PJnp?k(JlKpI~5+1E4DWH!(mEig9)mNLafE@A+O2L`D zS;_e^KWd(Dih_%_O?}hynnu7oEbzfUJ;1(yJ+(=^^r5H_C+>d~HG&7@dTMjDJ(0fj ziYrJlBE>|-$rKBSSk=4w~xNuj#E6FPCm5w9L@M0q)?t|+z;*jJw&xvVa0Vi$um7{N+OSJ`GSBBQe7Buq7j8qn z&+pUPk9ni;X>)ABepthDcX$_ep0?PK=vCXc>{P~g!{$46Q++an8meIj``P}z)D9~S zD+?W8x9i_a?Odysb0N;?^qX_82@6*>bkAc?C0IM1J@+TIysTf>alp^z>IjTkrRt#G57)gOj|DbH@25_?xIG zGL0Ce_na9~jKZ>k{qdH^hHrOKbn?_=$V~~p73u+$bvr9NlrCl>IJKH>6Ayqw@u3)_+RCxrwG?ugHM=75~-d={f^Yj+{;#phwac$=z4YbU zAN4=dYEjA_uGOsZ)jUvt_q=i1Jh<#IxE~dZnuay6*WcUy%{!m{8e)si6|x%ci>lt& z4|sS>wgeV-`*?y-0j-kXQhT!qZDarAju48QF|@@-9vpL3kC){|yC92LviU4;>i z>+fZaa-NYQ4cU`RIl^!|)z#-|O-%!I*)lM$XZz>se{62RX&$_eVpr8NJ^YdSdVFUO zKQjB`T71UtX#G7O1029l%i=%0|B-BEcw-)VgjL?Q_4|I*a8wgWzv}#kQ?eJF?J$pZ zKd+URQ!glcuUiMTb%o>^;+aIDUkP7(0cCX7p2B~3Sr*~*P$kg$+vT&an;)ZIEUF8= zX45A|dKi0p9`67ZX^tBeLEh{n>GTY$JI-y>xFtht7(a|cV3w#pQu7cP5);Fs zhhrmSrhf(l{v7A6(zgizU<`NL{HKnHm3u-iJ3<+hsXt5n(6m2FJJ7n`pX1FtV|b5c z2`;+o!TS%IfA$vQbX2SF;HB2R7#TT>^K(#WVfX?~;J?6c_u<{K@fc|t{c7Pnp9O`i zW$(*-T|VK&E+ji&uCK!1%bL6A%8wxXl#!$D$t6ub@>tZjjJM5Wb^TU6vxsfQ^TR8O znJ2!JQ~PzDbi)e!t=bV=aU8FI$|-o;+8LXut)YV(=GC`{u~%lz)fvqRvq`qjyjBNq z+2S2$rcjDIaZ-x@T;V3CTu>xFham(_TCIa)14?|(!yQAh-`XchbL@B1P>pU+zrRzg z#BVN*UgNX2eyNz+vYu1aBgQzjt-AOM#Bxnl_=p{P-1Aza^ZFe@i`FccbZxJkWO4pH zw(WfLi|vPg@m3^;`lM3*^PvK!zoYSv& zVmS59d&9?OHpwfjtg+L1=s=(TVb`ENBA%Jw<8IMs9-8zkbCr?Mkf^cZzzXkn3i`zu z@>xBlwe^-}{7rrOgd*n=ISX*7JL$*yZ1Tyu_qv{XL%(D${=PdA$jQOq=|5lRbm2M8 z@B>*hJjGeV-*v6wC{854t-trWHk^ulqk{=l&KAC*zxVar@ARGXjhr*&6ghCt>3{4h z&QtnaIcE|%D^BbIsAu)_j@p6^Pjm8-^We1L1S2OGf8SvSMm+bXTD>ip<2HHFES;x! zoHg-O&TEOX^FihL$68gyZ+|1XHn08-ZW&uGfw{e*MJ3yO&yV%Lh#XG#A<;r-GK7q= zEV2g@IZv+FUsg|mE4SvHO?K&Bx8QAY$k-@``LaC!r@8JLZR^GkN`odyDZoAq8HWfLtSW?(cSb@Zc-qEvElc0VC z*4gWN0*mVRx<;)DY(>25cLWDpk@^?dd{mLZ;^Q9Hoa=szq}#_(469C%WR0~?QO z9P`;@zgT&B4o-0Gn0@q%mDfLu8JWFp%d(E!<+%esp+W9cp6Q&|n(D`i(~cb;^!u`( z%acbbcJCe8p`2)Dx$Ze~tjBt#9lsm$UUuc%6JN%|r){f_o%ied_46X{kGc@-@&-(F z)+d67%@2Oqe6hpjlXTQSB5qGcAv?+G32I6GUD7yOY)KOQU2@6q071G0Oezedx^qN{ z@j~L9o-0`3pW>SutIkJAxp(~lTEBXVT~ z=t)HGxiUCwN)d-4GUiIE)MMeCbUfvEOt^wH`xvgL5N{S`FS;Dv8F5jfFHxEw)aTz{ z(U2%jNdtRR;O@NAoc@fCt9h)woqHR6L5t|03QIsMb!$9Hgc17l7I@Q&3=UUE2nd@x zkI>2?pcj6<8rc6~2a0dy*{Ie@f#hFNvD=wf>~Yp@^K(@x>wR|2X+tn?Y37;3K2&Bq zy>&Xy{M#319Z&_FYKAYm@rA_~pY;mQWs9l6?9?Mk)f?Lwd9Rd}4|ksF&Q|iim=uwx zG9~m5JmPa6-e|RhM*Luhp@ZgoOCFX<3tEiWa>QK4d!E{}>ig}}Wu9leGP1AZ{cmkJ z>D1lqlWs$}Bp8Xq{?J%4^^77JSu0SZMG@%B8KLWvU7XLqs_$)m#*_V1R6{U#wPKO1 z@F^0M9HN)6xC9SBRZpxKtP|{)JZoeBpqf>ZBcbomJpWfxitJVEIok8Su3xYHYH<8J zT`#0hIM*|)Mfx1|d>A&7_h?BE-eNqd@+oyUH_6FuS6($+Hg z16ykS)!-NwAy4ez1Mr=MLWEj?M~cT34J44}np-2TpDx-;l3Z zI=RJf%Ol?TXZc*dtIydlPt-oWmv3mjMSCJ|&U}N?miKTq|KUHNbpop)o*e3fIcARf zlsWTC-ZH9quU^eN*zHO8Aoau2=~LEzktxXvN}~yl!KzH&4*d@CL{vGMevSQJ_8m1) zUB{Gq)I_4#%OsLTtyOmY@Z#8iWH0dzQIu;$qS(!RtK$)N2j5ZKZPAN$i*8OcyRC0< z1=cRvyo{YU!mvI!WGxX>BPtK{_FT5F;y+^(;7{>hF3y0kUhJR2yVmf*Yb`98VSJ`> z9`iG-hj%=%*R5F$&CVFY>rXy*T4#Ul^e(fEOtoyrTSyoM)&8ohwd@KGAo5VkC+0sm*7=P{ z9NJ?~J0BFAku?DSwAXBmqOZ}ADSh5QFS_-gJt{5di7obfT@1t4XofZI(7p<56M0Hb z*KCWB{Fr}}Pjy{q=i#9ZStpTK#wT*snjR|#xNu>->k~~%%`|Et-IOoFH|hwSl08h0 z4je#~iZ`FF%kpvLyKZ%Puodq#h*l}mVdym!_Z=A!ty4qbRJU^9Wve0Cz&h$%sGGXF zE6Si@p^x8x(C39ZR>FHB9!a*^?x`W?>zRH(7S;VOOROGNXZWD?lT%5nrtbpu-%AC5*@(4aBPnJcS|z3$+L4?GiHv3Uw1obHN^K1c%L@dF}DQ= zE0Oo3#I;W}7g+Uv<4F$TcE@SgWM|&ix}feIC-AA0LWPP?)aUtwHS)Qjv8IR&VrOHw z^Nvd9JF?};g$Tbt*KOpzT@?-yePDEqe+-h(kLCI{-Z&eQ7JiGE1J}^9r>XECXkA8Io;N z^TyxQE@mp-H9TrnUJ<9dwkLPv1R=KN{Z5-dIfz4zNl9~3y~@r@Bbd``DLh+m#2Tqv z&ek16Ed#r@wqnKm3}qYR%UwM3wqhHt_Qb>7zRV)s&@4JaSI#b8iT8`J?vqb>L;QMC z-;=EtmC=zq$TL1`Pto#fST^OnMC(O(Y4(l*vW;q}#A~Sw3w?+YX28yU7pYW-`3i@-$fMjs_M~-xa1e23~l(_*5|f3VpiUA zj3Pcc&5AEq)2bZZd>IP?GoOXTU*QEFjr!3?eD=8w%12-MDvK6FpRqC*y-(d%D$MRl z7O+~GkH1QjztHRns4vX2gdj)ZQAGZem3XV{hPNv zx}%Pxk9A<*?zK$~pu8)p%uj(_BhSZy5u-$oSjxtnM*PfH<=47@Ptlh+wZ$$ux)H0e zMXeZb%I}GtTW0x;q$H6Xw1B18kCJ&m>HpA2w%>l#_hiG71$VA%fi*}ZEc8SD-WAq5 zaUAcB(xc&HFP}LWr$@uC$rI^7@|ZoMl&Q?Q3dZ_3%h&fpi}Xj> zf>hcTA;0obVac~W)=QclK2sFEdeZS7Qd5@5&?kV9)rK(T${AcyLMXfq?|^qXIiJZ!RJhocqq_?ECYp@pCSwbeaVGPBVQ>1cv`47Wc z8!f6LOFgpp^a(9nGU>xEZh?gi<<4kT!2_Hdf2`*N!s~)iN{70gPsRr&U3nEQcSTLh z&k{o7maY@Vp?>}S#(4AI8>(y@!` zST#Dq*&nUkt9 zWcJXyoNpHvyn%U7e@}~3u+LcotRmjjY}+t2dYU=xbMGj!8r`nl#yiV= zb$f0(k8F0HPuXASS*RWD%?Y*_iKt^)m2m#n?JSe=eqLVxQ^|>kvOwNdyq}rH@5jrc zrZ%H=u0_Zvutt8yXXxF!7c_i(^l1cmZuR`;t7kaFEzj$R7jxOaxYWq`E_6eDa*q`| zpEL>2o4gMw;(eQtL#_(PoWye_)#?^rm0<8=u{M%yZfPRqWcfygd9+ZzdeaQ8iZ%-D z(#RLrN?YO*cG=LYv-MN-xJ*4|ZG2ksV(&-K$5UlRmRz$BWrGLqC3mrwStnyFE?)@& zB|dYh+UGHRfKqaf!K!5x7At4w(8}Psh=juKU!<=-RTk;3mWP&qWBo^E*=>g7P!JNPg}IO5CkV5~8z)chb+yaC>UIFPyPm^O<~&k)q9xZI_;z0HTk0F@fDB^x5y$6Y zv61y@+v0?_9*cE_jsKlSg4HoTqQoyrmbLl|$hGV`tfpkOxB3Yk8U4lg{8@Bo>BY_~ z^{#5x>a1s5yB~GB6&j^n+D~C0OH@<6VxiA7P6%iJu&6lJ>2bT0EQ2IM4FCAv|`453A>?{tv#2 z`<4VRI)1`B%vW=Mf^%Q~CjMmUDS;a!iKxKg-m^`X{#>+Rl%KDM2>4duE2ia)?i;fL6puZsh{8O2Lk}*$e%B z*Eola9nIQ>c0{(IYpnkr!RP%x%pjDyqIrouUSCbr4C(NsX(?@V z?Z`s|dwTUg*L)eTMDx&pdF@=s$m!qFOh)@swrx5o^|~_gsZnxQpRP^fdL?%?iZ|p1 zu#dvo4*sWh2z5z*r@z#Iqw2`-b)T~r)F*jM@xtv+3#YojL^*A%d?_Au6v?Nr$aUgm z<*fTTgMZe5jR8 zE={}v_?B|Wu85O4t>rffM-DCge_q&GJ`AmaPc*(oBmo@Dcr6=Z-N#yGy%7gwwFYgl z0^lm2P(lYLUiYplt0Aq0q*<9;cE)|e2APa~V2QJ@IT;$$HT5l)_MWY;Q3-j^THSWwFdYPW`-Zn&4 zcDCpHsasx>6e5;@H53}b)^9C|>X!5M$5S=N{di3)iuFMFlwK;_jTGpgRQ9vmdY%XY zE2lh35+h^J9;-LFn_Q4nTEE0lY-Lf$+M3;&BK@~51gtGR7gC)6IbDuKCH5YcIfargt7jsyj2=w@1YyzA0uSTNwh{MP-9b1P5hErvM_ zO1H+!-b>hXj+&MnSe|9#3Hl4!&2DU*W4f;0nhQGfkaCt&jt=dhiL-j_gF+$im!Lg) zi{TwfR>#V$alGrpPM2v%9X+a-4Oi4{)!D@h1|HfWrxh8+oFs|78FH+_qVDaK+HdIB zS}T8o$OyaEtRZ;o{@TCmx%Z`gFY42ofR0!C{ab`KJ6?hP9(_F`V&};qHiZ9fb-}Aj6qEck-Lcv?= zh4XJzx`6{YRY4XyRh^x~?sF)A(Gz`0T#0@dhjTH(CUJ=~U}`QSFW#%qJY=5o87BM} zsKA`nyv23+v*rSx&NG4jMbxt24qlF#%(=keQeE+RHC)QY*HU1UT#BaIb<^hau%`eQH* zq0X6FjGJcj&OeD;=i#8)_{Nw^ehbU$j%I)iIA_bnvvE#kj1KWEa8D}=kSG8ZKkwFQ zJj0d0=og6qH@>c@1s3vb?1S3*T4Bbqj)zw9uJk@yz`l#49FCJA&zWV*N!Io3nMgX1 zR<>~Rh@P(`h=-9B_@|5r*-*|?+cub;^){~_ELYC7xoL~wl;gFb8Jle%1V{7qkR?=V zGJG>Qg_E_!XV7K%b=a`sebqHc%u{uyF_l_sjKSwtr;n*>gV*|@u9y##v=6HU&51^% z@7Qm%KC`Wegre`za^Y9P-Nd8H%tJ=fs_06*4rzS9iS6AE`r&p%@*ZPM_9Xk1nLU>| zE#vInp6nP-%#i1jPKuY%(@DG5(+{gzN|3Ke&UB?5`Y+={5$JT;A#rz<7 ziH^7WYma8w!*Whvoe_#{R(tjH`&3Xo{EH+lu|iUoe#$;TBZD8&S)VP)v-#6=EeSaO zWbl=->Wdv|-G?@}548pEWW4frt6#-@AKBs?hKF*gZ?cLWs-w+!E5X z#JHYG{o>u4pE0oRZY5qr$%GqCZK@hx!U z$>d80$HeDse{xvs13BQtXKf1&?Trju8O%1Vtmkd19^SqH$HXr_Ta#<*@hm{cYT0Qk z^BRZOXXH};AnEBh8E=b5N9{46ZT_da4-y1T;|lL&qT2e+Jr(?>pBmT0gRuqZcq%*d z0qYyJA*RS*>KI{FC!Z;x&h9g{DSNb@z9-1$uE3z(Uuw(!);P;2HU+noCW-%Zo}JD6 zEnWmd4rQaG(zs_k-`yH&8Ow-u7`6wzjP+8tny;@}Pt~KePJp`|2WjWGM|MoVHQ5|U zPfkSjb8o}zbo7qO1Yy>{oNp@WGEkxeqIPhh{$ zeA6?M(RIl2RM~lsdb9(02n*U>6AWz7$biNkaCQMWEP_>3m7A{W<#E-Kv(-LS7nS;| z)M&u3Y0c1ltAdD!_sd%_hBe{Pia(k*tj~Cx7wdhHbT+(xe*QDzuIT+oSsy#{5S*`b z^T3kh#2WiOmebJ(HdA^7d)RCFIddq;x^H_4%x2^mvqG^?z1xZ0VkIJn90$!KRK9*% zbB$HU{seY?cp;pUb*`SR!GMd`$Da84jyIB(;W5qUPn5MJ=>2f^zek!d@<^aoY4t}f zhg6Zl*#0Pw4coGwEqwBRT%{#j(J0Y>%qhxw}|ny z=HnMhQtxE8c%@#eCtZ>xIWsO(`r~eMAMnN@#cHe9e;eL%q~o`-q%Y=vs(UqWH?1OsNe%WFCWruNi2k)01Mzl?` zSxzak0Kdcz<1agg$Q`6my<@njCOUb$h_x?Q+e{HLIgYr*&t-YmV~z-2j6JQKI$ly! zZ@r6DwC(G#E^A9aywEc10B5(KPq<7A>oKKn+ckf5Q>k;J;1JfFF`xo{2Jf6HgW8%b?=kSci z#mf5nRVE$z$B`M&?ku~Qx76ZB_rG)EOpmQ%q`=+j=6(2GijKpPWx-xe>;d~NMMy7p zRs9A-vJre1o>OV$fKp?WnPbnDHy*-q@E1FxoSX6}`1??2*U0sIpncTyf@tpGT-iIC zp^aD1#=d&ZulcE_I8T{VFz496Yt%8nrc&B#7|tEZWu>d8e5mo=6|4&yPwYmS`uufO zcHVS#PCtwUdje{bKa@@hpZbb%#V2Ec*FWhv z4k}WEgsVAUJkb-u7rZ-#6?dcCADxFk3?FHjPK@|G3f!Kbxb*oEvga*x@np>{A>oi< zWCM`pMvhh9I-d{vbf&|W`e64k@)?}7!yazvV81UmdMYVVLn-+ymtOUZw<07t)s59X z;SrP_+R5xo)FE34ZDDBd9q@C?Ad0mxdrxo7f`G;~opU?KXY->kW}$>OyKVkN%+T~! zQi!vSz4iRY22TJUjufsnsc6lC#TvuMt)AYhuR;RGa=EGNz?90_ohne zrzO!jF-Z1D%F^AG9L-M>;sKqO7KkVF8LFRznjUF_jHTxD1DwvvA@g*NAC?XhcwXFq z!7p=n=^&O4%!H-qnlpXK3hRg@>EkpOHW_}G^XI7Q00eStY-_a7CSpVS6l8AQfKOjX zvOmjP`#3wvN&9r7U>;2wH1ufjE6CE}1Wm$^DnZv3nfg6i^W17d+5s0CCR6U9_9Fq0dnOJ`r&?i4oW(}O}pY+AV2E( z#yN`6npj^OMzS@NrHY>7qz#dI+wj;rJ~cxvm>pS6SgGc2aiT8Tfg)0W`fs>TqNtKzf+ZCGX!Ovf48go z&h6`dfA!OO|G`!9$vybshG6JEvzse1iD5?iYMt>8-M^p=&qoH-m&&x&6Y3|AIp*O=N;->ENb?tA+0 zS;u|ofzoS>(}Zw4{8rl2zkMaggA-C-<6mFRvTbv8)?Wpo--plN;1z?Jy?WRB3rUTY zOTHv|&Oig}Gu?SF-cZcyj;KIzK#mXma8or!ct2czpS8@0fC+rpK}?kz(15P;$rHgb zX+9VU+0gJTrxq-4z?J7yc5<}jWIy+aMg^1{ALC3c&@gJx&1Wxnr7NyzMAV;yo384= ztNQ<)c6LKAZD|C~ zEGNH{{ghU|Xw+wgZ-{2V+pZ%PZLAfX`)$d{*x@obI;SSIB@%+1+&_@<>7=&hF!n9$ z0n5lz8`=gRFybMbDzr};4YtgcgOOR6JW?fbaEfP<*`|SayYs#_^xTfP0-4TSGbZXL zn4iGgvL3$YZ9beb#Jb^0>ZS*+a+rQE8Fgu}Z`$*dWJ-)0dNOjih}@<-*)u@@@E1IS6_4GggS0Ql!FsKj0j9!6}Dv+ zwK9MWxvY^8y~a$1EeXDs9C*0Md+OymhKBv@eC)fT41DA>h&<`jk_k8OAaD-UR&UZ+ zzC%tk^Xf4f!_ra-49nR$qn>SZ2gdYX)}!-#A?dkAXVy|Tz$ljiwz|={4?7uBpS6q8x&A;vh%xa!Vu+^KOVJA6XS5GHSqcTQ zg=+a)W6gQ*gOe|^G28F%1UB-tMX$OIJRBJrtIJbkS>j{d)*tQaj&YVO2u*~=eZQ+z zyU55}JdsvQ@Z%p2R&a1|z6NaHw)G&KmUCOJdBR%`xJm2KDz{{ltv`k4A39xJWJx^7nHA(?tZ27F|Ha-#DH)?(NQ)$YhjI);QX6thiufFK ztn0;QCPrD$%!bBD)XBR(SaUlXQ@nGLr;%O6PSBH_(Edu_h@)T=py69pZDzIE(=JD< z6IAZyl_&DYMw!p&sRBdfYr=3-8hL(NI(-*)_l zokidI2)Glr_w@taiWimU1pEKifxX^-g6FZ8@RhJa`^>W^c|M2 zPd5fW-cQW;r~URcA`kWup#44dp4uiGgvcMg!Ev#V=3TlPrwe*6^evGu*Eb8_JUpc>%N|c!g4CgfrsqpNvn zr&}SjXVCM;8o-K&O0K-so=N6_*+ovk6=_c36Fj(YyMCcc-=Ev)+Og_+4$qKiFSJdZ z;fx%lt@#GY>*r%N1Dp7<;~?}}p1YH_a!I9 zN<;qaX7UKn7k=hl0Z)`Ekk3T2240(EX6^6C?ACQh?CFP(5?q^GIEzSVtg(QBCza$Y z_F4K?zAFHYF?-jX8MrBGJXQ}8pK*L8hm2fC8kVa(aYD!lG=e>zVXwS|n|P?)E6yd{ z6|G(L0^DTYwO7xMwe1|_F4j@xo{~L+9Kn7d_C`CNg>T?dGEk^L5Y|nOQyY(<|KgTY z4%<33(HgsReksI^VzGqpdDsK zCg}5Ue?6<^T;;ZoqYaDCRm7UmlxgmA+QrCY)U|&Q{>(CMN&5F*Xrl3P`arYjNNmEk zQckHpuGAd3E@|!R=U5YYjkFY9b8I%G^?Z_XHjcK@at!mcU@@QZS)Hdz zxhr_Nwk?w_S=#x5*M{I;kep0!|0(&N96;laHm0g5UTED5^&HT)|0M})8!X|*^$XH2 zuD#;7hvTyn!DSaOue6t2Dc1jvH}|D>PWOB)p?|#FK~$W50oyn)g=4E-&~CZX-Sd{O z`=}ZgoY=ypFS7%?+Dw@Eypp zBVqNjij!CyVd+P!Sa0)3)%s&cvgUp)Tv&Rqr{%qtcn?JyLn_wzwR<&%SObYBXdJ5I zJYV~bd`0%oc%Kf{S+)>$(#ha{@pMNC>hO<}Z;a7I<*|*lWHNZTWEC-3Lki)%;+Wf0&G8OSh)?d#Z>6wz67OSa**i5)mELRMpW7fgL|YTLvp$kfGHh3r9_)r> z*sX3qs4vUfG9>o@z%}g~5>dxrh#WlLpiAVQoy;?xu5*?md!;S7In86-p>>M%E>&mb$H9a#O5yw6cT-Ta}!&wav8^EKXIl{vrVP-TC&L5HX#>`MxlHZ{XD?dv){;A(IGo=Imqfg9 zQ!x-67%8fU2NyG`K>#BnxfI-loedf*%`EDWIBXJ z+2`J|2zAUt$bitPhLZf4F~6nXBbEm(Vn>?)86)x5lovHGb^7o6cILg6mL?jcJH_ z`KgUo`&#?`9QNB`IQ19HX?S;bKFev0kAIRx|NdadHsmaChrHSC(2|>V{8Bde1!ILE z7h^9j_b$kFVwZnk<6xhS3UQ9Wgj~wkLT#ft`|N{mw>d_?qp`C;y{oJ2P+ylfx1;(N z7rMOnB=_d?>1OTiFSaTdr$Fvw9j5h3_F4`z-ox24i}#fKHj8uNQSF|^@y%CJYkiLK z@hPoJ$I&+R>8MURJr!3{6vy%K6nl#&j;aYZRQm!s^1kF7)lRPIf5VRaBB~p%%Zs?K zzvM#S(&r_8Cs&2|I<@)NB@bxJnV0ngDBL06h0_XtkJc5nzE;>K^n6v89hvyVhS_zz z+ht->ACWvqsDt1A^}!QhLp{?wx-uS1_9%`L1(+`muqjML90H8 zG3uw%$`23ZWIAtI&uEPIhGL|bHOjC$k)J1Jr2A`s>$sNK${P)?jWO=7{kh{_>bNlQ`N5dA&A)s}_%sG}wnwmK{C>n>{F z*Sl#a|9xpKGO8}hW+lsqQ)R^ES6w5gQQzw#dw7%1wH=z@9gWa$MIb_XQs$IcGSSP( z+KD%_46oIQ&_tfxo<@63yWS^v#QXB0?~O>O{)l&_<9ANni19ednj&A@^Um2P>etS@ znu8K}YOWX+(u^9t#EVbr8uuy~rchXJv)9EiZB9mHBA0x#s6rj6NAkR=>w^Rt)A6%; zhc_KvkzI3J8UpFE>R!S)rPBF^zKqRR-(nn*N#`(${qZ|^<=YyVg zyII59m|Az7RZo&?jCMSA>($#T{!yt%Ejr%);K=dvIPbdrs}Ej9oKH6OathU&kyrrr z^r%a@80Y2mskJ0g1L`JxbfPValDAUq-nCn!3Oa9b_s(+i5kiucYqg|U=+514um0*k z6s3-;Ma$KcX0n{;_qTs}FxANp8u0v{mXXeTCi|o{L58@w%GV?|{XVK!A(o!(EIHfzB<_}sjhyrBoUw3~ z?%@?NMhBnbf<~MoJt?c9riyDb`Aie1v!DqPulZ@>Tq~b@B7+5r5Z^kP6k)$-%x*3@ zf^!2W$9gX3eqWXaC)ucSH?|jDj(AsckP~h>W`8*P|JfQp0oOr$=H{5m^dHG`;feo(U(OY87D5uleWAeqwFKeAMaDFy7Y-r zBXh|Hxi8&}9mgs3;qm4fg4nWTP@j~M#!d>E$W*{Y|580VHtx4Wy&e}XF zBaSzo4v+A1Cu3G$g9Nwo{yuCb<_>Gp+Oj20V}+9CiG{@6VMSYGo)no%{mG}ze8(8y zO-Y^A&u)zQ^Jtj27n;FgzVxV=txq&>CuP04-ubX5aDE$x}X{k=Q>)Wzz;qdBlw}W zu0N1uTJ;lRUuqTfHTDPM{#Dn{U&?|q|JTy!1KCdI{neJJypNl6d0&bD{T}vGvt90d zlN(*O<<82-3y?$oHGuqC^)-NhjNidYR;n`9{Deo0bw|9Os(!1@RsSWPB5srF%8;$U z+35-1)zcp1AGKnL>ZBSoRD7HT=n@IvQAEl zWfJyP+sBPjoCFV-k;F;8p}H`Phn12?l~$X>zLA7@EQ^ck$W&%RBJ^$Hk0cSU%KGBX z($r-__N}^2OcefMLxK}=zr6C2o3nfUbKIQ4TlJIL?YPfLi1HY7ztPKYY^b%rN3kdF z$D>;P>MxIFOSY`ZtHOQtt;olcN_{JmT579qMUn^cq_gGwek|Dz*E&0X)qU}N6d!ed zdA%O;v7Cg6Pd=huaToPhOFt_g(QcP{z1sSl5k2c7anucHXBIG~n_WbXiU22No;YPj zotoARaaN29HLE{2jN)(Fi}V`}`n<+S{;Zuxsw1!dXkIjDXvxQFRs^e${Aj5-cKWl?8dx8&(IEa8eL>Wr?=UK9A5PZQa*C~ zB*c=?Ij&niJfn;dZ-pol`p56VI63oN*JUqdcRsh{Z}^BxHO`ES8u>q0b@?=(DJy7r z4pT1BNtrjQgW>t#>q+`FV^jts3b5)q6=|;66?-Ckb$F)OU%DoH^`y*`--N>382UR- zX{KDg^Qvs5Rkx1vxgz7tBO9{F+anB}a1!S*vX~YfamoT({VZqZm>T_Fi>}<(T9N2H zuSVBoTmAVY6PA7V%`R?1zCQa#?XlT^bd^E!^4Tj|^%3%hnUSJQgyPd4Gp(u2r9xXVPhm#(Q=BG2N6#!*=w3-D;193;$cbew~hEMf+u5CaiYg>t^WInM2V9< z7rH&2|2Q#H<*QCd_up_6>y5X=Qdjb1%$IYnhvmMru1|`@_d8XHU_6kWgj^)+iP)w0 zPT9{II=>zB$5}ew_lcfMRbn{f>)loMyy8UV$(Up4fQL*j<(|gxx10>gQ?vwLvU4cO zmLe$(^>ay7R~jE0A=U0~$#Zs1=aVrqc5HYL5|(u9&8oq@?9uQ}BrNLHf5&QA zYVpRcy>9NFXm@64?&1wxk)^omZ;FT!z7$VJHfb8=-a+JQXtbY+M(aPHeyf+$aXJ{PE#mN{68uD+wnLr!&@99 zKJKx+zVh>eCtI&=Jl6{=k2%rG7qWx<*b|}rM3(PrOV{yt7oVgz7UN&vf8}wt@*(gZ zFTV1&RzDZQBcjGzpSu_dwUkz!yO@*M6OT8h^iP9&W-P79bNjHfXIDL^&-3GYE$taP z301wqtJsqiquyFQlJG64p-7Fj)#f)th)dAopd_( zVLw-g_r_x*uKM{eDzze&>NP<9Rb=WLO8(9hJ`SmS41_c)ahr(USQdtX2MYg@WT#_D=! zo!{!7#53eSS1McYqCo7S?&{hF?Z;j3tjGVo_P_MqKgbudKU`0IPv7E{M4Y-IYu3Bi zn`^JB=Wn%t8&_Oio&ASXYe4;}`^$fix>f(Vdhw~BU9Asx1$oN_@sX?gkN5h5F()s0 z^F{1v@2__s|SfStmY0 z&2{$LA9eM1h^Mk={ZiNXBzuDsVh{A`Q*YRTt$B*E#3vcLk2)A{ue~$cBJ77~S$|@8 znFj;=nEUn^;D}s1g(ZOfH(Rp>FVqkT9^4|5(> zK_7_rZ~$`w^}m-*=g|Zfrv@#`z_TUH!B{(cSw+C@4WiVF-q6Z>WP2WkMT0JzX+lsv@u=RSnwXwENy9&oOOHLt)ux? z&|}SaJ=-;$`u^C;oVCspXPmC+wZ8UwHy_MVIj*t(a(K+q=bd#x^tP^vf!{*j<&K`R z-*i^}{AJ=ki6+x)^od1y)L!A=@sZ|sr+faQqiJp5auq&{0c#Wm}f^pF?Jyw9)qUZhN%-=T72i$Mkl4++!_HA_c}QfHnojTC6q&j%IzV&PrZ} z)xjPDI|}IcmX5~?SR~&6x_t1rn~-XWPCN;Zav8P@){pT78Zb|HupNVYO%ZJBd-MJX z_U>-#UcATnqI~#gdU|O5_0CY*m2~9ksJlWfn%5R$K1bfytYewSxu-c4aZ7tv`I!2c zPQS-FjNyEHp78wp9sk^U6@9(0|2Q$crF^w5#TmBrMzP;?D}xviyKtODC4R=|OMMy( zBC?T@(ciseuMQiVs>1N0cl6TpMDEz>VxN$hE%51yJyKVW@}1x6x?{8KE3WHoCB55f z-_Unr$Ne0VEx}+7dgU;VU#|h_MR$$Sy2tV@ec_!sR=cnD_PsoyE%oOb4#cF(Q9IJf z`22P@$DQF4a5EgLlzHdS`2;)Nv%CxKSr^T`s3;>DgjDorCL&|ldEHy0aoqQNW1$c4 zwcG0UNuPI-em_y}Ef|ZyCB}z)3>^{>@z?LZ8pREc*ey-nN4{{WH zNBccab5hDy()a7KSjQ1mum&d+WPKS7|lm|{G`O6si(3#^)i&9oNO3AtUR`VWNS62=s{Qta_J4}t3 zdrJtixjpCqqQg(L7E9ayN}Aoghh9sWiyRl*m-(jq{GveJd;2nR>)nY%LP!B4)`M zxAmS?O#HrX1Uo%r);oOIyb|a8ETi3c}VOoaE$y@zsCigSB{JF5!FngybDXqT}} zv-xo-V^(O;#dev0SM4&_vJUH!XgInTjk7GQ4T;kf=*)-_ZYno>cdgYVj{7T}(}!khadwvX2tyetojd_6inDdBS(GlRxuGuf!?&oYk7^=aAU5<{azng*dT= zci_*xh`mr-oV`p*D5@i`Nx9yQonC^J$rBGi-VmeKGCS`>TC)M zJbAj4GW&{nfTPbh)_c>l@lUy4HBRKQpg=!@2JN+r^_6cR`yED4msO- zw)3{T{x&sEc7UjS^i-eeEw9^Z#Tid5 zW9Idq{_@;6q7~o!n3AP~RL=8k{=Iwdf#m!7ZZ5tTgiU38yrZ*oK>;#*)-?;qH3sa= zC(5AV@58k*3^zKPlxG(iGx<|UOels$MTHXHPgYlL2XHw0Q9*KbMNrn?|{7gBKsmI94%AvyE z?sj>9RP1NB+oxf##ui~ZrMaVs&?&_-{#)xmPHu8mkQ0OTb*wV(+*Ul3DlTO!*X5*M z3l(LMLHX%UB$>0%d_J1*KHphm1e|NK1Z((yivV}}n7Qw|MUIQ(42Q#L7N;?i!~QIS z5%YR9-GMwuhFAh^N#1Za82ndPU$k*fIs&SU>xr`Z4H6_y2IDn5`sJ(XelILD)JjqCck5Y89zjA`F zIcF8Ch^P4GlWSg6%i)#C-8fm?Qe&O?h55fB4No-vnIt39m8d#;$Cc*Luy1Sr5;wfB znddz{*g9v{cvB6zO+2x$t4L!s)qbawnZ?;W2^Pd$sS-pa9cyk~mQ2zcb=9G^)zGqU z!0{77O1oT1ciz$%=!4w^tT%KF-y&N#jhSki++kmUvEhFZDaRUmq3>ifURNLAbUP=J zWne4()IkOqRm6yD!ljqh?{jGe){A#qo_0EOT@vVlU~F|%bNm0ly>soU>WIQ{e+ogV z(Bu$n(k~DXP=qbv(~Kp ztXZ?H7LJJ;>b1^zr)fm23g0nMMg&-un&V^4y#y;3ceby~zZa$5)?{J7NH97!MdtWp z&D?q$%>Mlik*yWAt8u&_%>;xW_09LP&kpnnyAS)C2p1BeJG0>SC;Hx=0IS2^(Uv|_ z0R%i;?W{_vW4RHtx+%PErVLtEK4)3F&Jnn+vCdvK`P{CZdRuTj4+Q=7D4*OFysk<@ zO_b;2Mb14yotdV|$}#^eE2nrjd2pttRngUsI4#<~7QL^Xf5IO{Zu$mG?6eiNB_BF_ zpGW#T$5hSrAv=hk_AO$3Tl#;{NC%P}rCh4xCR?KSsGl>bV8hQt_re{VdH^FeR(#5W zZylev$A#1a7r|egezn()-@Mgnec2J&`LoaNlM0{G$)$;IzM>8^vEhkiyS*1Q#t&(( z<}KcFN6&xlvhm~It9(}53K|0PD_30t-F|BuBgA?CkR__zGnT6?~rcdS` zbi?YJ()(UktJnT{FKox@Em{2-|Du+heu%aak7DFgJq2I3bZQOFT09X3ZHs_wSJukX z&eZZ$ln%8}5pF+O+QWD!mkaBiHOoAcd1X4JB_>-KfkOhyR=W~&?RGWZsBMYokG14} zwfuM{Y!MBHLfdxZuq_x|S@Tl2dMMS`h^Tcr(|j6yzbspDS-i~ZO}DPBN%F}W-eq0J zPFhLL{QXJqEV+KZH>`?NKFTUvNk3gHEK}K6otiyR`_yP;OCX>9D?OB5ty0vP?P^-| zv@iae_zzfZcsjB*oOV)pzqf+VNZHK z=wqm4Jz|-dV@$hv0HoQ{m@!G@nomIY(60e{5NolWicL6@9H-|JM zPB;`by()X`-*bsI-PdeM)i1&3YQf0vtMfe2v}hBo)LLtQ9xW14{8?9WNV;`r8dhct zVn=+*UV3-SA#TgWSz!0xH9Nja(A zqU(r^g+^#ermM4)S~DDyH8Ir#|%K zzMAKHN~Q(&Re44z@0_+yqreBwNC6h2kIp~vNjh6?&NuW99Vb_bmh!$2X&x~LVz=G9 zsJw5$nU$Qa$_^G82yYe9BI?fGA(^kgRip7{Tc|&)4f}>f7O`T6PCsQRxRDJA7}vWR zM0JUOdd_7QZw)bLrdi2oS>iXcpjP#*aqXQ+;+rSRg<^c>d3gTTe7a{=+Z_KQqcoOUfE220wR zUr)4ltbb3GUwojxQH}FJZ9k?R?LXD(SlqQL+5s2lI`Ws^BzTVW7cp+fi>c{HL=ifA zs5ka4{%9AimQwHdG~6e?b=y+Mar+(XNIyf@k1n`ZscCZSzQwzg@b0~`CE@cY{cxW% z_~lIdGrb8;a30cq{k@!egzZh#9~iyL{imi|e6X0Yt&e%u!yJUg<=yz;J~$Wt>CYm# z(zyt5sQDRxbU`y4hI<-J^*iE(H@WfC$D)sSLP`#wMs-MoKN7#P8$wnZd1--bYU6nK z9Uf;V7)fTRyppb-N&XxA%t#pib>;@#8Dlb+N9W^Clk>J5*44|gxXYYC2&rc6MCB}3 zN@UeIW5AmO9ibfovbI2O2}!;J&khqum!~<9 zjka;UcjY_?M=hv^3a6oYqQ+y$mRayo&J+4%{g`FU&MU;8nf0O9-P|6!f&2>Ro}&?V z)e?OJY)B0LN0X3KW4cB+lzE+HCMRRkpOYYY{0y~M2&|7e9TRsVxpqKV36fif?kR&f zARx2Xt>X43^85Q9My$IjFEVsX8p-?ZbzA2Y%x9UQ?bzXrk%Rgs3DaQE-+?1esgydS zZ>eo)G-MUoZ15v{m61m@d^!oLnPm;g$?ERh#i=CZHMI9mv&Tm9X@UdKDrU<8I1^;?|W-)e<2)ifRDZ0bs*+-~D8t_E|YWI8f~6@W9zwWDdHVm98H-`vtli^&;H^8hOOe0%DgFa z1#`m}w_V=V(cRv&_H`~Gz4^T(%3jy%ae@c00!y*A1J{pG7^1G-&)DB;tnLbwP~@2m zwVchq;=SXoBCKt!t}f2Iwwq91mXo#aNlv!n9!vYqpiKPu3kjEIs&XxC+3RVX3y}-?mZj zh;zsO)aUiMooAjO)|20IhxKWafpF5JGwYswPii5sj*gyYnC(Y0#-92`9U`KtCz3@- zqJQ)pse~8m{A#{CO1bZ*frupxooRHX19W$pD@5Fym=5=!a@KlZUIvwSwk3%pr``3F zOt;k0Ko)aRZtaY5XGPkekDQ`U1o1@L}SdK!!(Y(s+|BT7{dyfIN zkR44Ob5ln|bmB%EywI3|X$0w9Ml|AEQ=IGk5G}-Z!J^@0l4*yxv0|~Nm#+kpV;PHy z`d)}nHgxK_E6HLmp6S|I+o&QyG_P(Eah#|`w;*5nmG1gkJ#Xi;zPD}GUdy+F2c1Za e%hglnnXPq$Z!F2XIn<1>tZ>Z2Z&-BIng0N&hv@?V literal 0 HcmV?d00001 diff --git a/.gitattributes b/.gitattributes index 09de0a89..783af180 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,7 @@ *.ml linguist-language=OCaml + +# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_character_encoding?view=powershell-7.1 +*.ps1 text working-tree-encoding=UTF-16 eol=crlf +*.psm1 text working-tree-encoding=UTF-16 eol=crlf +# Other file types that must be CRLF +*.sln text eol=crlf diff --git a/.github/workflows/dkml.yml b/.github/workflows/dkml.yml new file mode 100644 index 00000000..92d2e185 --- /dev/null +++ b/.github/workflows/dkml.yml @@ -0,0 +1,102 @@ +########################################################################## +# File: dktool/cmake/scripts/dkml/workflow/compilers-github-workflows-dkml.in.yml# +# # +# Copyright 2022 Diskuv, Inc. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # +# implied. See the License for the specific language governing # +# permissions and limitations under the License. # +# # +########################################################################## + +# Updating +# -------- +# +# 1. Delete this file. +# 2. Run dk with your original arguments: +# ./dk dkml.workflow.compilers CI GitHub Desktop OS Windows +# or get help to come up with new arguments: +# ./dk dkml.workflow.compilers HELP + +name: Build with DkML compiler + +on: + # trigger on any push + push: + # ... or trigger manually from GitHub web interface + workflow_dispatch: + +jobs: + build: + strategy: + matrix: + include: # + - gh_os: windows-2019 + abi_pattern: win32-windows_x86 + dkml_host_abi: windows_x86 + - gh_os: windows-2019 + abi_pattern: win32-windows_x86_64 + dkml_host_abi: windows_x86_64 + + runs-on: ${{ matrix.gh_os }} + name: build / ${{ matrix.abi_pattern }} + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Cache DkML compilers code + uses: actions/cache@v3 + id: cache-dkml-compilers + with: + path: .ci/dkml-compilers + key: ${{ runner.os }} + + - name: Checkout DkML compilers code + if: steps.cache-dkml-compilers.outputs.cache-hit != 'true' + # For help: ./dk dkml.workflow.compilers HELP + run: ./dk dkml.workflow.compilers CI GitHub + + # The .ci/dkml-compilers "pre" actions will create the environment variables: + # opam_root, exe_ext, dkml_host_abi, abi_pattern (and many more) + # + - name: Setup DkML compilers on a Windows host + if: startsWith(matrix.dkml_host_abi, 'windows_') + uses: ./.ci/dkml-compilers/gh-windows/pre + with: + DKML_COMPILER: ${{ env.DKML_COMPILER }} + CACHE_PREFIX: ${{ env.CACHE_PREFIX }} + + # This section is for your own build logic which you should place in + # ci/build-test.sh or a similar file + + - name: Build and test on Windows host + if: startsWith(matrix.dkml_host_abi, 'windows_') + shell: msys2 {0} + run: ci/build-test.sh + + - name: Build and test on non-Windows host + if: "!startsWith(matrix.dkml_host_abi, 'windows_')" + run: ci/build-test.sh + + # The .ci/dkml-compilers "post" actions will finalize caching, etc. + + - name: Teardown DkML compilers on a Windows host + if: startsWith(matrix.dkml_host_abi, 'windows_') + uses: ./.ci/dkml-compilers/gh-windows/post + + - name: Teardown DkML compilers on a Darwin host + if: startsWith(matrix.dkml_host_abi, 'darwin_') + uses: ./.ci/dkml-compilers/gh-darwin/post + + - name: Teardown DkML compilers on a Linux host + if: startsWith(matrix.dkml_host_abi, 'linux_') + uses: ./.ci/dkml-compilers/gh-linux/post diff --git a/.gitignore b/.gitignore index 48d95161..7aeb30c2 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,13 @@ mirage/myocamlbuild.ml mirage/.mirage.config _opam *.install + +# CI using dkml-workflows' DkML compilers. +# DkML compilers populate the .opam folder. +/.opam/ +# GitHub, unlike GitLab, does not need its CI files to exist +# before referencing them. That means the GitHub scripts do not need +# to be checked in. +/.ci/dkml-compilers/gh-* +# Desktop testing on Windows uses MSYS2. +/msys64/ diff --git a/ci/build-test.sh b/ci/build-test.sh new file mode 100644 index 00000000..4653874e --- /dev/null +++ b/ci/build-test.sh @@ -0,0 +1,84 @@ +#!/bin/sh +########################################################################## +# File: dktool/cmake/scripts/dkml/workflow/compilers-build-test.in.sh # +# # +# Copyright 2022 Diskuv, Inc. # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # +# implied. See the License for the specific language governing # +# permissions and limitations under the License. # +# # +########################################################################## + +# Updating +# -------- +# +# 1. Delete this file. +# 2. Run dk with your original arguments: +# ./dk dkml.workflow.compilers CI GitHub Desktop OS Windows +# or get help to come up with new arguments: +# ./dk dkml.workflow.compilers HELP + +set -euf + +# Set project directory +if [ -n "${CI_PROJECT_DIR:-}" ]; then + PROJECT_DIR="$CI_PROJECT_DIR" +elif [ -n "${PC_PROJECT_DIR:-}" ]; then + PROJECT_DIR="$PC_PROJECT_DIR" +elif [ -n "${GITHUB_WORKSPACE:-}" ]; then + PROJECT_DIR="$GITHUB_WORKSPACE" +else + PROJECT_DIR="$PWD" +fi +if [ -x /usr/bin/cygpath ]; then + PROJECT_DIR=$(/usr/bin/cygpath -au "$PROJECT_DIR") +fi + +# shellcheck disable=SC2154 +echo " +============= +build-test.sh +============= +. +--------- +Arguments +--------- +$* +. +------ +Matrix +------ +dkml_host_abi=$dkml_host_abi +abi_pattern=$abi_pattern +opam_root=$opam_root +exe_ext=${exe_ext:-} +. +" + +# PATH. Add opamrun +export PATH="$PROJECT_DIR/.ci/sd4/opamrun:$PATH" + +# Initial Diagnostics (optional but useful) +opamrun switch +opamrun list +opamrun var +opamrun config report +opamrun option +opamrun exec -- ocamlc -config + +# Update +opamrun update + +# Make your own build logic! +opamrun install --yes --deps-only -t mirage-crypto mirage-crypto-rng mirage-crypto-rng-lwt mirage-crypto-rng-mirage mirage-crypto-pk mirage-crypto-ec +opamrun exec -- dune build -p mirage-crypto,mirage-crypto-rng,mirage-crypto-rng-lwt,mirage-crypto-rng-mirage,mirage-crypto-pk,mirage-crypto-ec +opamrun exec -- dune runtest -p mirage-crypto,mirage-crypto-rng,mirage-crypto-rng-lwt,mirage-crypto-rng-mirage,mirage-crypto-pk,mirage-crypto-ec From 7d754e1593f467be426b0597b95c44788a82a7fe Mon Sep 17 00:00:00 2001 From: Jonah Beckford <71855677+jonahbeckford@users.noreply.github.com> Date: Sun, 3 Sep 2023 15:04:48 -0700 Subject: [PATCH 03/14] All DkML MSVC compiler to fail --- .github/workflows/dkml.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dkml.yml b/.github/workflows/dkml.yml index 92d2e185..ea2e5522 100644 --- a/.github/workflows/dkml.yml +++ b/.github/workflows/dkml.yml @@ -38,7 +38,7 @@ jobs: build: strategy: matrix: - include: # + include: # - gh_os: windows-2019 abi_pattern: win32-windows_x86 dkml_host_abi: windows_x86 @@ -49,6 +49,10 @@ jobs: runs-on: ${{ matrix.gh_os }} name: build / ${{ matrix.abi_pattern }} + # mirage-crypto does not support MSVC as of 2023-09-03. Remove + # this when MSVC is properly supported. + continue-on-error: true + steps: - name: Checkout code uses: actions/checkout@v3 @@ -67,7 +71,7 @@ jobs: # The .ci/dkml-compilers "pre" actions will create the environment variables: # opam_root, exe_ext, dkml_host_abi, abi_pattern (and many more) - # + # - name: Setup DkML compilers on a Windows host if: startsWith(matrix.dkml_host_abi, 'windows_') uses: ./.ci/dkml-compilers/gh-windows/pre From 2782cff355665bb2bc323db869a159cde737759b Mon Sep 17 00:00:00 2001 From: Jonah Beckford <71855677+jonahbeckford@users.noreply.github.com> Date: Mon, 18 Sep 2023 09:54:29 -0700 Subject: [PATCH 04/14] Re-encode as UTF-16 LE with BOM --- .../pc/setup-dkml-windows_x86.ps1 | Bin 225340 -> 109937 bytes .../pc/setup-dkml-windows_x86_64.ps1 | Bin 225274 -> 109905 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/.ci/dkml-compilers/pc/setup-dkml-windows_x86.ps1 b/.ci/dkml-compilers/pc/setup-dkml-windows_x86.ps1 index 7e4d696543175898969950cab437d42610e0daa3..1597362165b9595390f67d6f65e454aa16c48f3b 100644 GIT binary patch literal 109937 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%0Ao3cmi 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

lws^-qJ!3uaJ?vI)unw)*pV0NGFckR+ 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 I=3RZ}KkQBNwg3PC diff --git a/.ci/dkml-compilers/pc/setup-dkml-windows_x86_64.ps1 b/.ci/dkml-compilers/pc/setup-dkml-windows_x86_64.ps1 index e9ef297cc4d0f56a77be70b73483a43506ef5efa..bbbb463b17bb22b35437e830368b3224257170d8 100644 GIT binary patch literal 109905 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

0tSVL@RU}zQn~E{h2D_ZO+3c>S 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 From db15dc29ba051596c7a2d897bfaf66cec5b62853 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Tue, 9 Jan 2024 12:36:37 +0100 Subject: [PATCH 05/14] cirrus: update to FreeBSD 13.2 --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index edea7a5b..1e4b6998 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,5 +1,5 @@ freebsd_instance: - image_family: freebsd-12-2 + image_family: freebsd-13-2 freebsd_task: env: From 46e71a9334b2e7dba2b675ed16a7b58a25a2a559 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Wed, 10 Jan 2024 12:18:59 +0100 Subject: [PATCH 06/14] opam: fix typo --- mirage-crypto-rng-async.opam | 2 +- mirage-crypto-rng-eio.opam | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mirage-crypto-rng-async.opam b/mirage-crypto-rng-async.opam index 179add09..0e2b5577 100644 --- a/mirage-crypto-rng-async.opam +++ b/mirage-crypto-rng-async.opam @@ -25,6 +25,6 @@ available: os != "win32" description: """ Mirage-crypto-rng-async feeds the entropy source for Mirage_crypto_rng-based -random number genreator implementations, in an Async-friendly way. +random number generator implementations, in an Async-friendly way. """ diff --git a/mirage-crypto-rng-eio.opam b/mirage-crypto-rng-eio.opam index 434ae8d1..ec9fcaa2 100644 --- a/mirage-crypto-rng-eio.opam +++ b/mirage-crypto-rng-eio.opam @@ -25,5 +25,5 @@ depends: [ ] description: """ Mirage-crypto-rng-eio feeds the entropy source for Mirage_crypto_rng-based -random number genreator implementations, in an eio-friendly way. +random number generator implementations, in an eio-friendly way. """ From b2a46c983e454854d7cb822baf2ad6708fdc020c Mon Sep 17 00:00:00 2001 From: Chris Pinnock Date: Sat, 27 Jan 2024 15:27:44 +0000 Subject: [PATCH 07/14] +NetBSD --- rng/unix/mc_getrandom_stubs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rng/unix/mc_getrandom_stubs.c b/rng/unix/mc_getrandom_stubs.c index 8493db56..6e18e3cd 100644 --- a/rng/unix/mc_getrandom_stubs.c +++ b/rng/unix/mc_getrandom_stubs.c @@ -29,7 +29,7 @@ void raw_getrandom (uint8_t *data, uint32_t len) { off += (size_t)r; } } -#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__)) +#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__)) || defined(__NetBSD__) // on BSD and macOS, loop (in pieces of 256) getentropy #if defined(__APPLE__) // on macOS, getentropy is defined in sys/random.h (on BSD in unistd.h) From 24dff0d65499f9106a2ea695f1d051b7f7719af0 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Sat, 3 Feb 2024 12:44:24 +0100 Subject: [PATCH 08/14] Allocate less in Fortuna (#188) * Fortuna.add: don't allocate a 2 byte cstruct on each call Instead, use a temporary buffer. Contradicts #186 * minor fix --- rng/fortuna.ml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/rng/fortuna.ml b/rng/fortuna.ml index 848dbe58..8413771d 100644 --- a/rng/fortuna.ml +++ b/rng/fortuna.ml @@ -102,12 +102,15 @@ let generate ~g bytes = chunk (generate_rekey ~g n' :: acc) (n - n') in Cstruct.concat @@ chunk [] bytes +let _buf = Cstruct.create_unsafe 2 + let add ~g (source, _) ~pool data = - let pool = pool land (pools - 1) - and source = source land 0xff in - let header = Cs.of_bytes [ source ; Cstruct.length data ] in - g.pools.(pool) <- SHAd256.feedi g.pools.(pool) (iter2 header data); - if pool = 0 then g.pool0_size <- g.pool0_size + Cstruct.length data + let pool = pool land (pools - 1) + and source = source land 0xff in + Cstruct.set_uint8 _buf 0 source; + Cstruct.set_uint8 _buf 1 (Cstruct.length data); + g.pools.(pool) <- SHAd256.feedi g.pools.(pool) (iter2 _buf data); + if pool = 0 then g.pool0_size <- g.pool0_size + Cstruct.length data (* XXX * Schneier recommends against using generator-imposed pool-seeding schedule From cf42ee718dbef00b8e48c7ecfc520d8851605aa9 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Sat, 3 Feb 2024 12:46:18 +0100 Subject: [PATCH 09/14] changes so far --- CHANGES.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 8ce236ac..31bd1814 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,9 @@ +## unreleased + +* mirage-crypto-rng: support NetBSD (#189 @drchrispinnock) +* mirage-crypto-rng: allocate less in Fortuna when feeding (#188 @hannesm, + reported by @palainp) + ## v0.11.2 (2023-09-18) * mirage-crypto-rng-eio: improve portability by using eio 0.7's monotonic clock From bce46463537bcaa219c3f827ea1d9a93f065e84a Mon Sep 17 00:00:00 2001 From: YalingFang Date: Sun, 4 Feb 2024 01:36:01 +0000 Subject: [PATCH 10/14] Add support for Loongarch --- src/native/entropy_cpu_stubs.c | 10 ++++++++++ src/native/mirage_crypto.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/native/entropy_cpu_stubs.c b/src/native/entropy_cpu_stubs.c index 8113c24a..15af89e0 100644 --- a/src/native/entropy_cpu_stubs.c +++ b/src/native/entropy_cpu_stubs.c @@ -143,6 +143,14 @@ static inline unsigned long get_count(void) { } #endif +#if defined (__loongarch_lp64) +static inline unsigned long get_count(void) { + unsigned long count; + __asm__ __volatile__ ("rdtime.d %0, $zero\n" : "=r" (count)); + + return count; +} +#endif CAMLprim value mc_cycle_counter (value __unused(unit)) { #if defined (__i386__) || defined (__x86_64__) @@ -157,6 +165,8 @@ CAMLprim value mc_cycle_counter (value __unused(unit)) { return Val_long (getticks ()); #elif defined(__mips__) return Val_long (get_count()); +#elif defined(__loongarch_lp64) + return Val_long (get_count()); #else #error ("No known cycle-counting instruction.") #endif diff --git a/src/native/mirage_crypto.h b/src/native/mirage_crypto.h index 22cc7af6..7466ef2f 100644 --- a/src/native/mirage_crypto.h +++ b/src/native/mirage_crypto.h @@ -47,7 +47,7 @@ extern struct _mc_cpu_features mc_detected_cpu_features; #endif /* __mc_ACCELERATE__ */ -#if defined (__x86_64__) || defined (__aarch64__) || defined (__powerpc64__) || (64 == __riscv_xlen) || defined (__s390x__) || (defined (__mips__) && _MIPS_SIM==_ABI64) +#if defined (__x86_64__) || defined (__aarch64__) || defined (__powerpc64__) || (64 == __riscv_xlen) || defined (__s390x__) || (defined (__mips__) && _MIPS_SIM==_ABI64) || defined (__loongarch_lp64) #define ARCH_64BIT #elif defined (__i386__) || defined (__arm__) || (32 == __riscv_xlen) || (defined (__mips__) && _MIPS_SIM==_ABIO32) #define ARCH_32BIT From e209e5ac33b12b9fe44965ec91b93d8c154e20ff Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Sun, 4 Feb 2024 13:42:57 +0100 Subject: [PATCH 11/14] changes entry for 190 --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 31bd1814..26265b54 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,6 @@ ## unreleased +* mirage-crypto-rng: support Loongarch (#190 @fangyaling, review @loongson-zn) * mirage-crypto-rng: support NetBSD (#189 @drchrispinnock) * mirage-crypto-rng: allocate less in Fortuna when feeding (#188 @hannesm, reported by @palainp) From 41424428fd95c36b8e7c0b9d478ffcd9ed66ddcb Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Sun, 4 Feb 2024 13:45:15 +0100 Subject: [PATCH 12/14] fix typo in changes --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 26265b54..6a015cfa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -53,7 +53,7 @@ - remove mirage 3 cross-compilation runes (#163 @hannesm) - CI: mirage-crypto-rng-eio requires ocaml 5 and dune 2.7 (#170 @hannesm, fixes #169 thanks to @bikallem @talex5) -- CI: use miage 4 (#166 @hannesm) +- CI: use mirage 4 (#166 @hannesm) ## v0.10.7 (2022-09-13) From 29c82f3b5aadb1ee0b68325978cc7e8a12091cf2 Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Tue, 6 Feb 2024 18:57:37 +0100 Subject: [PATCH 13/14] test-mirage: bump version --- .test-mirage.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.test-mirage.sh b/.test-mirage.sh index d67fbc73..c4b6652a 100755 --- a/.test-mirage.sh +++ b/.test-mirage.sh @@ -3,9 +3,9 @@ set -ex opam install --confirm-level=unsafe-yes "mirage>4" -# to satisfy hardcoded version constraints in mirage, we need to be < 0.11.0 +# to satisfy hardcoded version constraints in mirage, we need to be < 0.12.0 # and "dune subst" doesn't work on these PR checkouts -version='version: "0.10.99~dev"' +version='version: "0.11.99~dev"' echo $version >> mirage-crypto-rng-mirage.opam echo $version >> mirage-crypto-rng.opam echo $version >> mirage-crypto.opam From 33bde011baf6b209140fdf7a407416ed3ab0493e Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Tue, 6 Feb 2024 18:58:00 +0100 Subject: [PATCH 14/14] add EC to bench/speed (#192) * add ECDSA to bench/speed * ecdsa-generate * remaining ec bench * minimize diff * DRY * mirage-crypto: conflict with result < 1.5 (since that redefines Result module, and we don't get Result.get_ok) --- bench/dune | 2 +- bench/speed.ml | 114 +++++++++++++++++++++++++++++++++++++++++++++ mirage-crypto.opam | 1 + 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/bench/dune b/bench/dune index f29164b4..63558d89 100644 --- a/bench/dune +++ b/bench/dune @@ -2,4 +2,4 @@ (names speed) (modules speed) (libraries mirage-crypto mirage-crypto-rng mirage-crypto-rng.unix - mirage-crypto-pk)) + mirage-crypto-pk mirage-crypto-ec)) diff --git a/bench/speed.ml b/bench/speed.ml index c574fcae..21d24348 100644 --- a/bench/speed.ml +++ b/bench/speed.ml @@ -179,6 +179,67 @@ let dh_secrets = "60057457975706301816395663645420233759377744187465730049174048360108513636349450241008234412972340882517684187851" ; ]) +let ecdsa_p224 = + Result.get_ok + (Mirage_crypto_ec.P224.Dsa.priv_of_cstruct + (Cstruct.of_hex "f254645834cfff245599be937a00535f6a2c8b00dc34bdf50df68903")) + +let ecdsa_p224_sig () = + Mirage_crypto_ec.P224.Dsa.sign ~key:ecdsa_p224 (Cstruct.sub msg 0 28) + +let ecdsa_p256 = + Result.get_ok + (Mirage_crypto_ec.P256.Dsa.priv_of_cstruct + (Cstruct.of_hex "089f4ffcccf9ba13fedd0942ef08cf2d909f32e2934ab5c93b6c99be5a9ff527")) + +let ecdsa_p256_sig () = + Mirage_crypto_ec.P256.Dsa.sign ~key:ecdsa_p256 (Cstruct.sub msg 0 32) + +let ecdsa_p384 = + Result.get_ok + (Mirage_crypto_ec.P384.Dsa.priv_of_cstruct + (Cstruct.of_hex "f5c0c9fb95178641af76f3831f41e2d37cfaafffc7e60172cfb089fe604b56a61c7c31a6904b3b5d08207a4b81e25ea5")) + +let ecdsa_p384_sig () = + Mirage_crypto_ec.P384.Dsa.sign ~key:ecdsa_p384 (Cstruct.sub msg 0 48) + +let ecdsa_p521 = + Result.get_ok + (Mirage_crypto_ec.P521.Dsa.priv_of_cstruct + (Cstruct.of_hex "00b18f60c0352ad8e3ef982f1ddfcf6eec7fa6caf0e6f368354a8b02b2d8ac1e059e309891e2bfa85791a5e71b40bdecbf902bf243dc3b0080495cf4d91c78728bd5")) + +let ecdsa_p521_sig () = + Mirage_crypto_ec.P521.Dsa.sign ~key:ecdsa_p521 (Cstruct.sub msg 0 65) + +let ed25519 = + Result.get_ok (Mirage_crypto_ec.Ed25519.priv_of_cstruct + (Cstruct.of_hex "3e0ab682171275c569fce9ca8bccd2d2771454a2300c3529f7a4d80b843883bc")) + +let ed25519_sig () = + Mirage_crypto_ec.Ed25519.sign ~key:ed25519 msg + +let ecdsas = [ + ("P224", `P224 (ecdsa_p224, ecdsa_p224_sig ())); + ("P256", `P256 (ecdsa_p256, ecdsa_p256_sig ())); + ("P384", `P384 (ecdsa_p384, ecdsa_p384_sig ())); + ("P521", `P521 (ecdsa_p521, ecdsa_p521_sig ())); + ("Ed25519", `Ed25519 (ed25519, ed25519_sig ())); +] + +let ecdh_shares = + [ + ("P224", `P224 (Mirage_crypto_ec.P224.Dh.secret_of_cs (Cstruct.of_hex "60a814ec54d0c2d28c03ff01df32267d40432311df41aacb2fa5fdf7") |> Result.get_ok |> fst, + Cstruct.of_hex "042d8d91c909fdab2f7f0c33466dd74697e5166d378982e9ecf5492cb32d69d7eb96dc57d775b70d56237f8ec49e5752c87542dc41dc5049d2")); + ("P256", `P256 (Mirage_crypto_ec.P256.Dh.secret_of_cs (Cstruct.of_hex "470d57706c7706b68a3f423aeaf4ff7fdd02494a10d3e381c3c11f7276802cdc") |> Result.get_ok |> fst, + Cstruct.of_hex "0411b3fc82721c269a19909a3b2fc26d9895826d0cfcbc1f7626e488f01f4ca6b5c5ed76adee7af81bb20b17cf231cbf0c67db0295d68d1d92c2d2a5a80638d78d")); + ("P384", `P384 (Mirage_crypto_ec.P384.Dh.secret_of_cs (Cstruct.of_hex "ee55e29b61752d5a3e525656db8bd8fe6f94fab8aacc9e92acff4c4812bf7a6187aba46cc60ab8f08efcf2d574584b74") |> Result.get_ok |> fst, + Cstruct.of_hex "040489cf24bc80bf89fdfe9c05ecc39f6916ad4509d9398597950d3d24e828f6bf56ba4ad6d21ed7863bed68e413364bd4c7b1e9047d36124c6953be7c61209cb3fc56452f7305293783c7c0ed929d6c98c7bc97f60a72ed2269a8eb19bb7ee131")); + ("P521", `P521 (Mirage_crypto_ec.P521.Dh.secret_of_cs (Cstruct.of_hex "00aa470ba1cc843ba314821e72de4cd299aec1f26e9d64a0d87db18a3da9f65c45ecfcc5617ff0d73b2e0e1cdff8048e01be5e20149412e7dbfab7feae249b1bfa4d") |> Result.get_ok |> fst, + Cstruct.of_hex "04001d1629eeb1c425f904d755330079d13c77da921e01cf50d717e0d6850a81a3902bb92a03faeacbd6289c1590685a6044b5e94dcfc41deb6a88db62a891b0b893bb00e42a66b2f013bdd0d27d8e07cb35fc3e2c2b22f93ecfd5eab7886197ca073c2c5e6831d65e2d0b8aa408438e49542f05f41c576df70e3caf5bb8227d483094ae58")); + ("X25519", `X25519 (Mirage_crypto_ec.X25519.secret_of_cs (Cstruct.of_hex "4c6db7cf935bcf84026178d40c956af09d8e363203490d2c41625acb68b931a4") |> Result.get_ok |> fst, + Cstruct.of_hex "ca19193cf5c0b38c61aa01c172b2e93d16f750d0846277ad322de5e4fb332429")); + ] + let bm name f = (name, fun () -> f name) let benchmarks = [ @@ -245,6 +306,39 @@ let benchmarks = [ (fun (k, _) -> string_of_int (Z.numbits k.p)) [dsa_1024,dsa_sig_1024 () ; dsa_2048,dsa_sig_2048 () ; dsa_3072,dsa_sig_3072 ()]); + bm "ecdsa-generate" (fun name -> + let open Mirage_crypto_ec in + count name + (fun (_, x) -> match x with + | `P224 _ -> P224.Dsa.generate () |> ignore + | `P256 _ -> P256.Dsa.generate () |> ignore + | `P384 _ -> P384.Dsa.generate () |> ignore + | `P521 _ -> P521.Dsa.generate () |> ignore + | `Ed25519 _ -> Ed25519.generate () |> ignore + ) + fst ecdsas); + + bm "ecdsa-sign" (fun name -> + let open Mirage_crypto_ec in + count name (fun (_, x) -> match x with + | `P224 (key, _) -> P224.Dsa.sign ~key (Cstruct.sub msg 0 28) + | `P256 (key, _) -> P256.Dsa.sign ~key (Cstruct.sub msg 0 32) + | `P384 (key, _) -> P384.Dsa.sign ~key (Cstruct.sub msg 0 48) + | `P521 (key, _) -> P521.Dsa.sign ~key (Cstruct.sub msg 0 65) + | `Ed25519 (key, _) -> Ed25519.sign ~key msg, Cstruct.empty + ) + fst ecdsas); + + bm "ecdsa-verify" (fun name -> + let open Mirage_crypto_ec in + count name (fun (_, x) -> match x with + | `P224 (key, signature) -> P224.Dsa.(verify ~key:(pub_of_priv key) signature (Cstruct.sub msg 0 28)) + | `P256 (key, signature) -> P256.Dsa.(verify ~key:(pub_of_priv key) signature (Cstruct.sub msg 0 32)) + | `P384 (key, signature) -> P384.Dsa.(verify ~key:(pub_of_priv key) signature (Cstruct.sub msg 0 48)) + | `P521 (key, signature) -> P521.Dsa.(verify ~key:(pub_of_priv key) signature (Cstruct.sub msg 0 65)) + | `Ed25519 (key, signature) -> Ed25519.(verify ~key:(pub_of_priv key) signature ~msg) + ) fst ecdsas); + bm "dh-secret" (fun name -> count name (fun (_, group) -> Mirage_crypto_pk.Dh.gen_key group) fst dh_groups); @@ -254,6 +348,26 @@ let benchmarks = [ Mirage_crypto_pk.Dh.shared sec share) (fun ((g, _), _) -> g) dh_secrets); + bm "ecdh-secret" (fun name -> + let open Mirage_crypto_ec in + count name (fun (_, x) -> match x with + | `P224 _ -> P224.Dh.gen_key () |> ignore + | `P256 _ -> P256.Dh.gen_key () |> ignore + | `P384 _ -> P384.Dh.gen_key () |> ignore + | `P521 _ -> P521.Dh.gen_key () |> ignore + | `X25519 _ -> X25519.gen_key () |> ignore) + fst ecdh_shares); + + bm "ecdh-share" (fun name -> + let open Mirage_crypto_ec in + count name (fun (_, x) -> match x with + | `P224 (sec, share) -> P224.Dh.key_exchange sec share |> Result.get_ok |> ignore + | `P256 (sec, share) -> P256.Dh.key_exchange sec share |> Result.get_ok |> ignore + | `P384 (sec, share) -> P384.Dh.key_exchange sec share |> Result.get_ok |> ignore + | `P521 (sec, share) -> P521.Dh.key_exchange sec share |> Result.get_ok |> ignore + | `X25519 (sec, share) -> X25519.key_exchange sec share |> Result.get_ok |> ignore) + fst ecdh_shares); + bm "chacha20-poly1305" (fun name -> let key = Mirage_crypto.Chacha20.of_secret (Mirage_crypto_rng.generate 32) and nonce = Mirage_crypto_rng.generate 8 in diff --git a/mirage-crypto.opam b/mirage-crypto.opam index 56da60ca..d6ad51ce 100644 --- a/mirage-crypto.opam +++ b/mirage-crypto.opam @@ -22,6 +22,7 @@ depends: [ ] conflicts: [ "ocaml-freestanding" + "result" {< "1.5"} ] description: """ Mirage-crypto provides symmetric ciphers (DES, AES, RC4, ChaCha20/Poly1305), and