From 785d6656535e9143cd274d1eeea85db1894cd9e1 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 8 May 2025 15:20:34 +0200 Subject: [PATCH 1/4] Update `mill` scripts pre-0.12-bump --- mill | 246 ++++++++++++++++++++++++++++++++++++++++++++----------- mill.bat | 234 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 391 insertions(+), 89 deletions(-) diff --git a/mill b/mill index 6d82cfd..504bb89 100755 --- a/mill +++ b/mill @@ -1,20 +1,46 @@ #!/usr/bin/env sh -# This is a wrapper script, that automatically download mill from GitHub release pages -# You can give the required mill version with --mill-version parameter -# If no version is given, it falls back to the value of DEFAULT_MILL_VERSION +# This is a wrapper script, that automatically selects or downloads Mill from Maven Central or GitHub release pages. # -# Project page: https://github.com/lefou/millw -# Script Version: 0.4.2 +# This script determines the Mill version to use by trying these sources +# - env-variable `MILL_VERSION` +# - local file `.mill-version` +# - local file `.config/mill-version` +# - `mill-version` from YAML fronmatter of current buildfile +# - if accessible, find the latest stable version available on Maven Central (https://repo1.maven.org/maven2) +# - env-variable `DEFAULT_MILL_VERSION` +# +# If a version has the suffix '-native' a native binary will be used. +# If a version has the suffix '-jvm' an executable jar file will be used, requiring an already installed Java runtime. +# If no such suffix is found, the script will pick a default based on version and platform. +# +# Once a version was determined, it tries to use either +# - a system-installed mill, if found and it's version matches +# - an already downloaded version under ~/.cache/mill/download +# +# If no working mill version was found on the system, +# this script downloads a binary file from Maven Central or Github Pages (this is version dependent) +# into a cache location (~/.cache/mill/download). +# +# Mill Project URL: https://github.com/com-lihaoyi/mill +# Script Version: 0.13.0-M2-63-e8edbd # # If you want to improve this script, please also contribute your changes back! +# This script was generated from: scripts/src/mill.sh # # Licensed under the Apache License, Version 2.0 +set -e + +if [ -z "${DEFAULT_MILL_VERSION}" ] ; then + DEFAULT_MILL_VERSION="0.11.13" +fi -DEFAULT_MILL_VERSION=0.11.13 -set -e +if [ -z "${GITHUB_RELEASE_CDN}" ] ; then + GITHUB_RELEASE_CDN="" +fi + MILL_REPO_URL="https://github.com/com-lihaoyi/mill" @@ -24,16 +50,17 @@ fi # Explicit commandline argument takes precedence over all other methods if [ "$1" = "--mill-version" ] ; then - shift - if [ "x$1" != "x" ] ; then - MILL_VERSION="$1" - shift - else - echo "You specified --mill-version without a version." 1>&2 - echo "Please provide a version that matches one provided on" 1>&2 - echo "${MILL_REPO_URL}/releases" 1>&2 - false - fi + echo "The --mill-version option is no longer supported." 1>&2 +fi + +MILL_BUILD_SCRIPT="" + +if [ -f "build.mill" ] ; then + MILL_BUILD_SCRIPT="build.mill" +elif [ -f "build.mill.scala" ] ; then + MILL_BUILD_SCRIPT="build.mill.scala" +elif [ -f "build.sc" ] ; then + MILL_BUILD_SCRIPT="build.sc" fi # Please note, that if a MILL_VERSION is already set in the environment, @@ -42,21 +69,25 @@ fi # If not already set, read .mill-version file if [ -z "${MILL_VERSION}" ] ; then if [ -f ".mill-version" ] ; then - MILL_VERSION="$(head -n 1 .mill-version 2> /dev/null)" + MILL_VERSION="$(tr '\r' '\n' < .mill-version | head -n 1 2> /dev/null)" + elif [ -f ".config/mill-version" ] ; then + MILL_VERSION="$(tr '\r' '\n' < .config/mill-version | head -n 1 2> /dev/null)" + elif [ -n "${MILL_BUILD_SCRIPT}" ] ; then + MILL_VERSION="$(cat ${MILL_BUILD_SCRIPT} | grep '//[|] *mill-version: *' | sed 's;//| *mill-version: *;;')" fi fi -if [ -n "${XDG_CACHE_HOME}" ] ; then - MILL_DOWNLOAD_PATH="${XDG_CACHE_HOME}/mill/download" -else - MILL_DOWNLOAD_PATH="${HOME}/.cache/mill/download" +MILL_USER_CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/mill" + +if [ -z "${MILL_DOWNLOAD_PATH}" ] ; then + MILL_DOWNLOAD_PATH="${MILL_USER_CACHE_DIR}/download" fi # If not already set, try to fetch newest from Github if [ -z "${MILL_VERSION}" ] ; then # TODO: try to load latest version from release page echo "No mill version specified." 1>&2 - echo "You should provide a version via '.mill-version' file or --mill-version option." 1>&2 + echo "You should provide a version via a '//| mill-version: ' comment or a '.mill-version' file." 1>&2 mkdir -p "${MILL_DOWNLOAD_PATH}" LANG=C touch -d '1 hour ago' "${MILL_DOWNLOAD_PATH}/.expire_latest" 2>/dev/null || ( @@ -92,37 +123,127 @@ if [ -z "${MILL_VERSION}" ] ; then fi fi -MILL="${MILL_DOWNLOAD_PATH}/${MILL_VERSION}" +MILL_NATIVE_SUFFIX="-native" +MILL_JVM_SUFFIX="-jvm" +FULL_MILL_VERSION=$MILL_VERSION +ARTIFACT_SUFFIX="" +set_artifact_suffix(){ + if [ "$(expr substr $(uname -s) 1 5 2>/dev/null)" = "Linux" ]; then + if [ "$(uname -m)" = "aarch64" ]; then + ARTIFACT_SUFFIX="-native-linux-aarch64" + else + ARTIFACT_SUFFIX="-native-linux-amd64" + fi + elif [ "$(uname)" = "Darwin" ]; then + if [ "$(uname -m)" = "arm64" ]; then + ARTIFACT_SUFFIX="-native-mac-aarch64" + else + ARTIFACT_SUFFIX="-native-mac-amd64" + fi + else + echo "This native mill launcher supports only Linux and macOS." 1>&2 + exit 1 + fi +} + +case "$MILL_VERSION" in + *"$MILL_NATIVE_SUFFIX") + MILL_VERSION=${MILL_VERSION%"$MILL_NATIVE_SUFFIX"} + set_artifact_suffix + ;; + + *"$MILL_JVM_SUFFIX") + MILL_VERSION=${MILL_VERSION%"$MILL_JVM_SUFFIX"} + ;; + + *) + case "$MILL_VERSION" in + 0.1.*) ;; + 0.2.*) ;; + 0.3.*) ;; + 0.4.*) ;; + 0.5.*) ;; + 0.6.*) ;; + 0.7.*) ;; + 0.8.*) ;; + 0.9.*) ;; + 0.10.*) ;; + 0.11.*) ;; + 0.12.*) ;; + *) + set_artifact_suffix + esac + ;; +esac + +MILL="${MILL_DOWNLOAD_PATH}/$MILL_VERSION$ARTIFACT_SUFFIX" try_to_use_system_mill() { + if [ "$(uname)" != "Linux" ]; then + return 0 + fi + MILL_IN_PATH="$(command -v mill || true)" if [ -z "${MILL_IN_PATH}" ]; then - return + return 0 fi - UNIVERSAL_SCRIPT_MAGIC="@ 2>/dev/null # 2>nul & echo off & goto BOF" + SYSTEM_MILL_FIRST_TWO_BYTES=$(head --bytes=2 "${MILL_IN_PATH}") + if [ "${SYSTEM_MILL_FIRST_TWO_BYTES}" = "#!" ]; then + # MILL_IN_PATH is (very likely) a shell script and not the mill + # executable, ignore it. + return 0 + fi - if ! head -c 128 "${MILL_IN_PATH}" | grep -qF "${UNIVERSAL_SCRIPT_MAGIC}"; then - if [ -n "${MILLW_VERBOSE}" ]; then - echo "Could not determine mill version of ${MILL_IN_PATH}, as it does not start with the universal script magic2" 1>&2 - fi - return + SYSTEM_MILL_PATH=$(readlink -e "${MILL_IN_PATH}") + SYSTEM_MILL_SIZE=$(stat --format=%s "${SYSTEM_MILL_PATH}") + SYSTEM_MILL_MTIME=$(stat --format=%y "${SYSTEM_MILL_PATH}") + + if [ ! -d "${MILL_USER_CACHE_DIR}" ]; then + mkdir -p "${MILL_USER_CACHE_DIR}" fi - # Roughly the size of the universal script. - MILL_VERSION_SEARCH_RANGE="2403" - MILL_IN_PATH_VERSION=$(head -c "${MILL_VERSION_SEARCH_RANGE}" "${MILL_IN_PATH}" |\ - sed -n 's/^.*-DMILL_VERSION=\([^\s]*\) .*$/\1/p' |\ - head -n 1) + SYSTEM_MILL_INFO_FILE="${MILL_USER_CACHE_DIR}/system-mill-info" + if [ -f "${SYSTEM_MILL_INFO_FILE}" ]; then + parseSystemMillInfo() { + LINE_NUMBER="${1}" + # Select the line number of the SYSTEM_MILL_INFO_FILE, cut the + # variable definition in that line in two halves and return + # the value, and finally remove the quotes. + sed -n "${LINE_NUMBER}p" "${SYSTEM_MILL_INFO_FILE}" |\ + cut -d= -f2 |\ + sed 's/"\(.*\)"/\1/' + } + + CACHED_SYSTEM_MILL_PATH=$(parseSystemMillInfo 1) + CACHED_SYSTEM_MILL_VERSION=$(parseSystemMillInfo 2) + CACHED_SYSTEM_MILL_SIZE=$(parseSystemMillInfo 3) + CACHED_SYSTEM_MILL_MTIME=$(parseSystemMillInfo 4) - if [ -z "${MILL_IN_PATH_VERSION}" ]; then - echo "Could not determine mill version, even though ${MILL_IN_PATH} has the universal script magic" 1>&2 - return + if [ "${SYSTEM_MILL_PATH}" = "${CACHED_SYSTEM_MILL_PATH}" ] \ + && [ "${SYSTEM_MILL_SIZE}" = "${CACHED_SYSTEM_MILL_SIZE}" ] \ + && [ "${SYSTEM_MILL_MTIME}" = "${CACHED_SYSTEM_MILL_MTIME}" ]; then + if [ "${CACHED_SYSTEM_MILL_VERSION}" = "${MILL_VERSION}" ]; then + MILL="${SYSTEM_MILL_PATH}" + return 0 + else + return 0 + fi + fi fi - if [ "${MILL_IN_PATH_VERSION}" = "${MILL_VERSION}" ]; then - MILL="${MILL_IN_PATH}" + SYSTEM_MILL_VERSION=$(${SYSTEM_MILL_PATH} --version | head -n1 | sed -n 's/^Mill.*version \(.*\)/\1/p') + + cat < "${SYSTEM_MILL_INFO_FILE}" +CACHED_SYSTEM_MILL_PATH="${SYSTEM_MILL_PATH}" +CACHED_SYSTEM_MILL_VERSION="${SYSTEM_MILL_VERSION}" +CACHED_SYSTEM_MILL_SIZE="${SYSTEM_MILL_SIZE}" +CACHED_SYSTEM_MILL_MTIME="${SYSTEM_MILL_MTIME}" +EOF + + if [ "${SYSTEM_MILL_VERSION}" = "${MILL_VERSION}" ]; then + MILL="${SYSTEM_MILL_PATH}" fi } try_to_use_system_mill @@ -136,22 +257,34 @@ if [ ! -s "${MILL}" ] ; then if [ -x "${OLD_MILL}" ] ; then MILL="${OLD_MILL}" else - VERSION_PREFIX="$(echo $MILL_VERSION | cut -b -4)" - case $VERSION_PREFIX in - 0.0. | 0.1. | 0.2. | 0.3. | 0.4. ) + case $MILL_VERSION in + 0.0.* | 0.1.* | 0.2.* | 0.3.* | 0.4.* ) DOWNLOAD_SUFFIX="" + DOWNLOAD_FROM_MAVEN=0 + ;; + 0.5.* | 0.6.* | 0.7.* | 0.8.* | 0.9.* | 0.10.* | 0.11.0-M* ) + DOWNLOAD_SUFFIX="-assembly" + DOWNLOAD_FROM_MAVEN=0 ;; *) DOWNLOAD_SUFFIX="-assembly" + DOWNLOAD_FROM_MAVEN=1 ;; esac - unset VERSION_PREFIX DOWNLOAD_FILE=$(mktemp mill.XXXXXX) + + if [ "$DOWNLOAD_FROM_MAVEN" = "1" ] ; then + DOWNLOAD_URL="https://repo1.maven.org/maven2/com/lihaoyi/mill-dist${ARTIFACT_SUFFIX}/${MILL_VERSION}/mill-dist${ARTIFACT_SUFFIX}-${MILL_VERSION}.jar" + else + MILL_VERSION_TAG=$(echo "$MILL_VERSION" | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') + DOWNLOAD_URL="${GITHUB_RELEASE_CDN}${MILL_REPO_URL}/releases/download/${MILL_VERSION_TAG}/${MILL_VERSION}${DOWNLOAD_SUFFIX}" + unset MILL_VERSION_TAG + fi + # TODO: handle command not found - echo "Downloading mill ${MILL_VERSION} from ${MILL_REPO_URL}/releases ..." 1>&2 - MILL_VERSION_TAG=$(echo $MILL_VERSION | sed -E 's/([^-]+)(-M[0-9]+)?(-.*)?/\1\2/') - ${CURL_CMD} -f -L -o "${DOWNLOAD_FILE}" "${MILL_REPO_URL}/releases/download/${MILL_VERSION_TAG}/${MILL_VERSION}${DOWNLOAD_SUFFIX}" + echo "Downloading mill ${MILL_VERSION} from ${DOWNLOAD_URL} ..." 1>&2 + ${CURL_CMD} -f -L -o "${DOWNLOAD_FILE}" "${DOWNLOAD_URL}" chmod +x "${DOWNLOAD_FILE}" mkdir -p "${MILL_DOWNLOAD_PATH}" mv "${DOWNLOAD_FILE}" "${MILL}" @@ -161,11 +294,24 @@ if [ ! -s "${MILL}" ] ; then fi fi +if [ -z "$MILL_MAIN_CLI" ] ; then + MILL_MAIN_CLI="${0}" +fi + +MILL_FIRST_ARG="" +if [ "$1" = "--bsp" ] || [ "$1" = "-i" ] || [ "$1" = "--interactive" ] || [ "$1" = "--no-server" ] || [ "$1" = "--repl" ] || [ "$1" = "--help" ] ; then + # Need to preserve the first position of those listed options + MILL_FIRST_ARG=$1 + shift +fi + unset MILL_DOWNLOAD_PATH unset MILL_OLD_DOWNLOAD_PATH unset OLD_MILL unset MILL_VERSION -unset MILL_VERSION_TAG unset MILL_REPO_URL -exec "${MILL}" "$@" +# -D mill.main.cli is for compatibility with Mill 0.10.9 - 0.13.0-M2 +# We don't quote MILL_FIRST_ARG on purpose, so we can expand the empty value without quotes +# shellcheck disable=SC2086 +exec "${MILL}" $MILL_FIRST_ARG -D "mill.main.cli=${MILL_MAIN_CLI}" "$@" \ No newline at end of file diff --git a/mill.bat b/mill.bat index 584fffb..42cf1fa 100644 --- a/mill.bat +++ b/mill.bat @@ -1,13 +1,32 @@ @echo off -rem This is a wrapper script, that automatically download mill from GitHub release pages -rem You can give the required mill version with --mill-version parameter -rem If no version is given, it falls back to the value of DEFAULT_MILL_VERSION +rem This is a wrapper script, that automatically selects or downloads Mill from Maven Central or GitHub release pages. rem -rem Project page: https://github.com/lefou/millw -rem Script Version: 0.4.2 +rem This script determines the Mill version to use by trying these sources +rem - env-variable `MILL_VERSION` +rem - local file `.mill-version` +rem - local file `.config/mill-version` +rem - `mill-version` from YAML fronmatter of current buildfile +rem - if accessible, find the latest stable version available on Maven Central (https://repo1.maven.org/maven2) +rem - env-variable `DEFAULT_MILL_VERSION` +rem +rem If a version has the suffix '-native' a native binary will be used. +rem If a version has the suffix '-jvm' an executable jar file will be used, requiring an already installed Java runtime. +rem If no such suffix is found, the script will pick a default based on version and platform. +rem +rem Once a version was determined, it tries to use either +rem - a system-installed mill, if found and it's version matches +rem - an already downloaded version under %USERPROFILE%\.mill\download +rem +rem If no working mill version was found on the system, +rem this script downloads a binary file from Maven Central or Github Pages (this is version dependent) +rem into a cache location (%USERPROFILE%\.mill\download). +rem +rem Mill Project URL: https://github.com/com-lihaoyi/mill +rem Script Version: 0.13.0-M2-63-e8edbd rem rem If you want to improve this script, please also contribute your changes back! +rem This script was generated from: scripts/src/mill.bat rem rem Licensed under the Apache License, Version 2.0 @@ -15,27 +34,43 @@ rem setlocal seems to be unavailable on Windows 95/98/ME rem but I don't think we need to support them in 2019 setlocal enabledelayedexpansion -set "DEFAULT_MILL_VERSION=0.11.13" +if [!DEFAULT_MILL_VERSION!]==[] ( + set "DEFAULT_MILL_VERSION=0.11.13" +) + +if [!GITHUB_RELEASE_CDN!]==[] ( + set "GITHUB_RELEASE_CDN=" +) + +if [!MILL_MAIN_CLI!]==[] ( + set "MILL_MAIN_CLI=%~f0" +) set "MILL_REPO_URL=https://github.com/com-lihaoyi/mill" -rem %~1% removes surrounding quotes -if [%~1%]==[--mill-version] ( - rem shift command doesn't work within parentheses - if not [%~2%]==[] ( - set MILL_VERSION=%~2% - set "STRIP_VERSION_PARAMS=true" - ) else ( - echo You specified --mill-version without a version. 1>&2 - echo Please provide a version that matches one provided on 1>&2 - echo %MILL_REPO_URL%/releases 1>&2 - exit /b 1 - ) +SET MILL_BUILD_SCRIPT= + +IF EXIST "build.mill" ( + SET MILL_BUILD_SCRIPT=build.mill +) ELSE IF EXIST "build.mill.scala" ( + SET MILL_BUILD_SCRIPT=build.mill.scala +) ELSE IF EXIST "build.sc" ( + SET MILL_BUILD_SCRIPT=build.sc ) if [!MILL_VERSION!]==[] ( if exist .mill-version ( set /p MILL_VERSION=<.mill-version + ) else ( + if exist .config\mill-version ( + set /p MILL_VERSION=<.config\mill-version + ) else ( + if not "%MILL_BUILD_SCRIPT%"=="" ( + for /f "tokens=1-2*" %%a in ('findstr /r "[/][/][|] *mill-version: *" %MILL_BUILD_SCRIPT%') do ( + set "MILL_VERSION=%%c" + ) + ) + ) ) ) @@ -43,24 +78,117 @@ if [!MILL_VERSION!]==[] ( set MILL_VERSION=%DEFAULT_MILL_VERSION% ) -set MILL_DOWNLOAD_PATH=%USERPROFILE%\.mill\download +if [!MILL_DOWNLOAD_PATH!]==[] ( + set MILL_DOWNLOAD_PATH=%USERPROFILE%\.mill\download +) rem without bat file extension, cmd doesn't seem to be able to run it -set MILL=%MILL_DOWNLOAD_PATH%\!MILL_VERSION!.bat + +set "MILL_NATIVE_SUFFIX=-native" +set "MILL_JVM_SUFFIX=-jvm" +set "FULL_MILL_VERSION=%MILL_VERSION%" +set "MILL_EXT=.bat" +set "ARTIFACT_SUFFIX=" +REM Check if MILL_VERSION contains MILL_NATIVE_SUFFIX +echo !MILL_VERSION! | findstr /C:"%MILL_NATIVE_SUFFIX%" >nul +if !errorlevel! equ 0 ( + set "MILL_VERSION=%MILL_VERSION:-native=%" + REM -native images compiled with graal do not support windows-arm + REM https://github.com/oracle/graal/issues/9215 + IF /I NOT "%PROCESSOR_ARCHITECTURE%"=="ARM64" ( + set "ARTIFACT_SUFFIX=-native-windows-amd64" + set "MILL_EXT=.exe" + ) else ( + rem no-op + ) +) else ( + echo !MILL_VERSION! | findstr /C:"%MILL_JVM_SUFFIX%" >nul + if !errorlevel! equ 0 ( + set "MILL_VERSION=%MILL_VERSION:-jvm=%" + ) else ( + set "SKIP_VERSION=false" + set "PREFIX=%MILL_VERSION:~0,4%" + if "!PREFIX!"=="0.1." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.2." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.3." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.4." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.5." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.6." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.7." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.8." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.9." set "SKIP_VERSION=true" + set "PREFIX=%MILL_VERSION:~0,5%" + if "!PREFIX!"=="0.10." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.11." set "SKIP_VERSION=true" + if "!PREFIX!"=="0.12." set "SKIP_VERSION=true" + + if "!SKIP_VERSION!"=="false" ( + IF /I NOT "%PROCESSOR_ARCHITECTURE%"=="ARM64" ( + set "ARTIFACT_SUFFIX=-native-windows-amd64" + set "MILL_EXT=.exe" + ) + ) else ( + rem no-op + ) + ) +) + +set MILL=%MILL_DOWNLOAD_PATH%\!FULL_MILL_VERSION!!MILL_EXT! if not exist "%MILL%" ( set VERSION_PREFIX=%MILL_VERSION:~0,4% + rem Since 0.5.0 set DOWNLOAD_SUFFIX=-assembly - if [!VERSION_PREFIX!]==[0.0.] set DOWNLOAD_SUFFIX= - if [!VERSION_PREFIX!]==[0.1.] set DOWNLOAD_SUFFIX= - if [!VERSION_PREFIX!]==[0.2.] set DOWNLOAD_SUFFIX= - if [!VERSION_PREFIX!]==[0.3.] set DOWNLOAD_SUFFIX= - if [!VERSION_PREFIX!]==[0.4.] set DOWNLOAD_SUFFIX= + rem Since 0.11.0 + set DOWNLOAD_FROM_MAVEN=1 + if [!VERSION_PREFIX!]==[0.0.] ( + set DOWNLOAD_SUFFIX= + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.1.] ( + set DOWNLOAD_SUFFIX= + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.2.] ( + set DOWNLOAD_SUFFIX= + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.3.] ( + set DOWNLOAD_SUFFIX= + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.4.] ( + set DOWNLOAD_SUFFIX= + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.5.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.6.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.7.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.8.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + if [!VERSION_PREFIX!]==[0.9.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + set VERSION_PREFIX=%MILL_VERSION:~0,5% + if [!VERSION_PREFIX!]==[0.10.] ( + set DOWNLOAD_FROM_MAVEN=0 + ) + set VERSION_PREFIX=%MILL_VERSION:~0,8% + if [!VERSION_PREFIX!]==[0.11.0-M] ( + set DOWNLOAD_FROM_MAVEN=0 + ) set VERSION_PREFIX= for /F "delims=- tokens=1" %%A in ("!MILL_VERSION!") do set MILL_VERSION_BASE=%%A for /F "delims=- tokens=2" %%A in ("!MILL_VERSION!") do set MILL_VERSION_MILESTONE=%%A - set VERSION_MILESTONE_START=!MILL_VERSION_MILESTONE:~0,1! + set VERSION_MILESTONE_START=!MILL_VERSION_MILESTONE:~0,1! if [!VERSION_MILESTONE_START!]==[M] ( set MILL_VERSION_TAG="!MILL_VERSION_BASE!-!MILL_VERSION_MILESTONE!" ) else ( @@ -70,15 +198,19 @@ if not exist "%MILL%" ( rem there seems to be no way to generate a unique temporary file path (on native Windows) set DOWNLOAD_FILE=%MILL%.tmp - set DOWNLOAD_URL=%MILL_REPO_URL%/releases/download/!MILL_VERSION_TAG!/!MILL_VERSION!!DOWNLOAD_SUFFIX! + if [!DOWNLOAD_FROM_MAVEN!]==[1] ( + set DOWNLOAD_URL=https://repo1.maven.org/maven2/com/lihaoyi/mill-dist!ARTIFACT_SUFFIX!/!MILL_VERSION!/mill-dist!ARTIFACT_SUFFIX!-!MILL_VERSION!.jar + ) else ( + set DOWNLOAD_URL=!GITHUB_RELEASE_CDN!%MILL_REPO_URL%/releases/download/!MILL_VERSION_TAG!/!MILL_VERSION!!DOWNLOAD_SUFFIX! + ) - echo Downloading mill %MILL_VERSION% from %MILL_REPO_URL%/releases ... 1>&2 + echo Downloading mill !MILL_VERSION! from !DOWNLOAD_URL! ... 1>&2 if not exist "%MILL_DOWNLOAD_PATH%" mkdir "%MILL_DOWNLOAD_PATH%" rem curl is bundled with recent Windows 10 rem but I don't think we can expect all the users to have it in 2019 where /Q curl - if %ERRORLEVEL% EQU 0 ( + if !ERRORLEVEL! EQU 0 ( curl -f -L "!DOWNLOAD_URL!" -o "!DOWNLOAD_FILE!" ) else ( rem bitsadmin seems to be available on Windows 7 @@ -87,7 +219,7 @@ if not exist "%MILL%" ( bitsadmin /transfer millDownloadJob /dynamic /priority foreground "!DOWNLOAD_URL!" "!DOWNLOAD_FILE!" ) if not exist "!DOWNLOAD_FILE!" ( - echo Could not download mill %MILL_VERSION% 1>&2 + echo Could not download mill !MILL_VERSION! 1>&2 exit /b 1 ) @@ -101,15 +233,39 @@ set MILL_DOWNLOAD_PATH= set MILL_VERSION= set MILL_REPO_URL= -set MILL_PARAMS=%* - -if defined STRIP_VERSION_PARAMS ( - for /f "tokens=1-2*" %%a in ("%*") do ( - rem strip %%a - It's the "--mill-version" option. - rem strip %%b - it's the version number that comes after the option. - rem keep %%c - It's the remaining options. - set MILL_PARAMS=%%c +rem Need to preserve the first position of those listed options +set MILL_FIRST_ARG= +if [%~1%]==[--bsp] ( + set MILL_FIRST_ARG=%1% +) else ( + if [%~1%]==[-i] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--interactive] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--no-server] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--repl] ( + set MILL_FIRST_ARG=%1% + ) else ( + if [%~1%]==[--help] ( + set MILL_FIRST_ARG=%1% + ) + ) + ) ) + ) +) + +set "MILL_PARAMS=%*%" + +if not [!MILL_FIRST_ARG!]==[] ( + for /f "tokens=1*" %%a in ("%*") do ( + set "MILL_PARAMS=%%b" + ) ) -"%MILL%" %MILL_PARAMS% +rem -D mill.main.cli is for compatibility with Mill 0.10.9 - 0.13.0-M2 +"%MILL%" %MILL_FIRST_ARG% -D "mill.main.cli=%MILL_MAIN_CLI%" %MILL_PARAMS% \ No newline at end of file From 80391eb4d69699af589add86fce834f62764b5dc Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 8 May 2025 15:21:07 +0200 Subject: [PATCH 2/4] Bump `mill` to 0.12.10 --- .github/workflows/ci.yml | 22 ++++----- .mill-version | 2 +- build.sc | 98 +++++++++++++++++++++++++--------------- mill | 2 +- mill.bat | 2 +- 5 files changed, 75 insertions(+), 51 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80d131a..54b0ad0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,14 +23,14 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "java-class-name.writeNativeImageScript" generate.sh "" && \ + ./mill -i "java-class-name.writeNativeImageScript" --scriptDest generate.sh --imageDest "" && \ ./generate.sh && \ - ./mill -i "java-class-name.copyToArtifacts" artifacts/ + ./mill -i "java-class-name.copyToArtifacts" --directory artifacts/ if: runner.os != 'Windows' - run: | - @call ./mill.bat -i "java-class-name.writeNativeImageScript" generate.bat "" + @call ./mill.bat -i "java-class-name.writeNativeImageScript" --scriptDest generate.bat --imageDest "" @call generate.bat - @call ./mill.bat -i "java-class-name.copyToArtifacts" artifacts/ + @call ./mill.bat -i "java-class-name.copyToArtifacts" --directory artifacts/ shell: cmd if: runner.os == 'Windows' - name: Test @@ -41,7 +41,7 @@ jobs: path: artifacts/ if-no-files-found: error retention-days: 1 - - run: ./mill -i ci.upload artifacts/ + - run: ./mill -i ci.upload --directory artifacts/ if: github.event_name == 'push' env: UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -58,9 +58,9 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "java-class-name.static.writeNativeImageScript" generate.sh "" && \ + ./mill -i "java-class-name.static.writeNativeImageScript" --scriptDest generate.sh --imageDest "" && \ ./generate.sh && \ - ./mill -i "java-class-name.static.copyToArtifacts" artifacts/ + ./mill -i "java-class-name.static.copyToArtifacts" --directory artifacts/ - uses: actions/upload-artifact@v4 with: name: launcher-linux-static @@ -69,7 +69,7 @@ jobs: retention-days: 1 - name: Test run: ./mill -i java-class-name-tests.static.test - - run: ./mill -i ci.upload artifacts/ + - run: ./mill -i ci.upload --directory artifacts/ if: github.event_name == 'push' env: UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -86,9 +86,9 @@ jobs: with: jvm: temurin:17 - run: | - ./mill -i "java-class-name.mostly-static.writeNativeImageScript" generate.sh "" && \ + ./mill -i "java-class-name.mostly-static.writeNativeImageScript" --scriptDest generate.sh --imageDest "" && \ ./generate.sh && \ - ./mill -i "java-class-name.mostly-static.copyToArtifacts" artifacts/ + ./mill -i "java-class-name.mostly-static.copyToArtifacts" --directory artifacts/ - uses: actions/upload-artifact@v4 with: name: launcher-linux-mostly-static @@ -97,7 +97,7 @@ jobs: retention-days: 1 - name: Test run: ./mill -i java-class-name-tests.mostly-static.test - - run: ./mill -i ci.upload artifacts/ + - run: ./mill -i ci.upload --directory artifacts/ if: github.event_name == 'push' env: UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.mill-version b/.mill-version index 44ab23e..54dbed4 100644 --- a/.mill-version +++ b/.mill-version @@ -1 +1 @@ -0.11.13 +0.12.10 diff --git a/build.sc b/build.sc index 85d3a9f..e0dc165 100644 --- a/build.sc +++ b/build.sc @@ -1,15 +1,15 @@ import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.1` import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.31-1` import $ivy.`io.github.alexarchambault.mill::mill-native-image-upload:0.1.31-1` - import de.tobiasroeser.mill.vcs.version._ import io.github.alexarchambault.millnativeimage.NativeImage import io.github.alexarchambault.millnativeimage.upload.Upload import mill._ import mill.scalalib._ -import coursier.core.Version -import scala.concurrent.duration.DurationInt +import coursier.core.{Dependency, DependencyManagement} +import coursier.version.VersionConstraint +import scala.concurrent.duration.DurationInt import java.io.File object Versions { @@ -23,8 +23,7 @@ object Versions { } trait JavaMainClassNativeImage extends NativeImage { - - def nativeImageOptions = T{ + def nativeImageOptions = T { super.nativeImageOptions() ++ Seq( "--no-fallback" ) @@ -33,14 +32,15 @@ trait JavaMainClassNativeImage extends NativeImage { def nativeImageGraalVmJvmId = s"graalvm-java17:${Versions.graalVmVersion}" def nativeImageName = "java-class-name" def nativeImageMainClass = "scala.cli.javaclassname.JavaClassName" - def nameSuffix = "" + def copyToArtifacts(directory: String = "artifacts/") = T.command { - val _ = Upload.copyLauncher( - nativeImage().path, - directory, - "java-class-name", + val _ = Upload.copyLauncher0( + nativeLauncher = nativeImage().path, + directory = directory, + name = "java-class-name", compress = true, + workspace = T.workspace, suffix = nameSuffix ) } @@ -48,22 +48,29 @@ trait JavaMainClassNativeImage extends NativeImage { trait JavaClassNameModule extends ScalaModule { override def scalaVersion = Versions.scala - override def transitiveIvyDeps = T { - super.transitiveIvyDeps() - .map(_.exclude("org.jline" -> "jline-reader")) - .map(_.exclude("org.jline" -> "jline-terminal")) - .map(_.exclude("org.jline" -> "jline-terminal-jna")) - .map(_.exclude("org.jline" -> "jline-terminal-jni")) - .map(_.exclude("org.jline" -> "jline-native")) - } + + private def jlineOrg = "org.jline" def jlineDeps = Agg( - ivy"org.jline:jline-reader:${Versions.jline}", - ivy"org.jline:jline-terminal:${Versions.jline}", - ivy"org.jline:jline-terminal-jna:${Versions.jline}", - ivy"org.jline:jline-terminal-jni:${Versions.jline}", - ivy"org.jline:jline-native:${Versions.jline}" + ivy"$jlineOrg:jline-reader:${Versions.jline}", + ivy"$jlineOrg:jline-terminal:${Versions.jline}", + ivy"$jlineOrg:jline-terminal-jna:${Versions.jline}", + ivy"$jlineOrg:jline-terminal-jni:${Versions.jline}", + ivy"$jlineOrg:jline-native:${Versions.jline}" ) - override def ivyDeps = super.ivyDeps() ++ jlineDeps + + override def coursierDependency: Dependency = + super.coursierDependency + .addOverrides( + jlineDeps.toSeq.map(jd => DependencyManagement.Key.from(jd.toDependency(jd.version, jd.version, "")) -> + DependencyManagement.Values.empty.withVersionConstraint(VersionConstraint.Lazy(Versions.jline))) + ) + + override def allIvyDeps = T { + super.allIvyDeps() + .map(_.exclude(jlineOrg -> "jline-*")) ++ jlineDeps + } + + override def ivyDeps = super.ivyDeps().map(_.exclude("org.jline" -> "jline-*")) ++ jlineDeps } object `scala3-graal-processor` extends JavaClassNameModule { @@ -78,41 +85,47 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma // adapted from https://github.com/VirtusLab/scala-cli/blob/b19086697401827a6f8185040ceb248d8865bf21/build.sc#L732-L744 val classpath = runClasspath().map(_.path).mkString(File.pathSeparator) - val cache = T.dest / "native-cp" + val cache = T.dest / "native-cp" // `scala3-graal-processor`.run() do not give me output and I cannot pass dynamically computed values like classpath System.err.println("Calling scala3 graal processor on") for (f <- classpath.split(File.pathSeparator)) System.err.println(s" $f") - val res = mill.modules.Jvm.callSubprocess( + val res = mill.util.Jvm.callProcess( mainClass = `scala3-graal-processor`.finalMainClass(), classPath = `scala3-graal-processor`.runClasspath().map(_.path), - mainArgs = Seq(cache.toNIO.toString, classpath), - workingDir = os.pwd + mainArgs = Seq(cache.toNIO.toString, classpath) ) val cp = res.out.text.trim + if (cp.isBlank) System.err.println("class path can't be empty!") + assert(cp.nonEmpty) System.err.println("Processed class path:") for (f <- cp.split(File.pathSeparator)) System.err.println(s" $f") cp.split(File.pathSeparator).toSeq.map(p => mill.PathRef(os.Path(p))) } + override def ivyDeps = super.ivyDeps() ++ jlineDeps ++ Agg( ivy"org.scala-lang::scala3-compiler:${Versions.scala}" ) + override def compileIvyDeps = super.compileIvyDeps() ++ Agg( ivy"org.graalvm.nativeimage:svm:${Versions.graalVmVersion}" ) object static extends JavaMainClassNativeImage { def nameSuffix = "-static" - def nativeImageClassPath = T{ + + def nativeImageClassPath = T { `java-class-name`.nativeImageClassPath() } + def buildHelperImage = T { os.proc("docker", "build", "-t", "scala-cli-base-musl:latest", ".") - .call(cwd = os.pwd / "musl-image", stdout = os.Inherit) + .call(cwd = T.workspace / "musl-image", stdout = os.Inherit) () } - def nativeImageDockerParams = T{ + + def nativeImageDockerParams = T { buildHelperImage() Some( NativeImage.linuxStaticParams( @@ -121,6 +134,7 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma ) ) } + def writeNativeImageScript(scriptDest: String, imageDest: String = "") = T.command { buildHelperImage() super.writeNativeImageScript(scriptDest, imageDest)() @@ -129,9 +143,10 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma object `mostly-static` extends JavaMainClassNativeImage { def nameSuffix = "-mostly-static" - def nativeImageClassPath = T{ + def nativeImageClassPath = T { `java-class-name`.nativeImageClassPath() } + def nativeImageDockerParams = Some( NativeImage.linuxMostlyStaticParams( "ubuntu:18.04", // TODO Pin that? @@ -142,24 +157,29 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma } object `java-class-name-tests` extends JavaClassNameModule with SbtModule { - trait Tests extends ScalaModule with super.SbtModuleTests with TestModule.Utest { + trait Tests extends ScalaModule with super.SbtTests with TestModule.Utest { def launcher: T[PathRef] def ivyDeps = super.ivyDeps() ++ jlineDeps ++ Seq( ivy"com.lihaoyi::os-lib:${Versions.osLib}", ivy"com.lihaoyi::utest:${Versions.uTest}" ) + def testFramework = "utest.runner.Framework" + def forkEnv = super.forkEnv() ++ Seq( "JAVA_CLASS_NAME_CLI" -> launcher().path.toString ) } + object test extends Tests { def launcher = `java-class-name`.nativeImage() } + object static extends Tests { def sources = T.sources(`java-class-name-tests`.test.sources()) def launcher = `java-class-name`.static.nativeImage() } + object `mostly-static` extends Tests { def sources = T.sources(`java-class-name-tests`.test.sources()) def launcher = `java-class-name`.`mostly-static`.nativeImage() @@ -190,8 +210,11 @@ def publishVersion0 = T { def ghOrg = "VirtusLab" def ghName = "java-class-name" + trait JavaClassNamePublishModule extends PublishModule { + import mill.scalalib.publish._ + def pomSettings = PomSettings( description = artifactName(), organization = "org.virtuslab.scala-cli.java-class-name", @@ -213,6 +236,7 @@ trait JavaClassNamePublishModule extends PublishModule { ) ) ) + def publishVersion = publishVersion0() } @@ -226,9 +250,9 @@ object ci extends Module { } private def publishSonatype0( - data: Seq[PublishModule.PublishData], - log: mill.api.Logger - ): Unit = { + data: Seq[PublishModule.PublishData], + log: mill.api.Logger + ): Unit = { val credentials = sys.env("SONATYPE_USERNAME") + ":" + sys.env("SONATYPE_PASSWORD") val pgpPassword = sys.env("PGP_PASSWORD") @@ -276,7 +300,7 @@ object ci extends Module { def upload(directory: String = "artifacts/") = T.command { val version = publishVersion0() - val path = os.Path(directory, os.pwd) + val path = os.Path(directory, T.workspace) val launchers = os.list(path).filter(os.isFile(_)).map { path => path -> path.last } diff --git a/mill b/mill index 504bb89..1269a52 100755 --- a/mill +++ b/mill @@ -33,7 +33,7 @@ set -e if [ -z "${DEFAULT_MILL_VERSION}" ] ; then - DEFAULT_MILL_VERSION="0.11.13" + DEFAULT_MILL_VERSION="0.12.10" fi diff --git a/mill.bat b/mill.bat index 42cf1fa..51ae8b7 100644 --- a/mill.bat +++ b/mill.bat @@ -35,7 +35,7 @@ rem but I don't think we need to support them in 2019 setlocal enabledelayedexpansion if [!DEFAULT_MILL_VERSION!]==[] ( - set "DEFAULT_MILL_VERSION=0.11.13" + set "DEFAULT_MILL_VERSION=0.12.10" ) if [!GITHUB_RELEASE_CDN!]==[] ( From bf4cd7f7c0642edd232d9188744ce2a1a437424d Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 8 May 2025 15:37:26 +0200 Subject: [PATCH 3/4] Migrate `build.sc` to `build.mill.scala` --- build.sc => build.mill.scala | 83 +++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 40 deletions(-) rename build.sc => build.mill.scala (77%) diff --git a/build.sc b/build.mill.scala similarity index 77% rename from build.sc rename to build.mill.scala index e0dc165..8f3b78b 100644 --- a/build.sc +++ b/build.mill.scala @@ -8,7 +8,9 @@ import mill._ import mill.scalalib._ import coursier.core.{Dependency, DependencyManagement} import coursier.version.VersionConstraint +import mill.api.Loose +import scala.annotation.unused import scala.concurrent.duration.DurationInt import java.io.File @@ -23,34 +25,35 @@ object Versions { } trait JavaMainClassNativeImage extends NativeImage { - def nativeImageOptions = T { + def nativeImageOptions: Target[Seq[String]] = Task { super.nativeImageOptions() ++ Seq( "--no-fallback" ) } - def nativeImagePersist = System.getenv("CI") != null + def nativeImagePersist: Boolean = System.getenv("CI") != null def nativeImageGraalVmJvmId = s"graalvm-java17:${Versions.graalVmVersion}" def nativeImageName = "java-class-name" def nativeImageMainClass = "scala.cli.javaclassname.JavaClassName" def nameSuffix = "" - def copyToArtifacts(directory: String = "artifacts/") = T.command { + @unused + def copyToArtifacts(directory: String = "artifacts/"): Command[Unit] = Task.Command { val _ = Upload.copyLauncher0( nativeLauncher = nativeImage().path, directory = directory, name = "java-class-name", compress = true, - workspace = T.workspace, + workspace = Task.workspace, suffix = nameSuffix ) } } trait JavaClassNameModule extends ScalaModule { - override def scalaVersion = Versions.scala + override def scalaVersion: Target[String] = Versions.scala private def jlineOrg = "org.jline" - def jlineDeps = Agg( + def jlineDeps: Loose.Agg[Dep] = Agg( ivy"$jlineOrg:jline-reader:${Versions.jline}", ivy"$jlineOrg:jline-terminal:${Versions.jline}", ivy"$jlineOrg:jline-terminal-jna:${Versions.jline}", @@ -65,27 +68,27 @@ trait JavaClassNameModule extends ScalaModule { DependencyManagement.Values.empty.withVersionConstraint(VersionConstraint.Lazy(Versions.jline))) ) - override def allIvyDeps = T { + override def allIvyDeps: Target[Agg[Dep]] = Task { super.allIvyDeps() .map(_.exclude(jlineOrg -> "jline-*")) ++ jlineDeps } - override def ivyDeps = super.ivyDeps().map(_.exclude("org.jline" -> "jline-*")) ++ jlineDeps + override def ivyDeps: Target[Agg[Dep]] = super.ivyDeps().map(_.exclude("org.jline" -> "jline-*")) ++ jlineDeps } object `scala3-graal-processor` extends JavaClassNameModule { - override def mainClass = Some("scala.cli.graal.CoursierCacheProcessor") - override def ivyDeps = jlineDeps ++ Agg( + override def mainClass: Target[Option[String]] = Some("scala.cli.graal.CoursierCacheProcessor") + override def ivyDeps: Target[Agg[Dep]] = jlineDeps ++ Agg( ivy"org.virtuslab.scala-cli::scala3-graal:${Versions.scalaCli}" ) } object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeImage with JavaClassNamePublishModule { - def nativeImageClassPath = T { + def nativeImageClassPath: Target[Seq[PathRef]] = Task { // adapted from https://github.com/VirtusLab/scala-cli/blob/b19086697401827a6f8185040ceb248d8865bf21/build.sc#L732-L744 val classpath = runClasspath().map(_.path).mkString(File.pathSeparator) - val cache = T.dest / "native-cp" + val cache = Task.dest / "native-cp" // `scala3-graal-processor`.run() do not give me output and I cannot pass dynamically computed values like classpath System.err.println("Calling scala3 graal processor on") for (f <- classpath.split(File.pathSeparator)) @@ -95,7 +98,7 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma classPath = `scala3-graal-processor`.runClasspath().map(_.path), mainArgs = Seq(cache.toNIO.toString, classpath) ) - val cp = res.out.text.trim + val cp = res.out.trim() if (cp.isBlank) System.err.println("class path can't be empty!") assert(cp.nonEmpty) System.err.println("Processed class path:") @@ -104,28 +107,28 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma cp.split(File.pathSeparator).toSeq.map(p => mill.PathRef(os.Path(p))) } - override def ivyDeps = super.ivyDeps() ++ jlineDeps ++ Agg( + override def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ jlineDeps ++ Agg( ivy"org.scala-lang::scala3-compiler:${Versions.scala}" ) - override def compileIvyDeps = super.compileIvyDeps() ++ Agg( + override def compileIvyDeps: Target[Agg[Dep]] = super.compileIvyDeps() ++ Agg( ivy"org.graalvm.nativeimage:svm:${Versions.graalVmVersion}" ) object static extends JavaMainClassNativeImage { def nameSuffix = "-static" - def nativeImageClassPath = T { + def nativeImageClassPath: Target[Seq[PathRef]] = Task { `java-class-name`.nativeImageClassPath() } - def buildHelperImage = T { + def buildHelperImage: Target[Unit] = Task { os.proc("docker", "build", "-t", "scala-cli-base-musl:latest", ".") - .call(cwd = T.workspace / "musl-image", stdout = os.Inherit) + .call(cwd = Task.workspace / "musl-image", stdout = os.Inherit) () } - def nativeImageDockerParams = T { + def nativeImageDockerParams: Target[Option[NativeImage.DockerParams]] = Task { buildHelperImage() Some( NativeImage.linuxStaticParams( @@ -135,7 +138,7 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma ) } - def writeNativeImageScript(scriptDest: String, imageDest: String = "") = T.command { + def writeNativeImageScript(scriptDest: String, imageDest: String = ""): Command[Unit] = Task.Command { buildHelperImage() super.writeNativeImageScript(scriptDest, imageDest)() } @@ -143,11 +146,11 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma object `mostly-static` extends JavaMainClassNativeImage { def nameSuffix = "-mostly-static" - def nativeImageClassPath = T { + def nativeImageClassPath: Target[Seq[PathRef]] = Task { `java-class-name`.nativeImageClassPath() } - def nativeImageDockerParams = Some( + def nativeImageDockerParams: Target[Option[NativeImage.DockerParams]] = Some( NativeImage.linuxMostlyStaticParams( "ubuntu:18.04", // TODO Pin that? s"https://github.com/coursier/coursier/releases/download/v${Versions.coursier}/cs-x86_64-pc-linux.gz" @@ -158,35 +161,35 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma object `java-class-name-tests` extends JavaClassNameModule with SbtModule { trait Tests extends ScalaModule with super.SbtTests with TestModule.Utest { - def launcher: T[PathRef] - def ivyDeps = super.ivyDeps() ++ jlineDeps ++ Seq( + def launcher: Target[PathRef] + def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ jlineDeps ++ Seq( ivy"com.lihaoyi::os-lib:${Versions.osLib}", ivy"com.lihaoyi::utest:${Versions.uTest}" ) def testFramework = "utest.runner.Framework" - def forkEnv = super.forkEnv() ++ Seq( + def forkEnv: Target[Map[String, String]] = super.forkEnv() ++ Seq( "JAVA_CLASS_NAME_CLI" -> launcher().path.toString ) } object test extends Tests { - def launcher = `java-class-name`.nativeImage() + def launcher: Target[PathRef] = `java-class-name`.nativeImage() } object static extends Tests { - def sources = T.sources(`java-class-name-tests`.test.sources()) - def launcher = `java-class-name`.static.nativeImage() + def sources: Target[Seq[PathRef]] = Task.Sources(`java-class-name-tests`.test.sources()) + def launcher: Target[PathRef] = `java-class-name`.static.nativeImage() } object `mostly-static` extends Tests { - def sources = T.sources(`java-class-name-tests`.test.sources()) - def launcher = `java-class-name`.`mostly-static`.nativeImage() + def sources: Target[Seq[PathRef]] = Task.Sources(`java-class-name-tests`.test.sources()) + def launcher: Target[PathRef] = `java-class-name`.`mostly-static`.nativeImage() } } -def publishVersion0 = T { +def publishVersion0: Target[String] = Task { val state = VcsVersion.vcsState() if (state.commitsSinceLastTag > 0) { val versionOrEmpty = state.lastTag @@ -215,7 +218,7 @@ trait JavaClassNamePublishModule extends PublishModule { import mill.scalalib.publish._ - def pomSettings = PomSettings( + def pomSettings: Target[PomSettings] = PomSettings( description = artifactName(), organization = "org.virtuslab.scala-cli.java-class-name", url = s"https://github.com/$ghOrg/$ghName", @@ -237,15 +240,16 @@ trait JavaClassNamePublishModule extends PublishModule { ) ) - def publishVersion = - publishVersion0() + def publishVersion: Target[String] = publishVersion0() } +@unused object ci extends Module { - def publishSonatype(tasks: mill.main.Tasks[PublishModule.PublishData]) = T.command { + @unused + def publishSonatype(tasks: mill.main.Tasks[PublishModule.PublishData]): Command[Unit] = Task.Command { publishSonatype0( data = define.Target.sequence(tasks.value)(), - log = T.ctx().log + log = Task.ctx().log ) } @@ -276,7 +280,6 @@ object ci extends Module { snapshotUri = "https://oss.sonatype.org/content/repositories/snapshots", credentials = credentials, signed = true, - // format: off gpgArgs = Seq( "--detach-sign", "--batch=true", @@ -286,7 +289,6 @@ object ci extends Module { "--armor", "--use-agent" ), - // format: on readTimeout = timeout.toMillis.toInt, connectTimeout = timeout.toMillis.toInt, log = log, @@ -297,10 +299,11 @@ object ci extends Module { publisher.publishAll(isRelease, artifacts: _*) } - def upload(directory: String = "artifacts/") = T.command { + @unused + def upload(directory: String = "artifacts/"): Command[Unit] = Task.Command { val version = publishVersion0() - val path = os.Path(directory, T.workspace) + val path = os.Path(directory, Task.workspace) val launchers = os.list(path).filter(os.isFile(_)).map { path => path -> path.last } From 2c3bffcf2bd2b8cbe4b008d886887674af5d1c1c Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Thu, 8 May 2025 16:25:58 +0200 Subject: [PATCH 4/4] Pin docker ubuntu version & bump to 24.04 --- build.mill.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.mill.scala b/build.mill.scala index 8f3b78b..e93d66b 100644 --- a/build.mill.scala +++ b/build.mill.scala @@ -22,6 +22,7 @@ object Versions { def osLib = "0.11.4" def uTest = "0.8.5" def jline = "3.25.0" + def ubuntu = "24.04" } trait JavaMainClassNativeImage extends NativeImage { @@ -152,7 +153,7 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma def nativeImageDockerParams: Target[Option[NativeImage.DockerParams]] = Some( NativeImage.linuxMostlyStaticParams( - "ubuntu:18.04", // TODO Pin that? + s"ubuntu:${Versions.ubuntu}", s"https://github.com/coursier/coursier/releases/download/v${Versions.coursier}/cs-x86_64-pc-linux.gz" ) )