diff --git a/.azure-pipelines/azure-pipelines-linux.yml b/.azure-pipelines/azure-pipelines-linux.yml index 9514627e7..f3792dd3f 100755 --- a/.azure-pipelines/azure-pipelines-linux.yml +++ b/.azure-pipelines/azure-pipelines-linux.yml @@ -8,12 +8,8 @@ jobs: vmImage: ubuntu-latest strategy: matrix: - linux_64_: - CONFIG: linux_64_ - UPLOAD_PACKAGES: 'True' - DOCKER_IMAGE: quay.io/condaforge/linux-anvil-alma-x86_64:8 - linux_aarch64_: - CONFIG: linux_aarch64_ + linux_ppc64le_: + CONFIG: linux_ppc64le_ UPLOAD_PACKAGES: 'True' DOCKER_IMAGE: quay.io/condaforge/linux-anvil-cos7-x86_64 timeoutInMinutes: 360 diff --git a/.azure-pipelines/azure-pipelines-osx.yml b/.azure-pipelines/azure-pipelines-osx.yml deleted file mode 100755 index ac0bf384e..000000000 --- a/.azure-pipelines/azure-pipelines-osx.yml +++ /dev/null @@ -1,40 +0,0 @@ -# This file was generated automatically from conda-smithy. To update this configuration, -# update the conda-forge.yml and/or the recipe/meta.yaml. -# -*- mode: yaml -*- - -jobs: -- job: osx - pool: - vmImage: macOS-13 - strategy: - matrix: - osx_64_: - CONFIG: osx_64_ - UPLOAD_PACKAGES: 'True' - osx_arm64_: - CONFIG: osx_arm64_ - UPLOAD_PACKAGES: 'True' - timeoutInMinutes: 360 - variables: {} - - steps: - # TODO: Fast finish on azure pipelines? - - script: | - export CI=azure - export flow_run_id=azure_$(Build.BuildNumber).$(System.JobAttempt) - export remote_url=$(Build.Repository.Uri) - export sha=$(Build.SourceVersion) - export OSX_FORCE_SDK_DOWNLOAD="1" - export GIT_BRANCH=$BUILD_SOURCEBRANCHNAME - export FEEDSTOCK_NAME=$(basename ${BUILD_REPOSITORY_NAME}) - if [[ "${BUILD_REASON:-}" == "PullRequest" ]]; then - export IS_PR_BUILD="True" - else - export IS_PR_BUILD="False" - fi - ./.scripts/run_osx_build.sh - displayName: Run OSX build - env: - BINSTAR_TOKEN: $(BINSTAR_TOKEN) - FEEDSTOCK_TOKEN: $(FEEDSTOCK_TOKEN) - STAGING_BINSTAR_TOKEN: $(STAGING_BINSTAR_TOKEN) \ No newline at end of file diff --git a/.azure-pipelines/azure-pipelines-win.yml b/.azure-pipelines/azure-pipelines-win.yml deleted file mode 100755 index 990191763..000000000 --- a/.azure-pipelines/azure-pipelines-win.yml +++ /dev/null @@ -1,37 +0,0 @@ -# This file was generated automatically from conda-smithy. To update this configuration, -# update the conda-forge.yml and/or the recipe/meta.yaml. -# -*- mode: yaml -*- - -jobs: -- job: win - pool: - vmImage: windows-2022 - strategy: - matrix: - win_64_: - CONFIG: win_64_ - UPLOAD_PACKAGES: 'True' - timeoutInMinutes: 360 - variables: - CONDA_BLD_PATH: D:\\bld\\ - MINIFORGE_HOME: D:\Miniforge - UPLOAD_TEMP: D:\\tmp - - steps: - - - script: | - call ".scripts\run_win_build.bat" - displayName: Run Windows build - env: - MINIFORGE_HOME: $(MINIFORGE_HOME) - PYTHONUNBUFFERED: 1 - CONFIG: $(CONFIG) - CI: azure - flow_run_id: azure_$(Build.BuildNumber).$(System.JobAttempt) - remote_url: $(Build.Repository.Uri) - sha: $(Build.SourceVersion) - UPLOAD_PACKAGES: $(UPLOAD_PACKAGES) - UPLOAD_TEMP: $(UPLOAD_TEMP) - BINSTAR_TOKEN: $(BINSTAR_TOKEN) - FEEDSTOCK_TOKEN: $(FEEDSTOCK_TOKEN) - STAGING_BINSTAR_TOKEN: $(STAGING_BINSTAR_TOKEN) \ No newline at end of file diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_.yaml deleted file mode 100644 index c7f8ba8fa..000000000 --- a/.ci_support/linux_64_.yaml +++ /dev/null @@ -1,31 +0,0 @@ -c_compiler: -- gcc -c_compiler_version: -- '13' -c_stdlib: -- sysroot -c_stdlib_version: -- '2.28' -cdt_name: -- cos7 -channel_sources: -- conda-forge -channel_targets: -- conda-forge main -cxx_compiler: -- gxx -cxx_compiler_version: -- '13' -docker_image: -- quay.io/condaforge/linux-anvil-alma-x86_64:8 -target_platform: -- linux-64 -zip_keys: -- - c_compiler_version - - cxx_compiler_version -- - c_stdlib_version - - cdt_name -zlib: -- '1' -zstd: -- '1.5' diff --git a/.ci_support/linux_aarch64_.yaml b/.ci_support/linux_aarch64_.yaml deleted file mode 100644 index d45fc59a9..000000000 --- a/.ci_support/linux_aarch64_.yaml +++ /dev/null @@ -1,35 +0,0 @@ -BUILD: -- aarch64-conda_cos7-linux-gnu -c_compiler: -- gcc -c_compiler_version: -- '13' -c_stdlib: -- sysroot -c_stdlib_version: -- '2.28' -cdt_arch: -- aarch64 -cdt_name: -- cos7 -channel_sources: -- conda-forge -channel_targets: -- conda-forge main -cxx_compiler: -- gxx -cxx_compiler_version: -- '13' -docker_image: -- quay.io/condaforge/linux-anvil-cos7-x86_64 -target_platform: -- linux-aarch64 -zip_keys: -- - c_compiler_version - - cxx_compiler_version -- - c_stdlib_version - - cdt_name -zlib: -- '1' -zstd: -- '1.5' diff --git a/.ci_support/linux_ppc64le_.yaml b/.ci_support/linux_ppc64le_.yaml new file mode 100644 index 000000000..3e92dbcf1 --- /dev/null +++ b/.ci_support/linux_ppc64le_.yaml @@ -0,0 +1,40 @@ +c_compiler: +- gcc +c_compiler_version: +- '13' +c_stdlib: +- sysroot +c_stdlib_version: +- '2.28' +cdt_name: +- conda +channel_sources: +- conda-forge +channel_targets: +- conda-forge main +docker_image: +- quay.io/condaforge/linux-anvil-cos7-x86_64 +target_platform: +- linux-ppc64le +zlib: +- '1' +zstd: +- '1.5' +build_platform: +- linux-64 +CMAKE_CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static +CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static +build_platform: +- linux-64 +CMAKE_CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static +CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static +build_platform: +- linux-64 +CMAKE_CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static +CROSSCOMPILING_EMULATOR: +- /usr/bin/qemu-ppc64le-static diff --git a/.ci_support/osx_64_.yaml b/.ci_support/osx_64_.yaml deleted file mode 100644 index 4b1cc3d0a..000000000 --- a/.ci_support/osx_64_.yaml +++ /dev/null @@ -1,31 +0,0 @@ -MACOSX_DEPLOYMENT_TARGET: -- '11.3' -MACOSX_SDK_VERSION: -- '11.3' -c_compiler: -- clang -c_compiler_version: -- '17' -c_stdlib: -- macosx_deployment_target -c_stdlib_version: -- '11.3' -channel_sources: -- conda-forge -channel_targets: -- conda-forge main -cxx_compiler: -- clangxx -cxx_compiler_version: -- '17' -macos_machine: -- x86_64-apple-darwin13.4.0 -target_platform: -- osx-64 -zip_keys: -- - c_compiler_version - - cxx_compiler_version -zlib: -- '1' -zstd: -- '1.5' diff --git a/.ci_support/osx_arm64_.yaml b/.ci_support/osx_arm64_.yaml deleted file mode 100644 index 5f91874f5..000000000 --- a/.ci_support/osx_arm64_.yaml +++ /dev/null @@ -1,31 +0,0 @@ -MACOSX_DEPLOYMENT_TARGET: -- '11.0' -MACOSX_SDK_VERSION: -- '11.0' -c_compiler: -- clang -c_compiler_version: -- '17' -c_stdlib: -- macosx_deployment_target -c_stdlib_version: -- '11.0' -channel_sources: -- conda-forge -channel_targets: -- conda-forge main -cxx_compiler: -- clangxx -cxx_compiler_version: -- '17' -macos_machine: -- arm64-apple-darwin20.0.0 -target_platform: -- osx-arm64 -zip_keys: -- - c_compiler_version - - cxx_compiler_version -zlib: -- '1' -zstd: -- '1.5' diff --git a/.ci_support/win_64_.yaml b/.ci_support/win_64_.yaml deleted file mode 100644 index 6b2002f20..000000000 --- a/.ci_support/win_64_.yaml +++ /dev/null @@ -1,18 +0,0 @@ -c_compiler: -- vs2019 -c_stdlib: -- vs -channel_sources: -- conda-forge -channel_targets: -- conda-forge main -cxx_compiler: -- vs2019 -libxml2: -- '2' -target_platform: -- win-64 -zlib: -- '1' -zstd: -- '1.5' diff --git a/.scripts/run_osx_build.sh b/.scripts/run_osx_build.sh deleted file mode 100755 index 7f948c41f..000000000 --- a/.scripts/run_osx_build.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env bash - -# -*- mode: jinja-shell -*- - -source .scripts/logging_utils.sh - -set -xe - -MINIFORGE_HOME=${MINIFORGE_HOME:-${HOME}/miniforge3} -MINIFORGE_HOME=${MINIFORGE_HOME%/} # remove trailing slash - -( startgroup "Provisioning base env with micromamba" ) 2> /dev/null -MICROMAMBA_VERSION="1.5.10-0" -if [[ "$(uname -m)" == "arm64" ]]; then - osx_arch="osx-arm64" -else - osx_arch="osx-64" -fi -MICROMAMBA_URL="https://github.com/mamba-org/micromamba-releases/releases/download/${MICROMAMBA_VERSION}/micromamba-${osx_arch}" -MAMBA_ROOT_PREFIX="${MINIFORGE_HOME}-micromamba-$(date +%s)" -echo "Downloading micromamba ${MICROMAMBA_VERSION}" -micromamba_exe="$(mktemp -d)/micromamba" -curl -L -o "${micromamba_exe}" "${MICROMAMBA_URL}" -chmod +x "${micromamba_exe}" -echo "Creating environment" -"${micromamba_exe}" create --yes --root-prefix "${MAMBA_ROOT_PREFIX}" --prefix "${MINIFORGE_HOME}" \ - --channel conda-forge \ - pip python=3.12 conda-build conda-forge-ci-setup=4 "conda-build>=24.1" -echo "Moving pkgs cache from ${MAMBA_ROOT_PREFIX} to ${MINIFORGE_HOME}" -mv "${MAMBA_ROOT_PREFIX}/pkgs" "${MINIFORGE_HOME}" -echo "Cleaning up micromamba" -rm -rf "${MAMBA_ROOT_PREFIX}" "${micromamba_exe}" || true -( endgroup "Provisioning base env with micromamba" ) 2> /dev/null - -( startgroup "Configuring conda" ) 2> /dev/null - -source "${MINIFORGE_HOME}/etc/profile.d/conda.sh" -conda activate base -export CONDA_SOLVER="libmamba" -export CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1 - - - - - -echo -e "\n\nSetting up the condarc and mangling the compiler." -setup_conda_rc ./ ./recipe ./.ci_support/${CONFIG}.yaml - -if [[ "${CI:-}" != "" ]]; then - mangle_compiler ./ ./recipe .ci_support/${CONFIG}.yaml -fi - -if [[ "${CI:-}" != "" ]]; then - echo -e "\n\nMangling homebrew in the CI to avoid conflicts." - /usr/bin/sudo mangle_homebrew - /usr/bin/sudo -k -else - echo -e "\n\nNot mangling homebrew as we are not running in CI" -fi - -if [[ "${sha:-}" == "" ]]; then - sha=$(git rev-parse HEAD) -fi - -echo -e "\n\nRunning the build setup script." -source run_conda_forge_build_setup - - - -( endgroup "Configuring conda" ) 2> /dev/null - -echo -e "\n\nMaking the build clobber file" -make_build_number ./ ./recipe ./.ci_support/${CONFIG}.yaml - -if [[ -f LICENSE.txt ]]; then - cp LICENSE.txt "recipe/recipe-scripts-license.txt" -fi - -if [[ "${BUILD_WITH_CONDA_DEBUG:-0}" == 1 ]]; then - if [[ "x${BUILD_OUTPUT_ID:-}" != "x" ]]; then - EXTRA_CB_OPTIONS="${EXTRA_CB_OPTIONS:-} --output-id ${BUILD_OUTPUT_ID}" - fi - conda debug ./recipe -m ./.ci_support/${CONFIG}.yaml \ - ${EXTRA_CB_OPTIONS:-} \ - --clobber-file ./.ci_support/clobber_${CONFIG}.yaml - - # Drop into an interactive shell - /bin/bash -else - - if [[ "${HOST_PLATFORM}" != "${BUILD_PLATFORM}" ]]; then - EXTRA_CB_OPTIONS="${EXTRA_CB_OPTIONS:-} --no-test" - fi - - conda-build ./recipe -m ./.ci_support/${CONFIG}.yaml \ - --suppress-variables ${EXTRA_CB_OPTIONS:-} \ - --clobber-file ./.ci_support/clobber_${CONFIG}.yaml \ - --extra-meta flow_run_id="$flow_run_id" remote_url="$remote_url" sha="$sha" - - ( startgroup "Inspecting artifacts" ) 2> /dev/null - - # inspect_artifacts was only added in conda-forge-ci-setup 4.9.4 - command -v inspect_artifacts >/dev/null 2>&1 && inspect_artifacts --recipe-dir ./recipe -m ./.ci_support/${CONFIG}.yaml || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4" - - ( endgroup "Inspecting artifacts" ) 2> /dev/null - ( startgroup "Validating outputs" ) 2> /dev/null - - validate_recipe_outputs "${FEEDSTOCK_NAME}" - - ( endgroup "Validating outputs" ) 2> /dev/null - - ( startgroup "Uploading packages" ) 2> /dev/null - - if [[ "${UPLOAD_PACKAGES}" != "False" ]] && [[ "${IS_PR_BUILD}" == "False" ]]; then - upload_package --validate --feedstock-name="${FEEDSTOCK_NAME}" ./ ./recipe ./.ci_support/${CONFIG}.yaml - fi - - ( endgroup "Uploading packages" ) 2> /dev/null -fi \ No newline at end of file diff --git a/.scripts/run_win_build.bat b/.scripts/run_win_build.bat deleted file mode 100755 index d3c0345e5..000000000 --- a/.scripts/run_win_build.bat +++ /dev/null @@ -1,152 +0,0 @@ -:: PLEASE NOTE: This script has been automatically generated by conda-smithy. Any changes here -:: will be lost next time ``conda smithy rerender`` is run. If you would like to make permanent -:: changes to this script, consider a proposal to conda-smithy so that other feedstocks can also -:: benefit from the improvement. - -:: INPUTS (required environment variables) -:: CONFIG: name of the .ci_support/*.yaml file for this job -:: CI: azure, github_actions, or unset -:: MINIFORGE_HOME: where to install the base conda environment -:: UPLOAD_PACKAGES: true or false -:: UPLOAD_ON_BRANCH: true or false - -setlocal enableextensions enabledelayedexpansion - -if "%MINIFORGE_HOME%"=="" set "MINIFORGE_HOME=%USERPROFILE%\Miniforge3" -:: Remove trailing backslash, if present -if "%MINIFORGE_HOME:~-1%"=="\" set "MINIFORGE_HOME=%MINIFORGE_HOME:~0,-1%" -call :start_group "Provisioning base env with micromamba" -set "MAMBA_ROOT_PREFIX=%MINIFORGE_HOME%-micromamba-%RANDOM%" -set "MICROMAMBA_VERSION=1.5.10-0" -set "MICROMAMBA_URL=https://github.com/mamba-org/micromamba-releases/releases/download/%MICROMAMBA_VERSION%/micromamba-win-64" -set "MICROMAMBA_TMPDIR=%TMP%\micromamba-%RANDOM%" -set "MICROMAMBA_EXE=%MICROMAMBA_TMPDIR%\micromamba.exe" - -echo Downloading micromamba %MICROMAMBA_VERSION% -if not exist "%MICROMAMBA_TMPDIR%" mkdir "%MICROMAMBA_TMPDIR%" -certutil -urlcache -split -f "%MICROMAMBA_URL%" "%MICROMAMBA_EXE%" -if !errorlevel! neq 0 exit /b !errorlevel! - -echo Creating environment -call "%MICROMAMBA_EXE%" create --yes --root-prefix "%MAMBA_ROOT_PREFIX%" --prefix "%MINIFORGE_HOME%" ^ - --channel conda-forge ^ - pip python=3.12 conda-build conda-forge-ci-setup=4 "conda-build>=24.1" -if !errorlevel! neq 0 exit /b !errorlevel! -echo Moving pkgs cache from %MAMBA_ROOT_PREFIX% to %MINIFORGE_HOME% -move /Y "%MAMBA_ROOT_PREFIX%\pkgs" "%MINIFORGE_HOME%" -if !errorlevel! neq 0 exit /b !errorlevel! -echo Removing %MAMBA_ROOT_PREFIX% -del /S /Q "%MAMBA_ROOT_PREFIX%" -del /S /Q "%MICROMAMBA_TMPDIR%" -call :end_group - -call :start_group "Configuring conda" - -:: Activate the base conda environment -call "%MINIFORGE_HOME%\Scripts\activate.bat" -:: Configure the solver -set "CONDA_SOLVER=libmamba" -if !errorlevel! neq 0 exit /b !errorlevel! -set "CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1" - -:: Set basic configuration -echo Setting up configuration -setup_conda_rc .\ ".\recipe" .\.ci_support\%CONFIG%.yaml -if !errorlevel! neq 0 exit /b !errorlevel! -echo Running build setup -CALL run_conda_forge_build_setup - - -if !errorlevel! neq 0 exit /b !errorlevel! - -if EXIST LICENSE.txt ( - echo Copying feedstock license - copy LICENSE.txt "recipe\\recipe-scripts-license.txt" -) -if NOT [%HOST_PLATFORM%] == [%BUILD_PLATFORM%] ( - if [%CROSSCOMPILING_EMULATOR%] == [] ( - set "EXTRA_CB_OPTIONS=%EXTRA_CB_OPTIONS% --no-test" - ) -) - -if NOT [%flow_run_id%] == [] ( - set "EXTRA_CB_OPTIONS=%EXTRA_CB_OPTIONS% --extra-meta flow_run_id=%flow_run_id% remote_url=%remote_url% sha=%sha%" -) - -call :end_group - -:: Build the recipe -echo Building recipe -conda-build.exe "recipe" -m .ci_support\%CONFIG%.yaml --suppress-variables %EXTRA_CB_OPTIONS% -if !errorlevel! neq 0 exit /b !errorlevel! - -call :start_group "Inspecting artifacts" -:: inspect_artifacts was only added in conda-forge-ci-setup 4.9.4 -WHERE inspect_artifacts >nul 2>nul && inspect_artifacts --recipe-dir ".\recipe" -m .ci_support\%CONFIG%.yaml || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4" -call :end_group - -:: Prepare some environment variables for the upload step -if /i "%CI%" == "github_actions" ( - set "FEEDSTOCK_NAME=%GITHUB_REPOSITORY:*/=%" - set "GIT_BRANCH=%GITHUB_REF:refs/heads/=%" - if /i "%GITHUB_EVENT_NAME%" == "pull_request" ( - set "IS_PR_BUILD=True" - ) else ( - set "IS_PR_BUILD=False" - ) - set "TEMP=%RUNNER_TEMP%" -) -if /i "%CI%" == "azure" ( - set "FEEDSTOCK_NAME=%BUILD_REPOSITORY_NAME:*/=%" - set "GIT_BRANCH=%BUILD_SOURCEBRANCHNAME%" - if /i "%BUILD_REASON%" == "PullRequest" ( - set "IS_PR_BUILD=True" - ) else ( - set "IS_PR_BUILD=False" - ) - set "TEMP=%UPLOAD_TEMP%" -) - -:: Validate -call :start_group "Validating outputs" -validate_recipe_outputs "%FEEDSTOCK_NAME%" -if !errorlevel! neq 0 exit /b !errorlevel! -call :end_group - -if /i "%UPLOAD_PACKAGES%" == "true" ( - if /i "%IS_PR_BUILD%" == "false" ( - call :start_group "Uploading packages" - if not exist "%TEMP%\" md "%TEMP%" - set "TMP=%TEMP%" - upload_package --validate --feedstock-name="%FEEDSTOCK_NAME%" .\ ".\recipe" .ci_support\%CONFIG%.yaml - if !errorlevel! neq 0 exit /b !errorlevel! - call :end_group - ) -) - -exit - -:: Logging subroutines - -:start_group -if /i "%CI%" == "github_actions" ( - echo ::group::%~1 - exit /b -) -if /i "%CI%" == "azure" ( - echo ##[group]%~1 - exit /b -) -echo %~1 -exit /b - -:end_group -if /i "%CI%" == "github_actions" ( - echo ::endgroup:: - exit /b -) -if /i "%CI%" == "azure" ( - echo ##[endgroup] - exit /b -) -exit /b \ No newline at end of file diff --git a/README.md b/README.md index e3acdb76a..941515c4a 100644 --- a/README.md +++ b/README.md @@ -39,38 +39,10 @@ Current build status - + - - - - - - - - - - - - diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a30f040e8..d309e84b2 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,7 +19,7 @@ stages: echo "##vso[task.setvariable variable=log]$git_log" displayName: Obtain commit message - bash: echo "##vso[task.setvariable variable=RET]false" - condition: or(contains(variables.log, '[skip azp]'), contains(variables.log, '[azp skip]'), contains(variables.log, '[skip ci]'), contains(variables.log, '[ci skip]')) + condition: and(eq(variables['Build.Reason'], 'PullRequest'), or(contains(variables.log, '[skip azp]'), contains(variables.log, '[azp skip]'), contains(variables.log, '[skip ci]'), contains(variables.log, '[ci skip]'))) displayName: Skip build? - bash: echo "##vso[task.setvariable variable=start_main;isOutput=true]$RET" name: result @@ -28,6 +28,4 @@ stages: condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true')) dependsOn: Check jobs: - - template: ./.azure-pipelines/azure-pipelines-linux.yml - - template: ./.azure-pipelines/azure-pipelines-osx.yml - - template: ./.azure-pipelines/azure-pipelines-win.yml + - template: ./.azure-pipelines/azure-pipelines-linux.yml \ No newline at end of file diff --git a/build-locally.py b/build-locally.py index 6788aea66..c4a56c667 100755 --- a/build-locally.py +++ b/build-locally.py @@ -26,6 +26,13 @@ def setup_environment(ns): os.path.dirname(__file__), "miniforge3" ) + # The default cache location might not be writable using docker on macOS. + if ns.config.startswith("linux") and platform.system() == "Darwin": + os.environ["CONDA_FORGE_DOCKER_RUN_ARGS"] = ( + os.environ.get("CONDA_FORGE_DOCKER_RUN_ARGS", "") + + " -e RATTLER_CACHE_DIR=/tmp/rattler_cache" + ) + def run_docker_build(ns): script = ".scripts/run_docker_build.sh" diff --git a/conda-forge.yml b/conda-forge.yml index bcfdbb9ea..316d6f265 100644 --- a/conda-forge.yml +++ b/conda-forge.yml @@ -8,5 +8,6 @@ conda_build: pkg_format: '2' build_platform: linux_aarch64: linux_64 + linux_ppc64le: linux_64 osx_arm64: osx_64 test: native_and_emulated diff --git a/recipe/build.sh b/recipe/build.sh index 1ac560437..ddaaefcc6 100644 --- a/recipe/build.sh +++ b/recipe/build.sh @@ -21,6 +21,9 @@ case "${target_platform}" in linux-aarch64) bash "${RECIPE_DIR}"/build_scripts/cross-"${builder}"-linux-aarch64.sh ;; + linux-ppc64le) + bash "${RECIPE_DIR}"/build_scripts/cross-"${builder}"-linux-ppc64le.sh + ;; osx-arm64) bash "${RECIPE_DIR}"/build_scripts/cross-"${builder}"-osx-arm64.sh ;; diff --git a/recipe/build_scripts/_build_qemu_execve.sh b/recipe/build_scripts/_build_qemu_execve.sh new file mode 100644 index 000000000..50f0dee56 --- /dev/null +++ b/recipe/build_scripts/_build_qemu_execve.sh @@ -0,0 +1,71 @@ +function build_qemu_execve() { + local arch=${1:-"aarch64"} + + mamba create -n qemu-execve -y -c conda-forge \ + gcc_linux-64 \ + glib \ + make \ + meson \ + patchelf \ + pkg-config \ + sphinx \ + sphinx-rtd-theme \ + sysroot_linux-64=2.28 \ + zlib + + mkdir -p "${SRC_DIR}"/_qemu_execve + cd "${SRC_DIR}"/_qemu_execve + git clone https://gitlab.com/qemu-project/qemu.git + cd qemu + git checkout v9.1.0 + cd .. + patch -p0 < "${RECIPE_DIR}"/patches/xxxx-qemu-execve.patch + + mkdir _conda-build + cd _conda-build + local CC=$(mamba run -n qemu-execve which x86_64-conda-linux-gnu-gcc | grep -Eo '/.*gcc' | tail -n 1) + local PKG_CONFIG=$(mamba run -n qemu-execve which pkg-config | grep -Eo '/.*pkg-config' | tail -n 1) + local PKG_CONFIG_PATH=$(dirname ${PKG_CONFIG})/../lib/pkgconfig + mamba run -n qemu-execve bash -c 'echo "${CFLAGS:-}" > _cflags.txt' >& /dev/null + local CFLAGS=$(< _cflags.txt) + CFLAGS=${CFLAGS//-mcpu=power8 -mtune=power8/} + mamba run -n qemu-execve bash -c 'echo "${LDFLAGS:-}" > _ldflags.txt' >& /dev/null + local LDFLAGS=$(< _ldflags.txt) + mamba run -n qemu-execve bash -c 'echo "${PATH:-}" > _path.txt' >& /dev/null + local PATH=$(< _path.txt) + + # export CC PATH PKG_CONFIG CFLAGS LDFLAGS PKG_CONFIG_PATH + + "${SRC_DIR}"/_qemu_execve/qemu/configure --prefix="${BUILD_PREFIX}" \ + --interp-prefix="${BUILD_PREFIX}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot" \ + --enable-linux-user \ + --target-list="${arch}-linux-user" \ + "--cross-cc-${arch}=${SYSROOT_ARCH}-conda-linux-gnu-gcc" \ + "--cross-prefix-${arch}=${SYSROOT_ARCH}-conda-linux-gnu-" \ + --disable-system --disable-fdt --disable-guest-agent --disable-tools --disable-virtfs \ + --disable-docs --disable-hexagon-idef-parser \ + --disable-bsd-user --disable-strip --disable-werror --disable-gcrypt --disable-pie \ + --disable-debug-info --disable-debug-tcg --disable-tcg-interpreter \ + --disable-brlapi --disable-linux-aio --disable-bzip2 --disable-cap-ng --disable-curl \ + --disable-glusterfs --disable-gnutls --disable-nettle --disable-gtk --disable-rdma --disable-libiscsi \ + --disable-vnc-jpeg --disable-kvm --disable-lzo --disable-curses --disable-libnfs --disable-numa \ + --disable-opengl --disable-rbd --disable-vnc-sasl --disable-sdl --disable-seccomp \ + --disable-smartcard --disable-snappy --disable-spice --disable-libusb --disable-usb-redir --disable-vde \ + --disable-vhost-net --disable-virglrenderer --disable-vnc --disable-vte --disable-xen \ + --disable-xen-pci-passthrough > "${SRC_DIR}"/_configure_qemu.log 2>&1 + make -j"${CPU_COUNT}" > "${SRC_DIR}"/_make_qemu.log 2>&1 + make install > "${SRC_DIR}"/_install_qemu.log 2>&1 + + # Patch the interpreter + patchelf --set-interpreter "${BUILD_PREFIX}/x86_64-conda-linux-gnu/sysroot/lib64/ld-2.28.so" "${BUILD_PREFIX}/bin/qemu-${arch}" + patchelf --set-rpath "\$ORIGIN/../x86_64-conda-linux-gnu/sysroot/lib64" "${BUILD_PREFIX}/bin/qemu-${arch}" + patchelf --add-rpath "\$ORIGIN/../lib" "${BUILD_PREFIX}/bin/qemu-${arch}" + + export QEMU_LD_PREFIX="${SYSROOT_PATH}" + export QEMU_SET_ENV="LD_LIBRARY_PATH=${SYSROOT_PATH}/lib64:${LD_LIBRARY_PATH:-}" + export QEMU_EXECVE="${BUILD_PREFIX}"/bin/qemu-${arch} + export QEMU_STACK_SIZE=67108864 + export QEMU_LOG_FILENAME="${SRC_DIR}"/_qemu.log + export QEMU_LOG="strace" + cd "${SRC_DIR}" +} diff --git a/recipe/build_scripts/_functions.sh b/recipe/build_scripts/_functions.sh index e66fcd027..9c144da82 100644 --- a/recipe/build_scripts/_functions.sh +++ b/recipe/build_scripts/_functions.sh @@ -5,7 +5,7 @@ function cmake_build_install() { current_dir=$(pwd) cd "${build_dir}" || exit 1 - cmake --build . -- -j"${CPU_COUNT}" + cmake --build . -v -- -j"${CPU_COUNT}" cmake --install . cd "${current_dir}" || exit 1 } @@ -122,18 +122,55 @@ function build_zig_with_zig() { fi } -function patchelf_installed_zig() { - local install_dir=$1 +function patchelf_with_2.28() { + local _exec=$1 local _prefix=$2 - patchelf --remove-rpath "${install_dir}/bin/zig" - patchelf --set-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64" "${install_dir}/bin/zig" - patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/lib" "${install_dir}/bin/zig" - patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/usr/lib64" "${install_dir}/bin/zig" - patchelf --add-rpath "${_prefix}/lib" "${install_dir}/bin/zig" - patchelf --add-rpath "${PREFIX}/lib" "${install_dir}/bin/zig" + patchelf --remove-rpath "${_exec}" + patchelf --set-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64" "${_exec}" + patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/lib" "${_exec}" + patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/usr/lib64" "${_exec}" + patchelf --add-rpath "${_prefix}/lib" "${_exec}" + patchelf --add-rpath "${PREFIX}/lib" "${_exec}" - patchelf --set-interpreter "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-2.28.so" "${install_dir}/bin/zig" + patchelf --set-interpreter "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-2.28.so" "${_exec}" +} + +function patchelf_replace_2.28() { + local _exec=$1 + local _prefix=$2 + + patchelf --remove-rpath "${_exec}" + patchelf --set-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64" "${_exec}" + patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/lib" "${_exec}" + patchelf --add-rpath "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/usr/lib64" "${_exec}" + patchelf --add-rpath "${_prefix}/lib" "${_exec}" + patchelf --add-rpath "${PREFIX}/lib" "${_exec}" + + # patchelf --replace-needed "libc.so.6" "libc-2.28.so" "${_exec}" + # patchelf --replace-needed "ld-linux-aarch64.so.1" "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-linux-aarch64.so.1" "${_exec}" + + # patchelf --set-interpreter "${_prefix}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-2.28.so" "${_exec}" +} + +function patchelf_sysroot_interpreter() { + local _sysroot=$1 + local _interpreter=$2 + local _exec=$3 + local _add_lib=${4:-} + + patchelf --set-interpreter "${_interpreter}" "${_exec}" + patchelf --set-rpath "${PREFIX}"/lib "${_exec}" + if [[ -d "${_sysroot}"/lib64 ]]; then + patchelf --add-rpath "${_sysroot}"/lib64 "${_exec}" + fi + patchelf --add-rpath "${_sysroot}"/lib "${_exec}" + + if [[ "${_add_lib:-0}" != "0" ]]; then + patchelf --add-needed "libdl.so.2" "${_exec}" + patchelf --add-needed "librt.so.1" "${_exec}" + patchelf --add-needed "libm.so.6" "${_exec}" + fi } function remove_failing_langref() { diff --git a/recipe/build_scripts/cross-cmake-linux-aarch64.sh b/recipe/build_scripts/cross-cmake-linux-aarch64.sh new file mode 100644 index 000000000..d235d69b7 --- /dev/null +++ b/recipe/build_scripts/cross-cmake-linux-aarch64.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -euxo pipefail + +# --- Functions --- + +source "${RECIPE_DIR}/build_scripts/_functions.sh" + +# --- Main --- + +cmake_build_dir="${SRC_DIR}/_conda-cmake-build" + +mkdir -p "${cmake_build_dir}" && cp -r "${SRC_DIR}"/zig-source/* "${cmake_build_dir}" + +mkdir -p "${SRC_DIR}"/_conda-build-level-patches +cp -r "${RECIPE_DIR}"/patches/xxxx* "${SRC_DIR}"/_conda-build-level-patches + +# Current conda zig may not be able to build the latest zig +SYSROOT_ARCH="aarch64" +SYSROOT_PATH="${PREFIX}"/"${SYSROOT_ARCH}"-conda-linux-gnu/sysroot +TARGET_INTERPRETER="${SYSROOT_PATH}/lib64/ld-linux-${SYSROOT_ARCH}.so.1" + +export ZIG_GLOBAL_CACHE_DIR="${PWD}/zig-global-cache" +export ZIG_LOCAL_CACHE_DIR="${PWD}/zig-local-cache" + +EXTRA_CMAKE_ARGS+=( \ + "-DCMAKE_BUILD_TYPE=Release" \ + "-DCMAKE_PREFIX_PATH=${PREFIX};${SYSROOT_PATH}" \ + "-DCMAKE_C_COMPILER=${CC}" \ + "-DCMAKE_CXX_COMPILER=${CXX}" \ + "-DZIG_SHARED_LLVM=ON" \ + "-DZIG_USE_LLVM_CONFIG=ON" \ + "-DZIG_TARGET_TRIPLE=${SYSROOT_ARCH}-linux-gnu" \ +) +# This path is too long for Target.zig +# "-DZIG_TARGET_DYNAMIC_LINKER=${TARGET_INTERPRETER}" \ + +source "${RECIPE_DIR}/build_scripts/_build_qemu_execve.sh" +build_qemu_execve "${SYSROOT_ARCH}" + +# export CROSSCOMPILING_EMULATOR="${BUILD_PREFIX}/bin/qemu-${SYSROOT_ARCH}" + +export CROSSCOMPILING_EMULATOR="${QEMU_EXECVE}" +export CROSSCOMPILING_LIBC="Wl,-dynamic-linker,${TARGET_INTERPRETER};-L${SYSROOT_PATH}/lib64;-lc" + +export CFLAGS="${CFLAGS} -Wl,-rpath-link,${SYSROOT_PATH}/lib64 -Wl,-dynamic-linker,${TARGET_INTERPRETER}" +export CXXFLAGS="${CXXFLAGS} -Wl,-rpath-link,${SYSROOT_PATH}/lib64 -Wl,-dynamic-linker,${TARGET_INTERPRETER}" + +export ZIG_CROSS_TARGET_TRIPLE="${SYSROOT_ARCH}"-linux-gnu +export ZIG_CROSS_TARGET_MCPU="native" + +USE_CMAKE_ARGS=1 + +configure_cmake_zigcpp "${cmake_build_dir}" "${PREFIX}" +cat <> "${cmake_build_dir}/config.zig" +pub const mem_leak_frames = 0; +EOF + +cmake_build_cmake_target "${cmake_build_dir}" zig2 +patchelf_sysroot_interpreter "${SYSROOT_PATH}" "${TARGET_INTERPRETER}" "${cmake_build_dir}/zig2" 1 + +sed -i -E "s@#define ZIG_CXX_COMPILER \".*/bin@#define ZIG_CXX_COMPILER \"${PREFIX}/bin@g" "${cmake_build_dir}/config.h" +pushd "${cmake_build_dir}" + cmake --build . -- -j"${CPU_COUNT}" + cmake --install . +popd + +# patchelf --set-interpreter "${PREFIX}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-linux-${SYSROOT_ARCH}.so.1" "${PREFIX}/bin/zig" +patchelf --set-rpath "\$ORIGIN/../${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64" "${PREFIX}/bin/zig" +patchelf --add-rpath "\$ORIGIN/../lib" "${PREFIX}/bin/zig" + +# Use stage3/zig to self-build: This failed locally with SEGV in qemu +# build_zig_with_zig "${zig_build_dir}" "${PREFIX}/bin/zig" "${PREFIX}" diff --git a/recipe/build_scripts/cross-cmake-linux-ppc64le.sh b/recipe/build_scripts/cross-cmake-linux-ppc64le.sh new file mode 100644 index 000000000..9ad0544ef --- /dev/null +++ b/recipe/build_scripts/cross-cmake-linux-ppc64le.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -euxo pipefail + +# --- Functions --- + +source "${RECIPE_DIR}/build_scripts/_functions.sh" + +# --- Main --- + +cmake_build_dir="${SRC_DIR}/_conda-cmake-build" + +mkdir -p "${cmake_build_dir}" && cp -r "${SRC_DIR}"/zig-source/* "${cmake_build_dir}" + +mkdir -p "${SRC_DIR}"/_conda-build-level-patches +cp -r "${RECIPE_DIR}"/patches/xxxx* "${SRC_DIR}"/_conda-build-level-patches + +# Current conda zig may not be able to build the latest zig +SYSROOT_ARCH="powerpc64le" +ZIG_ARCH="powerpc64" +QEMU_ARCH="ppc64le" +SYSROOT_PATH="${BUILD_PREFIX}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot" +TARGET_INTERPRETER="${SYSROOT_PATH}/lib64/ld-2.28.so" + +export ZIG_GLOBAL_CACHE_DIR="${PWD}/zig-global-cache" +export ZIG_LOCAL_CACHE_DIR="${PWD}/zig-local-cache" + +source "${RECIPE_DIR}/build_scripts/_build_qemu_execve.sh" +build_qemu_execve "${QEMU_ARCH}" + +export CC=$(which clang) +export CXX=$(which clang++) + +export CFLAGS="-target ${SYSROOT_ARCH}-linux-gnu -fno-plt" +export CXXFLAGS="-target ${SYSROOT_ARCH}-linux-gnu -fno-plt --stdlib=libstdc++" + +EXTRA_CMAKE_ARGS+=( \ + "-DCMAKE_BUILD_TYPE=Release" \ + "-DCMAKE_PREFIX_PATH=${PREFIX};${SYSROOT_PATH}" \ + "-DCMAKE_C_COMPILER=${CC}" \ + "-DCMAKE_CXX_COMPILER=${CXX}" \ + "-DZIG_SHARED_LLVM=ON" \ + "-DZIG_USE_LLVM_CONFIG=ON" \ + "-DZIG_TARGET_TRIPLE=${ZIG_ARCH}-linux-gnu" \ + "-DZIG_TARGET_MCPU=baseline" \ + "-DZIG_SYSTEM_LIBCXX=stdc++" \ +) +# This path is too long for Target.zig +# "-DZIG_TARGET_DYNAMIC_LINKER=${TARGET_INTERPRETER}" \ + +# export CROSSCOMPILING_EMULATOR="${BUILD_PREFIX}/bin/qemu-${SYSROOT_ARCH}" + +export CROSSCOMPILING_EMULATOR="${QEMU_EXECVE}" +export CROSSCOMPILING_LIBC="Wl,-dynamic-linker,${TARGET_INTERPRETER};-L${SYSROOT_PATH}/lib64;-lc" + +# CFLAGS="${CFLAGS} -mlongcall -mcmodel=large -Os -Wl,--no-relax -fPIE -pie" +# CXXFLAGS="${CXXFLAGS} -mlongcall -mcmodel=large -Os -Wl,--no-relax -fPIE -pie" +# CFLAGS=${CFLAGS//-fno-plt/} +# CXXFLAGS=${CXXFLAGS//-fno-plt/} + +export CFLAGS="${CFLAGS} -Wl,-rpath-link,${SYSROOT_PATH}/lib64 -Wl,-dynamic-linker,${TARGET_INTERPRETER}" +export CXXFLAGS="${CXXFLAGS} -Wl,-rpath-link,${SYSROOT_PATH}/lib64 -Wl,-dynamic-linker,${TARGET_INTERPRETER}" + +export ZIG_CROSS_TARGET_TRIPLE="${ZIG_ARCH}"-linux-gnu +export ZIG_CROSS_TARGET_MCPU="ppc64le" + +USE_CMAKE_ARGS=0 + +# CFLAGS=${CFLAGS//-fPIC/} +# CXXFLAGS=${CXXFLAGS//-fPIC/} +# CFLAGS=${CFLAGS//-fpie/} +# CXXFLAGS=${CXXFLAGS//-fpie/} +# CFLAGS=${CFLAGS//-fno-plt/} +# CXXFLAGS=${CXXFLAGS//-fno-plt/} +# export CFLAGS="${CFLAGS}" +# export CXXFLAGS="${CXXFLAGS} -fno-optimize-sibling-calls -fno-threadsafe-statics" +# echo "CFLAGS=${CFLAGS}" +# echo "CXXFLAGS=${CXXFLAGS}" +configure_cmake_zigcpp "${cmake_build_dir}" "${PREFIX}" +cat <> "${cmake_build_dir}/config.zig" +pub const mem_leak_frames = 0; +EOF + +cmake_build_cmake_target "${cmake_build_dir}" zig2.c +# pushd "${cmake_build_dir}" +# patch -Np0 -i "${SRC_DIR}"/_conda-build-level-patches/xxxx-zig2.c-asm-clobber-list.patch --binary +# popd + +cmake_build_cmake_target "${cmake_build_dir}" zig2 +patchelf_sysroot_interpreter "${SYSROOT_PATH}" "${TARGET_INTERPRETER}" "${cmake_build_dir}/zig2" 1 + +sed -i -E "s@#define ZIG_CXX_COMPILER \".*/bin@#define ZIG_CXX_COMPILER \"${PREFIX}/bin@g" "${cmake_build_dir}/config.h" +pushd "${cmake_build_dir}" + cmake --build . -- -j"${CPU_COUNT}" > "${SRC_DIR}"/_make_post_zig2.log 2>&1 + cmake --install . +popd + +# patchelf --set-interpreter "${PREFIX}/${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64/ld-linux-${SYSROOT_ARCH}.so.1" "${PREFIX}/bin/zig" +patchelf --set-rpath "\$ORIGIN/../${SYSROOT_ARCH}-conda-linux-gnu/sysroot/lib64" "${PREFIX}/bin/zig" +patchelf --add-rpath "\$ORIGIN/../lib" "${PREFIX}/bin/zig" + +# Use stage3/zig to self-build: This failed locally with SEGV in qemu +# build_zig_with_zig "${zig_build_dir}" "${PREFIX}/bin/zig" "${PREFIX}" diff --git a/recipe/build_scripts/native-cmake-linux-ppc64le.sh b/recipe/build_scripts/native-cmake-linux-ppc64le.sh new file mode 100644 index 000000000..a4c1b04e5 --- /dev/null +++ b/recipe/build_scripts/native-cmake-linux-ppc64le.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euxo pipefail + +# --- Functions --- + +source "${RECIPE_DIR}/build_scripts/_functions.sh" + +# --- Main --- + +export ZIG_GLOBAL_CACHE_DIR="${PWD}/zig-global-cache" +export ZIG_LOCAL_CACHE_DIR="${PWD}/zig-local-cache" + +cmake_build_dir="${SRC_DIR}/build-release" +mkdir -p "${cmake_build_dir}" && cp -r "${SRC_DIR}"/zig-source/* "${cmake_build_dir}" + +SYSROOT_ARCH="powerpc64le" + +EXTRA_CMAKE_ARGS+=( \ + "-DCMAKE_BUILD_TYPE=Release" \ + "-DZIG_SHARED_LLVM=ON" \ + "-DZIG_USE_LLVM_CONFIG=ON" \ + "-DZIG_TARGET_TRIPLE=${SYSROOT_ARCH}-linux-gnu" \ +) + +# Zig searches for libm.so/libc.so in incorrect paths (libm.so with hard-coded /usr/lib64/libmvec_nonshared.a) +modify_libc_libm_for_zig "${BUILD_PREFIX}" + +# When using installed c++ libs, zig needs libzigcpp.a +configure_cmake_zigcpp "${cmake_build_dir}" "${PREFIX}" +cmake_build_install "${cmake_build_dir}" diff --git a/recipe/conda_build_config.yaml b/recipe/conda_build_config.yaml index 68d99ad7b..bf0ee671b 100644 --- a/recipe/conda_build_config.yaml +++ b/recipe/conda_build_config.yaml @@ -1,7 +1,5 @@ c_stdlib_version: # [unix] - 2.28 # [linux] - 11.3 # [osx and x86_64] -build_c_stdlib: - - sysroot # [linux] docker_image: - - quay.io/condaforge/linux-anvil-alma-x86_64:8 # [linux and x86_64] + - quay.io/condaforge/linux-anvil-alma-x86_64:8 # [linux and (x86_64 or ppc64le)] diff --git a/recipe/meta.yaml b/recipe/meta.yaml index 304aecc1a..b43720252 100644 --- a/recipe/meta.yaml +++ b/recipe/meta.yaml @@ -9,8 +9,13 @@ package: source: - url: https://github.com/ziglang/zig/archive/refs/tags/{{ version }}.tar.gz sha256: d3912858003e340f315224bf177d0f441d86b81f62854f5c141b6d51ab6b5516 + # - url: https://github.com/ziglang/zig/archive/refs/heads/master.zip + # sha256: 535092b882cc5d64a2d07b3fe328cb15276eb2dfd87a5dfee8276c3d11f2f587 patches: - - patches/0001-cross-findllvm.patch # [linux and aarch64] + - patches/0001-cross-findllvm.patch # [linux and (aarch64 or ppc64le)] + - patches/0002-cross-CMakeLists.txt.patch # [build_platform != target_platform] + - patches/0003-cross-install.cmake.patch # [build_platform != target_platform] + - patches/0004-cross-ppc64le-signal.h.patch # [ppc64le] # May be combined into a single patch once the build is found robust (few versions of zig) - patches/0001-win-set-MD-CMakeLists.txt.patch # [win] - patches/0002-win-deprecations.patch # [win] @@ -32,9 +37,10 @@ source: # sha256: d45312e61ebcc48032b77bc4cf7fd6915c11fa16e4aad116b66c9468211230ea # [linux] build: - number: 4 + number: 5 + skip: true # [not linux or not ppc64le] script_env: - - BUILD_WITH_CMAKE=1 # [(linux or osx or win) and x86_64] + - BUILD_WITH_CMAKE=1 # [(linux or osx or win) and (x86_64 or ppc64le)] ignore_run_exports: - __glibc # [linux and aarch64] - ucrt # [win] @@ -44,15 +50,29 @@ requirements: build: - {{ compiler('c') }} - {{ compiler('cxx') }} - - {{ c_stdlib }}_{{ build_platform }} >={{ c_stdlib_version }} # [linux and aarch64] - - {{ stdlib("c") }} + - {{ stdlib('c') }} + - clang # [linux and ppc64le] + - clangxx # [linux and ppc64le] + - llvm-tools # [linux and ppc64le] + # - {{ c_stdlib }}_{{ build_platform }} >={{ c_stdlib_version }} # [linux and aarch64] - cmake >=3.5 - ninja + # This is needed to build a qemu that intercepts the execve() call that zig2 emits + - glib # [linux and build_platform != target_platform] + - sysroot_{{ build_platform }} >=2.28 # [linux and build_platform != target_platform] + - sysroot_{{ target_platform }} >=2.28 # [linux and build_platform != target_platform] + # - gcc_impl_linux-ppc64le # [linux and ppc64le] + # - make # [linux and build_platform != target_platform] + # - meson # [linux and build_platform != target_platform] + # - pkg-config # [linux and build_platform != target_platform] + # - sphinx # [linux and build_platform != target_platform] + # - sphinx-rtd-theme # [linux and build_platform != target_platform] + # - zlib # [linux and build_platform != target_platform] - zig # [build_platform != target_platform] host: - clangdev {{ llvm_version }} - libclang-cpp {{ llvm_version }} - - libcxx {{ cxx_compiler_version }} # [osx] + - libcxx # [osx] - llvmdev {{ llvm_version }} - llvm {{ llvm_version }} - lld {{ llvm_version }} @@ -61,9 +81,13 @@ requirements: - zlib - zstd run: - - sysroot_{{ target_platform }} >=2.28 # [linux and aarch64] + - libxml2 # [linux and build_platform != target_platform] + - sysroot_{{ target_platform }} >=2.28 # [linux and (aarch64 or ppc64le)] test: + requires: + - patchelf # [aarch64] + - sysroot_{{ target_platform }} >=2.28 # [linux and (aarch64 or ppc64le)] commands: - test -f ${PREFIX}/bin/zig # [unix] - test -f ${PREFIX}/lib/zig/c.zig # [unix] @@ -83,6 +107,9 @@ test: {% endfor %} # Functionality tests + - readelf -l ${PREFIX}/bin/zig # [(aarch64 or ppc64le)] + - patchelf --set-interpreter ${PREFIX}/aarch64-conda-linux-gnu/sysroot/lib64/ld-linux-aarch64.so.1 ${PREFIX}/bin/zig # [aarch64] + - readelf -l ${PREFIX}/bin/zig # [(aarch64 or ppc64le)] - zig version - zig zen - zig init diff --git a/recipe/patches/0002-cross-CMakeLists.txt.patch b/recipe/patches/0002-cross-CMakeLists.txt.patch new file mode 100644 index 000000000..9aae35389 --- /dev/null +++ b/recipe/patches/0002-cross-CMakeLists.txt.patch @@ -0,0 +1,154 @@ +--- CMakeLists.txt.old 2024-06-06 14:05:11.000000000 -0500 ++++ CMakeLists.txt 2024-07-05 15:35:21.268292096 -0500 +@@ -91,2 +91,3 @@ + set(ZIG_STATIC_ZSTD ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zstd") ++set(ZIG_STATIC_XML2 ${ZIG_STATIC} CACHE BOOL "Prefer linking against static xml2") + if(APPLE AND ZIG_STATIC) +@@ -152,2 +153,5 @@ + list(APPEND LLVM_LIBRARIES "${ZLIB}") ++else() ++ find_library(ZLIB NAMES z zlib libz libz.a libzlibstatic.a NAMES_PER_DIR) ++ list(APPEND LLVM_LIBRARIES "${ZLIB}") + endif() +@@ -163,2 +167,19 @@ + list(APPEND LLVM_LIBRARIES "${ZSTD}") ++else() ++ find_library(ZSTD NAMES zstd libzstd.a libzstdstatic.a NAMES_PER_DIR) ++ list(APPEND LLVM_LIBRARIES "${ZSTD}") ++endif() ++ ++if(ZIG_STATIC_XML2) ++ if (MSVC) ++ list(REMOVE_ITEM LLVM_LIBRARIES "xml2.lib") ++ else() ++ list(REMOVE_ITEM LLVM_LIBRARIES "-lxml2") ++ endif() ++ ++ find_library(XML2 NAMES libxml2.a xml2 NAMES_PER_DIR) ++ list(APPEND LLVM_LIBRARIES "${XML2}") ++else() ++ find_library(XML2 NAMES xml2 libxml2 libxml2.a NAMES_PER_DIR) ++ list(APPEND LLVM_LIBRARIES "${XML2}") + endif() +@@ -722,3 +743,3 @@ + -fno-rtti +- -fno-stack-protector ++ # -fno-stack-protector + +@@ -729,6 +750,8 @@ + -Wno-comment ++ -Os + ) + else() +-target_compile_options(zigcpp PRIVATE /Zc:preprocessor) +-set_property(TARGET zigcpp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") ++ target_compile_options(zigcpp PRIVATE -MD) ++ target_compile_options(zigcpp PRIVATE /Zc:preprocessor) ++ set_property(TARGET zigcpp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + endif() +@@ -808,2 +831,28 @@ + set(ZIG_HOST_TARGET_TRIPLE "${ZIG_HOST_TARGET_ARCH}-${ZIG_HOST_TARGET_OS}${ZIG_HOST_TARGET_ABI}" CACHE STRING "Host zig target triple.") ++if(DEFINED ENV{CROSSCOMPILING_EMULATOR}) ++ set(CROSSCOMPILING_EMULATOR $ENV{CROSSCOMPILING_EMULATOR}) ++ if(NOT DEFINED ENV{CROSSCOMPILING_LIBC}) ++ set(CROSSCOMPILING_LIBC "-lc") ++ else() ++ set(CROSSCOMPILING_LIBC $ENV{CROSSCOMPILING_LIBC}) ++ message(STATUS "Setting CROSSCOMPILING_LIBC ${CROSSCOMPILING_LIBC}") ++ endif() ++ if(DEFINED ENV{ZIG_CROSS_TARGET_TRIPLE}) ++ set(ZIG_CROSS_TARGET_TRIPLE $ENV{ZIG_CROSS_TARGET_TRIPLE} CACHE STRING "Host zig target triple.") ++ message(STATUS "Setting ZIG_CROSS_TARGET_TRIPLE ${ZIG_CROSS_TARGET_TRIPLE}") ++ else() ++ message(SEND_ERROR "ZIG_CROSS_TARGET_TRIPLE is not set while cross-compiling") ++ endif() ++ if(DEFINED ENV{ZIG_CROSS_TARGET_MCPU}) ++ set(ZIG_CROSS_TARGET_MCPU $ENV{ZIG_CROSS_TARGET_MCPU} CACHE STRING "Host zig target cpu.") ++ message(STATUS "Setting ZIG_CROSS_TARGET_MCPU ${ZIG_CROSS_TARGET_MCPU}") ++ else() ++ set(ZIG_CROSS_TARGET_MCPU "baseline" CACHE STRING "Host zig target cpu.") ++ message(STATUS "Setting ZIG_CROSS_TARGET_MCPU ${ZIG_CROSS_TARGET_MCPU}") ++ endif() ++else() ++ set(CROSSCOMPILING_EMULATOR "") ++ set(ZIG_CROSS_TARGET_TRIPLE ${ZIG_TARGET_TRIPLE}) ++ set(ZIG_CROSS_TARGET_MCPU ${ZIG_TARGET_MCPU}) ++endif() + +@@ -815,5 +864,11 @@ + else() +- set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2") +- set(ZIG1_COMPILE_FLAGS "-std=c99 -Os") +- set(ZIG2_COMPILE_FLAGS "-std=c99 -O0 -fno-stack-protector") ++ if(ZIG_HOST_TARGET_ARCH MATCHES "powerpc64le") ++ set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2") ++ set(ZIG1_COMPILE_FLAGS "-std=c99 -Os") ++ set(ZIG2_COMPILE_FLAGS "-std=c99 -Os -fno-stack-protector --save-temps") ++ else() ++ set(ZIG_WASM2C_COMPILE_FLAGS "-std=c99 -O2") ++ set(ZIG1_COMPILE_FLAGS "-std=c99 -Os") ++ set(ZIG2_COMPILE_FLAGS "-std=c99 -Os") ++ endif() + if(APPLE) +@@ -840,3 +895,3 @@ + OUTPUT "${ZIG1_C_SOURCE}" +- COMMAND zig-wasm2c "${ZIG1_WASM_MODULE}" "${ZIG1_C_SOURCE}" ++ COMMAND ${CROSSCOMPILING_EMULATOR} ${PROJECT_BINARY_DIR}/zig-wasm2c "${ZIG1_WASM_MODULE}" "${ZIG1_C_SOURCE}" + DEPENDS zig-wasm2c "${ZIG1_WASM_MODULE}" +@@ -852,3 +907,9 @@ + else() +- target_link_libraries(zig1 LINK_PUBLIC m) ++ if(WIN32) ++ find_library(M NAMES m libm.lib NAMES_PER_DIR) ++ target_link_libraries(zig1 LINK_PUBLIC $M) ++ # target_link_libraries(zig1 LINK_PUBLIC $ENV{PREFIX}/Library/lib/libm.lib) ++ else() ++ target_link_libraries(zig1 LINK_PUBLIC m) ++ endif() + if(MINGW) +@@ -858,8 +919,11 @@ + ++if(NOT DEFINED ZIG_CROSS_TARGET_TRIPLE) ++ set(ZIG_CROSS_TARGET_TRIPLE ${ZIG_HOST_TARGET_TRIPLE}) ++endif() + set(BUILD_ZIG2_ARGS + "${PROJECT_SOURCE_DIR}/lib" +- build-exe -ofmt=c -lc -OReleaseSmall ++ build-exe -ofmt=c "${CROSSCOMPILING_LIBC}" -OReleaseSmall + --name zig2 + -femit-bin="${ZIG2_C_SOURCE}" +- -target "${ZIG_HOST_TARGET_TRIPLE}" ++ -target "${ZIG_CROSS_TARGET_TRIPLE}" + --dep "build_options" +@@ -873,3 +937,3 @@ + OUTPUT "${ZIG2_C_SOURCE}" +- COMMAND zig1 ${BUILD_ZIG2_ARGS} ++ COMMAND ${CROSSCOMPILING_EMULATOR} ${PROJECT_BINARY_DIR}/zig1 ${BUILD_ZIG2_ARGS} + DEPENDS zig1 "${ZIG_STAGE2_SOURCES}" +@@ -884,3 +948,3 @@ + -femit-bin="${ZIG_COMPILER_RT_C_SOURCE}" +- -target "${ZIG_HOST_TARGET_TRIPLE}" ++ -target "${ZIG_CROSS_TARGET_TRIPLE}" + --dep "build_options" +@@ -892,3 +956,3 @@ + OUTPUT "${ZIG_COMPILER_RT_C_SOURCE}" +- COMMAND zig1 ${BUILD_COMPILER_RT_ARGS} ++ COMMAND ${CROSSCOMPILING_EMULATOR} ${PROJECT_BINARY_DIR}/zig1 ${BUILD_COMPILER_RT_ARGS} + DEPENDS zig1 "${ZIG_STAGE2_SOURCES}" +@@ -931,4 +995,4 @@ + "-Dversion-string=${RESOLVED_ZIG_VERSION}" +- "-Dtarget=${ZIG_TARGET_TRIPLE}" +- "-Dcpu=${ZIG_TARGET_MCPU}" ++ "-Dtarget=${ZIG_CROSS_TARGET_TRIPLE}" ++ "-Dcpu=${ZIG_CROSS_TARGET_MCPU}" + +@@ -978,3 +1042,4 @@ + OUTPUT "${PROJECT_BINARY_DIR}/stage3/bin/zig" +- COMMAND zig2 build --prefix "${PROJECT_BINARY_DIR}/stage3" ${ZIG_BUILD_ARGS} ++ COMMAND ${CROSSCOMPILING_EMULATOR} ${PROJECT_BINARY_DIR}/zig2 build --prefix "${PROJECT_BINARY_DIR}/stage3" ${ZIG_BUILD_ARGS} ++ DEPENDS zig2 + COMMENT STATUS "Building stage3" +@@ -989,2 +1055,3 @@ + ++install(CODE "set(CROSSCOMPILING_EMULATOR \"${CROSSCOMPILING_EMULATOR}\")") + install(CODE "set(ZIG_EXECUTABLE \"${ZIG_EXECUTABLE}\")") diff --git a/recipe/patches/0003-cross-install.cmake.patch b/recipe/patches/0003-cross-install.cmake.patch new file mode 100644 index 000000000..e211c52e4 --- /dev/null +++ b/recipe/patches/0003-cross-install.cmake.patch @@ -0,0 +1,15 @@ +--- cmake/install.cmake 2024-06-06 14:05:11.000000000 -0500 ++++ cmake/install.cmake 2024-06-19 11:00:55.023460439 -0500 +@@ -2,3 +2,3 @@ + execute_process( +- COMMAND "${ZIG_EXECUTABLE}" ${ZIG_INSTALL_ARGS} ++ COMMAND ${CROSSCOMPILING_EMULATOR} "${ZIG_EXECUTABLE}" ${ZIG_INSTALL_ARGS} + WORKING_DIRECTORY "${ZIG2_WORKING_DIR}" +@@ -13,5 +13,5 @@ + message("::") +- message(":: argv: ${ZIG_EXECUTABLE} ${s_INSTALL_LIBSTAGE2_ARGS}") ++ message(":: argv: ${CROSSCOMPILING_EMULATOR} ${ZIG_EXECUTABLE} ${s_INSTALL_LIBSTAGE2_ARGS}") + +- set(_args ${ZIG_EXECUTABLE} ${ZIG_INSTALL_ARGS}) ++ set(_args ${CROSSCOMPILING_EMULATOR} ${ZIG_EXECUTABLE} ${ZIG_INSTALL_ARGS}) + list(LENGTH _args _len) diff --git a/recipe/patches/0004-cross-ppc64le-signal.h.patch b/recipe/patches/0004-cross-ppc64le-signal.h.patch new file mode 100644 index 000000000..b1fd5d7f4 --- /dev/null +++ b/recipe/patches/0004-cross-ppc64le-signal.h.patch @@ -0,0 +1,4 @@ +diff --git a/stage1/zig.h b/stage1/zig.h +index 05529feec7..38f01ca020 100644 +--- a/stage1/zig.h ++++ b/stage1/zig.h diff --git a/recipe/patches/xxxx-qemu-execve.patch b/recipe/patches/xxxx-qemu-execve.patch new file mode 100644 index 000000000..618bc5ab4 --- /dev/null +++ b/recipe/patches/xxxx-qemu-execve.patch @@ -0,0 +1,143 @@ +--- qemu/linux-user/main.c.orig 2024-07-13 15:31:51.826834383 -0500 ++++ qemu/linux-user/main.c 2024-07-13 16:17:44.996484934 -0500 +@@ -128,2 +128,3 @@ + const char *qemu_uname_release; ++const char *qemu_execve_path; + +@@ -378,2 +379,7 @@ + ++static void handle_arg_execve(const char *arg) ++{ ++ qemu_execve_path = strdup(arg); ++} ++ + static void handle_arg_reserved_va(const char *arg) +@@ -494,2 +500,4 @@ + "address", "set guest_base address to 'address'"}, ++ {"execve", "QEMU_EXECVE", true, handle_arg_execve, ++ "path", "use interpreter at 'path' when a process calls execve()"}, + {"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va, +--- qemu/linux-user/user-internals.h.orig 2024-07-13 15:31:51.834834526 -0500 ++++ qemu/linux-user/user-internals.h 2024-07-13 16:22:08.113225373 -0500 +@@ -30,2 +30,3 @@ + extern const char *qemu_uname_release; ++extern const char *qemu_execve_path; + extern unsigned long mmap_min_addr; +--- qemu/linux-user/syscall.c.orig 2024-07-13 15:31:51.834834526 -0500 ++++ qemu/linux-user/syscall.c 2024-07-13 18:42:00.033718159 -0500 +@@ -8417,2 +8417,104 @@ + ++#define BINPRM_BUF_SIZE 128 ++ ++/* qemu_execve() Must return target values and target errnos. */ ++static abi_long qemu_execve(const char *filename, char *argv[], ++ char *envp[]) ++{ ++ char *i_arg = NULL, *i_name = NULL; ++ char **new_argp; ++ int argc, fd, ret, i, offset = 3; ++ char *cp; ++ char buf[BINPRM_BUF_SIZE]; ++ ++ for (argc = 0; argv[argc] != NULL; argc++) { ++ /* nothing */ ; ++ } ++ ++ fd = open(filename, O_RDONLY); ++ if (fd == -1) { ++ return -ENOENT; ++ } ++ ++ ret = read(fd, buf, BINPRM_BUF_SIZE); ++ if (ret == -1) { ++ close(fd); ++ return -ENOENT; ++ } ++ ++ close(fd); ++ ++ /* adapted from the kernel ++ * https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/binfmt_script.c ++ */ ++ if ((buf[0] == '#') && (buf[1] == '!')) { ++ /* ++ * This section does the #! interpretation. ++ * Sorta complicated, but hopefully it will work. -TYT ++ */ ++ ++ buf[BINPRM_BUF_SIZE - 1] = '\0'; ++ cp = strchr(buf, '\n'); ++ if (cp == NULL) { ++ cp = buf+BINPRM_BUF_SIZE-1; ++ } ++ *cp = '\0'; ++ while (cp > buf) { ++ cp--; ++ if ((*cp == ' ') || (*cp == '\t')) { ++ *cp = '\0'; ++ } else { ++ break; ++ } ++ } ++ for (cp = buf+2; (*cp == ' ') || (*cp == '\t'); cp++) { ++ /* nothing */ ; ++ } ++ if (*cp == '\0') { ++ return -ENOEXEC; /* No interpreter name found */ ++ } ++ i_name = cp; ++ i_arg = NULL; ++ for ( ; *cp && (*cp != ' ') && (*cp != '\t'); cp++) { ++ /* nothing */ ; ++ } ++ while ((*cp == ' ') || (*cp == '\t')) { ++ *cp++ = '\0'; ++ } ++ if (*cp) { ++ i_arg = cp; ++ } ++ ++ if (i_arg) { ++ offset = 5; ++ } else { ++ offset = 4; ++ } ++ } ++ ++ new_argp = alloca((argc + offset + 1) * sizeof(void *)); ++ ++ /* Copy the original arguments with offset */ ++ for (i = 0; i < argc; i++) { ++ new_argp[i + offset] = argv[i]; ++ } ++ ++ new_argp[0] = strdup(qemu_execve_path); ++ new_argp[1] = strdup("-0"); ++ strcpy(new_argp[offset], filename); ++ new_argp[argc + offset] = NULL; ++ ++ if (i_name) { ++ new_argp[2] = i_name; ++ new_argp[3] = i_name; ++ ++ if (i_arg) { ++ new_argp[4] = i_arg; ++ } ++ } else { ++ new_argp[2] = argv[0]; ++ } ++ return get_errno(execve(qemu_execve_path, new_argp, envp)); ++} ++ + ssize_t do_guest_readlink(const char *pathname, char *buf, size_t bufsiz) +@@ -8533,4 +8635,8 @@ + ret = is_execveat +- ? safe_execveat(dirfd, exe, argp, envp, flags) +- : safe_execve(exe, argp, envp); ++ ? ((qemu_execve_path && *qemu_execve_path) ++ ? get_errno(qemu_execve(exe, argp, envp)) ++ : safe_execveat(dirfd, exe, argp, envp, flags)) ++ : ((qemu_execve_path && *qemu_execve_path) ++ ? get_errno(qemu_execve(exe, argp, envp)) ++ : safe_execve(exe, argp, envp)); + ret = get_errno(ret); diff --git a/recipe/patches/xxxx-zig2.c-asm-clobber-list.patch b/recipe/patches/xxxx-zig2.c-asm-clobber-list.patch new file mode 100644 index 000000000..3006a1e8c --- /dev/null +++ b/recipe/patches/xxxx-zig2.c-asm-clobber-list.patch @@ -0,0 +1,38 @@ +--- zig2.c 2024-06-20 11:33:33.032130211 -0500 ++++ zig2.c 2024-06-20 11:46:49.218920956 -0500 +@@ -845078,7 +845078,7 @@ + register uintptr_t const t6 __asm("r5") = a3; + register uintptr_t const t7 __asm("r6") = a4; + register uintptr_t const t8 __asm("r7") = a5; +- __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7), [arg5]"r"(t8): "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); ++ __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7), [arg5]"r"(t8): "memory", "cr0", "r8", "r9", "r10", "r11", "r12"); + t1 = t2; + return t1; + } +@@ -1766263,7 +1766263,7 @@ + register uintptr_t const t7 __asm("r6") = a4; + register uintptr_t const t8 __asm("r7") = a5; + register uintptr_t const t9 __asm("r8") = a6; +- __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7), [arg5]"r"(t8), [arg6]"r"(t9): "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); ++ __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7), [arg5]"r"(t8), [arg6]"r"(t9): "memory", "cr0", "r9", "r10", "r11", "r12"); + t1 = t2; + return t1; + } +@@ -1939383,7 +1939383,7 @@ + register uintptr_t const t4 __asm("r3") = a1; + register uintptr_t const t5 __asm("r4") = a2; + register uintptr_t const t6 __asm("r5") = a3; +- __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6): "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); ++ __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6): "memory", "cr0", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); + t1 = t2; + return t1; + } +@@ -2549503,7 +2549503,7 @@ + register uintptr_t const t5 __asm("r4") = a2; + register uintptr_t const t6 __asm("r5") = a3; + register uintptr_t const t7 __asm("r6") = a4; +- __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7): "memory", "cr0", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); ++ __asm volatile(" sc\n bns+ 1f\n neg 3, 3\n 1:": [ret]"=r"(t2): [number]"r"(t3), [arg1]"r"(t4), [arg2]"r"(t5), [arg3]"r"(t6), [arg4]"r"(t7): "memory", "cr0", "r7", "r8", "r9", "r10", "r11", "r12"); + t1 = t2; + return t1; + }
VariantStatus
linux_64linux_ppc64le - variant - -
linux_aarch64 - - variant - -
osx_64 - - variant - -
osx_arm64 - - variant - -
win_64 - - variant + variant