From: Adeel Mujahid <3840695+am11@users.noreply.github.com> Date: Thu, 24 Aug 2023 19:32:29 +0000 (+0300) Subject: Sync eng/native from dotnet/runtime (#4178) X-Git-Tag: accepted/tizen/unified/riscv/20231226.055542~37^2^2~74 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c1cbf666bae55f119f53080e75b5cea6b6bf4b42;p=platform%2Fcore%2Fdotnet%2Fdiagnostics.git Sync eng/native from dotnet/runtime (#4178) * Sync eng/native with runtime * Includes changes from https://github.com/dotnet/runtime/pull/90952 * Since diagnostics is using newest arcade, reacted to https://github.com/dotnet/arcade/pull/13961 in second commit --- diff --git a/diagnostics.yml b/diagnostics.yml index bd0e5e5a6..a1ea54344 100644 --- a/diagnostics.yml +++ b/diagnostics.yml @@ -134,12 +134,12 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Release + _PublishArtifacts: bin/linux.x64.Release ${{ if in(variables['Build.Reason'], 'PullRequest') }}: Build_Debug: _BuildConfig: Debug _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Debug + _PublishArtifacts: bin/linux.x64.Debug - template: /eng/pipelines/build.yml parameters: @@ -153,14 +153,14 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Release - _ArtifactsTargetPath: bin/Linux-musl.x64.Release + _PublishArtifacts: bin/linux.x64.Release + _ArtifactsTargetPath: bin/linux-musl.x64.Release ${{ if in(variables['Build.Reason'], 'PullRequest') }}: Build_Debug: _BuildConfig: Debug _BuildArch: x64 - _PublishArtifacts: bin/Linux.x64.Debug - _ArtifactsTargetPath: bin/Linux-musl.x64.Debug + _PublishArtifacts: bin/linux.x64.Debug + _ArtifactsTargetPath: bin/linux-musl.x64.Debug - template: /eng/pipelines/build.yml parameters: @@ -171,7 +171,7 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: x64 - _PublishArtifacts: bin/OSX.x64.Release + _PublishArtifacts: bin/osx.x64.Release ${{ if in(variables['Build.Reason'], 'PullRequest') }}: Build_Debug: _BuildConfig: Debug @@ -188,7 +188,7 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: arm64 - _PublishArtifacts: bin/OSX.arm64.Release + _PublishArtifacts: bin/osx.arm64.Release ${{ if in(variables['Build.Reason'], 'PullRequest') }}: Build_Debug: _BuildConfig: Debug @@ -207,7 +207,7 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: arm - _PublishArtifacts: bin/Linux.arm.Release + _PublishArtifacts: bin/linux.arm.Release - template: /eng/pipelines/build.yml parameters: @@ -221,7 +221,7 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: arm64 - _PublishArtifacts: bin/Linux.arm64.Release + _PublishArtifacts: bin/linux.arm64.Release - template: /eng/pipelines/build.yml parameters: @@ -236,8 +236,8 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: arm - _PublishArtifacts: bin/Linux.arm.Release - _ArtifactsTargetPath: bin/Linux-musl.arm.Release + _PublishArtifacts: bin/linux.arm.Release + _ArtifactsTargetPath: bin/linux-musl.arm.Release - template: /eng/pipelines/build.yml parameters: @@ -252,8 +252,8 @@ extends: Build_Release: _BuildConfig: Release _BuildArch: arm64 - _PublishArtifacts: bin/Linux.arm64.Release - _ArtifactsTargetPath: bin/Linux-musl.arm64.Release + _PublishArtifacts: bin/linux.arm64.Release + _ArtifactsTargetPath: bin/linux-musl.arm64.Release ############################ # # diff --git a/eng/build.sh b/eng/build.sh index ae11013d0..db449d4ac 100755 --- a/eng/build.sh +++ b/eng/build.sh @@ -5,7 +5,6 @@ # Obtain the location of the bash script to figure out where the root of the repo is. __RepoRootDir="$(cd "$(dirname "$0")"/..; pwd -P)" -__BuildArch=x64 __BuildType=Debug __CMakeArgs= __CommonMSBuildArgs= @@ -16,8 +15,6 @@ __CrossBuild=0 __DotnetRuntimeDownloadVersion="default" __DotnetRuntimeVersion="default" __ExtraCmakeArgs= -__HostArch=x64 -__HostOS=Linux __IsMSBuildOnNETCoreSupported=0 __ManagedBuild=1 __ManagedBuildArgs= @@ -30,7 +27,6 @@ __RuntimeSourceFeed= __RuntimeSourceFeedKey= __SkipConfigure=0 __SkipGenerateVersion=0 -__TargetOS=Linux __Test=0 __UnprocessedBuildArgs= @@ -44,7 +40,7 @@ handle_arguments() { lowerI="$(echo "${1/--/-}" | tr "[:upper:]" "[:lower:]")" case "$lowerI" in architecture|-architecture|-a) - __BuildArch="$(echo "$2" | tr "[:upper:]" "[:lower:]")" + __TargetArch="$(echo "$2" | tr "[:upper:]" "[:lower:]")" __ShiftArgs=1 ;; @@ -113,7 +109,7 @@ handle_arguments() { source "$__RepoRootDir"/eng/native/build-commons.sh __LogsDir="$__RootBinDir/log/$__BuildType" -__ConfigTriplet="$__TargetOS.$__BuildArch.$__BuildType" +__ConfigTriplet="$__TargetOS.$__TargetArch.$__BuildType" __BinDir="$__RootBinDir/bin/$__ConfigTriplet" __ArtifactsIntermediatesDir="$__RootBinDir/obj" __IntermediatesDir="$__ArtifactsIntermediatesDir/$__ConfigTriplet" @@ -134,7 +130,7 @@ __ExtraCmakeArgs="$__CMakeArgs $__ExtraCmakeArgs -DCLR_MANAGED_BINARY_DIR=$__Roo export __CMakeBinDir="$__BinDir" -if [[ "$__BuildArch" == "armel" ]]; then +if [[ "$__TargetArch" == "armel" ]]; then # Armel cross build is Tizen specific and does not support Portable RID build __PortableBuild=0 fi @@ -163,7 +159,7 @@ if [[ "$__ManagedBuild" == 1 ]]; then /p:GenerateVersionSourceFile=true \ /p:NativeVersionSourceFile="$__ArtifactsIntermediatesDir/_version.c" \ /p:Configuration="$__BuildType" \ - /p:Platform="$__BuildArch" \ + /p:Platform="$__TargetArch" \ $__UnprocessedBuildArgs if [ $? != 0 ]; then @@ -172,19 +168,11 @@ if [[ "$__ManagedBuild" == 1 ]]; then fi fi -# -# Initialize the target distro name -# - -initTargetDistroRid - -echo "RID: $__DistroRid" - # # Setup LLDB paths for native build # -if [ "$__HostOS" == "OSX" ]; then +if [ "$__HostOS" == "osx" ]; then export LLDB_H="$__RepoRootDir"/src/SOS/lldbplugin/swift-4.0 export LLDB_LIB=$(xcode-select -p)/../SharedFrameworks/LLDB.framework/LLDB export LLDB_PATH=$(xcode-select -p)/usr/bin/lldb @@ -201,12 +189,12 @@ if [ "$__HostOS" == "OSX" ]; then which python python --version - if [[ "$__BuildArch" == x64 ]]; then + if [[ "$__TargetArch" == x64 ]]; then __ExtraCmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $__ExtraCmakeArgs" - elif [[ "$__BuildArch" == arm64 ]]; then + elif [[ "$__TargetArch" == arm64 ]]; then __ExtraCmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $__ExtraCmakeArgs" else - echo "Error: Unknown OSX architecture $__BuildArch." + echo "Error: Unknown OSX architecture $__TargetArch." exit 1 fi fi @@ -215,7 +203,7 @@ fi # Build native components # if [[ "$__NativeBuild" == 1 ]]; then - build_native "$__TargetOS" "$__BuildArch" "$__RepoRootDir" "$__IntermediatesDir" "install" "$__ExtraCmakeArgs" "diagnostic component" | tee "$__LogsDir"/make.log + build_native "$__TargetOS" "$__TargetArch" "$__RepoRootDir" "$__IntermediatesDir" "install" "$__ExtraCmakeArgs" "diagnostic component" | tee "$__LogsDir"/make.log if [ "$?" != 0 ]; then echo "Native build FAILED" @@ -229,8 +217,8 @@ fi if [[ "$__NativeBuild" == 1 || "$__Test" == 1 ]]; then __targetRid=net6.0 - __dotnet_sos=$__RootBinDir/bin/dotnet-sos/$__BuildType/$__targetRid/publish/$__DistroRid - __dotnet_dump=$__RootBinDir/bin/dotnet-dump/$__BuildType/$__targetRid/publish/$__DistroRid + __dotnet_sos=$__RootBinDir/bin/dotnet-sos/$__BuildType/$__targetRid/publish/$__OutputRid + __dotnet_dump=$__RootBinDir/bin/dotnet-dump/$__BuildType/$__targetRid/publish/$__OutputRid mkdir -p "$__dotnet_sos" mkdir -p "$__dotnet_dump" @@ -290,7 +278,7 @@ if [[ "$__Test" == 1 ]]; then --test \ --configuration "$__BuildType" \ /bl:"$__LogsDir"/Test.binlog \ - /p:BuildArch="$__BuildArch" \ + /p:BuildArch="$__TargetArch" \ /p:PrivateBuildPath="$__PrivateBuildPath" \ /p:DotnetRuntimeVersion="$__DotnetRuntimeVersion" \ /p:DotnetRuntimeDownloadVersion="$__DotnetRuntimeDownloadVersion" \ diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh index c9160b1e4..ba561ed6e 100755 --- a/eng/native/build-commons.sh +++ b/eng/native/build-commons.sh @@ -2,16 +2,16 @@ initTargetDistroRid() { - source "$__RepoRootDir/eng/native/init-distro-rid.sh" + source "$__RepoRootDir/eng/common/native/init-distro-rid.sh" local passedRootfsDir="" # Only pass ROOTFS_DIR if cross is specified and the target platform is not Darwin that doesn't use rootfs - if [[ "$__CrossBuild" == 1 && "$platform" != "Darwin" ]]; then + if [[ "$__CrossBuild" == 1 && "$platform" != "darwin" ]]; then passedRootfsDir="$ROOTFS_DIR" fi - initDistroRidGlobal "$__TargetOS" "$__TargetArch" "$__PortableBuild" "$passedRootfsDir" + initDistroRidGlobal "$__TargetOS" "$__TargetArch" "$passedRootfsDir" } setup_dirs() @@ -28,7 +28,7 @@ check_prereqs() { echo "Checking prerequisites..." - if [[ "$__HostOS" == "OSX" ]]; then + if [[ "$__HostOS" == "osx" ]]; then # Check presence of pkg-config on the path command -v pkg-config 2>/dev/null || { echo >&2 "Please install pkg-config before running this script, see https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/macos-requirements.md"; exit 1; } @@ -63,7 +63,7 @@ build_native() # All set to commence the build echo "Commencing build of \"$target\" target in \"$message\" for $__TargetOS.$__TargetArch.$__BuildType in $intermediatesDir" - if [[ "$targetOS" == OSX || "$targetOS" == MacCatalyst ]]; then + if [[ "$targetOS" == osx || "$targetOS" == maccatalyst ]]; then if [[ "$hostArch" == x64 ]]; then cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs" elif [[ "$hostArch" == arm64 ]]; then @@ -74,17 +74,19 @@ build_native() fi fi - if [[ "$targetOS" == MacCatalyst ]]; then - cmakeArgs="-DCMAKE_SYSTEM_VARIANT=MacCatalyst $cmakeArgs" + if [[ "$targetOS" == maccatalyst ]]; then + cmakeArgs="-DCMAKE_SYSTEM_VARIANT=maccatalyst $cmakeArgs" fi - if [[ ( "$targetOS" == Android || "$targetOS" == linux-bionic ) && -z "$ROOTFS_DIR" ]]; then + if [[ "$targetOS" == android || "$targetOS" == linux-bionic ]]; then if [[ -z "$ANDROID_NDK_ROOT" ]]; then echo "Error: You need to set the ANDROID_NDK_ROOT environment variable pointing to the Android NDK root." exit 1 fi - # keep ANDROID_PLATFORM in sync with src/mono/Directory.Build.props + cmakeArgs="-C $__RepoRootDir/eng/native/tryrun.cmake $cmakeArgs" + + # keep ANDROID_PLATFORM in sync with SetOSTargetMinVersions in the root Directory.Build.props cmakeArgs="-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 $cmakeArgs" # Don't try to set CC/CXX in init-compiler.sh - it's handled in android.toolchain.cmake already @@ -102,6 +104,58 @@ build_native() echo "Error: Unknown Android architecture $hostArch." exit 1 fi + elif [[ "$targetOS" == iossimulator ]]; then + cmakeArgs="-C $__RepoRootDir/eng/native/tryrun_ios_tvos.cmake $cmakeArgs" + + # set default iOS simulator deployment target + # keep in sync with SetOSTargetMinVersions in the root Directory.Build.props + cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs" + if [[ "$__TargetArch" == x64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs" + elif [[ "$__TargetArch" == arm64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs" + else + echo "Error: Unknown iOS Simulator architecture $__TargetArch." + exit 1 + fi + elif [[ "$targetOS" == ios ]]; then + cmakeArgs="-C $__RepoRootDir/eng/native/tryrun_ios_tvos.cmake $cmakeArgs" + + # set default iOS device deployment target + # keep in sync with SetOSTargetMinVersions in the root Directory.Build.props + cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs" + if [[ "$__TargetArch" == arm64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs" + else + echo "Error: Unknown iOS architecture $__TargetArch." + exit 1 + fi + elif [[ "$targetOS" == tvossimulator ]]; then + cmakeArgs="-C $__RepoRootDir/eng/native/tryrun_ios_tvos.cmake $cmakeArgs" + + # set default tvOS simulator deployment target + # keep in sync with SetOSTargetMinVersions in the root Directory.Build.props + cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs" + if [[ "$__TargetArch" == x64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs" + elif [[ "$__TargetArch" == arm64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs" + else + echo "Error: Unknown tvOS Simulator architecture $__TargetArch." + exit 1 + fi + elif [[ "$targetOS" == tvos ]]; then + cmakeArgs="-C $__RepoRootDir/eng/native/tryrun_ios_tvos.cmake $cmakeArgs" + + # set default tvOS device deployment target + # keep in sync with SetOSTargetMinVersions in the root Directory.Build.props + cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs" + if [[ "$__TargetArch" == arm64 ]]; then + cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs" + else + echo "Error: Unknown tvOS architecture $__TargetArch." + exit 1 + fi fi if [[ "$__UseNinja" == 1 ]]; then @@ -163,7 +217,7 @@ build_native() popd else cmake_command=cmake - if [[ "$build_arch" == "wasm" && "$__TargetOS" == "Browser" ]]; then + if [[ "$build_arch" == "wasm" && "$__TargetOS" == "browser" ]]; then cmake_command="emcmake cmake" echo "Executing $cmake_command --build \"$intermediatesDir\" --target $target -- -j $__NumProc" $cmake_command --build "$intermediatesDir" --target $target -- -j "$__NumProc" @@ -216,6 +270,7 @@ usage() echo "-portablebuild: pass -portablebuild=false to force a non-portable build." echo "-skipconfigure: skip build configuration." echo "-keepnativesymbols: keep native/unmanaged debug symbols." + echo "-fsanitize: Enable native sanitizers" echo "-verbose: optional argument to enable verbose build output." echo "" echo "Additional Options:" @@ -231,17 +286,15 @@ source "$__RepoRootDir/eng/native/init-os-and-arch.sh" __TargetArch=$arch __TargetOS=$os -__HostOS=$os -__BuildOS=$os __OutputRid='' # Get the number of processors available to the scheduler -platform="$(uname)" -if [[ "$platform" == "FreeBSD" ]]; then +platform="$(uname -s | tr '[:upper:]' '[:lower:]')" +if [[ "$platform" == "freebsd" ]]; then __NumProc="$(($(sysctl -n hw.ncpu)+1))" -elif [[ "$platform" == "NetBSD" || "$platform" == "SunOS" ]]; then +elif [[ "$platform" == "netbsd" || "$platform" == "sunos" ]]; then __NumProc="$(($(getconf NPROCESSORS_ONLN)+1))" -elif [[ "$platform" == "Darwin" ]]; then +elif [[ "$platform" == "darwin" ]]; then __NumProc="$(($(getconf _NPROCESSORS_ONLN)+1))" elif command -v nproc > /dev/null 2>&1; then __NumProc="$(nproc)" @@ -340,6 +393,17 @@ while :; do __CMakeArgs="$__CMakeArgs -DCLR_CMAKE_KEEP_NATIVE_SYMBOLS=true" ;; + -fsanitize) + __CMakeArgs="$__CMakeArgs -DCLR_CMAKE_ENABLE_SANITIZERS=$2" + EnableNativeSanitizers=$2 + shift + ;; + -fsanitize=*) + sanitizers="${lowerI/#-fsanitize=/}" # -fsanitize=address => address + __CMakeArgs="$__CMakeArgs -DCLR_CMAKE_ENABLE_SANITIZERS=$sanitizers" + EnableNativeSanitizers=$sanitizers + ;; + ninja|-ninja) __UseNinja=1 ;; @@ -410,7 +474,7 @@ while :; do os|-os) if [[ -n "$2" ]]; then - __TargetOS="$2" + __TargetOS=$(echo "$2" | tr '[:upper:]' '[:lower:]') shift else echo "ERROR: 'os' requires a non-empty option argument" @@ -421,6 +485,7 @@ while :; do hostarch|-hostarch) if [[ -n "$2" ]]; then __HostArch="$2" + __ExplicitHostArch=1 shift else echo "ERROR: 'hostarch' requires a non-empty option argument" @@ -428,6 +493,16 @@ while :; do fi ;; + hostos|-hostos) + if [[ -n "$2" ]]; then + __HostOS="$2" + shift + else + echo "ERROR: 'hostos' requires a non-empty option argument" + exit 1 + fi + ;; + *) handle_arguments "$1" "$2" if [[ "$__ShiftArgs" == 1 ]]; then @@ -444,6 +519,10 @@ if [[ -z "$__HostArch" ]]; then __HostArch=$__TargetArch fi +if [[ -z "$__HostOS" ]]; then + __HostOS=$__TargetOS +fi + __CommonMSBuildArgs="/p:TargetArchitecture=$__TargetArch /p:Configuration=$__BuildType /p:TargetOS=$__TargetOS /nodeReuse:false $__OfficialBuildIdArg $__SignTypeArg $__SkipRestoreArg" # Configure environment if we are doing a verbose build @@ -460,13 +539,13 @@ fi if [[ "$__TargetArch" == wasm ]]; then # nothing to do here true -elif [[ "$__TargetOS" == iOS || "$__TargetOS" == iOSSimulator ]]; then +elif [[ "$__TargetOS" == ios || "$__TargetOS" == iossimulator ]]; then # nothing to do here true -elif [[ "$__TargetOS" == tvOS || "$__TargetOS" == tvOSSimulator ]]; then +elif [[ "$__TargetOS" == tvos || "$__TargetOS" == tvossimulator ]]; then # nothing to do here true -elif [[ "$__TargetOS" == Android ]]; then +elif [[ "$__TargetOS" == android ]]; then # nothing to do here true else @@ -478,15 +557,23 @@ if [[ "$__CrossBuild" == 1 ]]; then CROSSCOMPILE=1 export CROSSCOMPILE # Darwin that doesn't use rootfs - if [[ -z "$ROOTFS_DIR" && "$platform" != "Darwin" ]]; then + if [[ -z "$ROOTFS_DIR" && "$platform" != "darwin" ]]; then ROOTFS_DIR="$__RepoRootDir/.tools/rootfs/$__TargetArch" export ROOTFS_DIR fi fi -# init the target distro name +# init the target distro name (__DistroRid) and target portable os (__PortableTargetOS). initTargetDistroRid - if [ -z "$__OutputRid" ]; then - __OutputRid="$(echo $__DistroRid | tr '[:upper:]' '[:lower:]')" + if [[ "$__PortableBuild" == 0 ]]; then + __OutputRid="$__DistroRid" + else + __OutputRid="$__PortableTargetOS-$__TargetArch" + fi fi +export __OutputRid +echo "__OutputRid: ${__OutputRid}" + +# When the host runs on an unknown rid, it falls back to the output rid +__HostFallbackOS="${__OutputRid%-*}" # Strip architecture diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index d9443ce6d..0be4937c7 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -1,3 +1,7 @@ +# Due to how we build the libraries native build as part of the CoreCLR build as well as standalone, +# we can end up coming to this file twice. Only run it once to simplify our build. +include_guard() + include(${CMAKE_CURRENT_LIST_DIR}/configuretools.cmake) # Set initial flags for each configuration @@ -19,12 +23,13 @@ include(${CMAKE_CURRENT_LIST_DIR}/configureoptimization.cmake) #----------------------------------------------------- if (CLR_CMAKE_HOST_UNIX) - add_compile_options(-g) add_compile_options(-Wall) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wno-null-conversion) + add_compile_options(-glldb) else() add_compile_options($<$:-Werror=conversion-null>) + add_compile_options(-g) endif() endif() @@ -69,20 +74,39 @@ if (MSVC) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUGTYPE:CV,FIXUP") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION}") set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUGTYPE:CV,FIXUP") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864") + # For sanitized builds, we bump up the stack size to 8MB to match behavior on Unix platforms. + # Sanitized builds can use significantly more stack space than non-sanitized builds due to instrumentation. + # We don't want to change the default stack size for all builds, as that will likely cause confusion and will + # increase memory usage. + if (CLR_CMAKE_ENABLE_SANITIZERS) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:0x800000") + else() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:0x180000") + endif() if(EXISTS ${CLR_SOURCELINK_FILE_PATH}) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /sourcelink:${CLR_SOURCELINK_FILE_PATH}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /sourcelink:${CLR_SOURCELINK_FILE_PATH}") endif(EXISTS ${CLR_SOURCELINK_FILE_PATH}) + if (CMAKE_GENERATOR MATCHES "^Visual Studio.*$") + # Debug build specific flags + # The Ninja generator doesn't appear to have the default `/INCREMENTAL:ON` that + # the Visual Studio generator has. Therefore we will override the default for Visual Studio only. + add_linker_flag(/INCREMENTAL:NO DEBUG) + add_linker_flag(/OPT:REF DEBUG) + add_linker_flag(/OPT:NOICF DEBUG) + endif (CMAKE_GENERATOR MATCHES "^Visual Studio.*$") + # Checked build specific flags add_linker_flag(/INCREMENTAL:NO CHECKED) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification" add_linker_flag(/OPT:REF CHECKED) @@ -101,10 +125,6 @@ if (MSVC) add_linker_flag(/OPT:ICF RELWITHDEBINFO) set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG") - # Force uCRT to be dynamically linked for Release build - add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE) - add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE) - elseif (CLR_CMAKE_HOST_UNIX) # Set the values to display when interactively configuring CMAKE_BUILD_TYPE set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "DEBUG;CHECKED;RELEASE;RELWITHDEBINFO") @@ -112,63 +132,7 @@ elseif (CLR_CMAKE_HOST_UNIX) # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE) - set(CLR_SANITIZE_CXX_OPTIONS "") - set(CLR_SANITIZE_LINK_OPTIONS "") - - # set the CLANG sanitizer flags for debug build - if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED) - # obtain settings from running enablesanitizers.sh - string(FIND "$ENV{DEBUG_SANITIZERS}" "asan" __ASAN_POS) - string(FIND "$ENV{DEBUG_SANITIZERS}" "ubsan" __UBSAN_POS) - if ((${__ASAN_POS} GREATER -1) OR (${__UBSAN_POS} GREATER -1)) - list(APPEND CLR_SANITIZE_CXX_OPTIONS -fsanitize-blacklist=${CMAKE_CURRENT_SOURCE_DIR}/sanitizerblacklist.txt) - set (CLR_CXX_SANITIZERS "") - set (CLR_LINK_SANITIZERS "") - if (${__ASAN_POS} GREATER -1) - list(APPEND CLR_CXX_SANITIZERS address) - list(APPEND CLR_LINK_SANITIZERS address) - set(CLR_SANITIZE_CXX_FLAGS "${CLR_SANITIZE_CXX_FLAGS}address,") - set(CLR_SANITIZE_LINK_FLAGS "${CLR_SANITIZE_LINK_FLAGS}address,") - add_definitions(-DHAS_ASAN) - message("Address Sanitizer (asan) enabled") - endif () - if (${__UBSAN_POS} GREATER -1) - # all sanitizer flags are enabled except alignment (due to heavy use of __unaligned modifier) - list(APPEND CLR_CXX_SANITIZERS - "bool" - bounds - enum - float-cast-overflow - float-divide-by-zero - "function" - integer - nonnull-attribute - null - object-size - "return" - returns-nonnull-attribute - shift - unreachable - vla-bound - vptr) - list(APPEND CLR_LINK_SANITIZERS - undefined) - message("Undefined Behavior Sanitizer (ubsan) enabled") - endif () - list(JOIN CLR_CXX_SANITIZERS "," CLR_CXX_SANITIZERS_OPTIONS) - list(APPEND CLR_SANITIZE_CXX_OPTIONS "-fsanitize=${CLR_CXX_SANITIZERS_OPTIONS}") - list(JOIN CLR_LINK_SANITIZERS "," CLR_LINK_SANITIZERS_OPTIONS) - list(APPEND CLR_SANITIZE_LINK_OPTIONS "-fsanitize=${CLR_LINK_SANITIZERS_OPTIONS}") - - # -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint" - add_compile_options("$<$,$>:${CLR_SANITIZE_CXX_OPTIONS};-fdata-sections;-O1>") - add_linker_flag("${CLR_SANITIZE_LINK_OPTIONS}" DEBUG CHECKED) - # -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking) - add_linker_flag("-Wl,--gc-sections" DEBUG CHECKED) - endif () - endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED) - - if(CLR_CMAKE_HOST_BROWSER) + if(CLR_CMAKE_HOST_BROWSER OR CLR_CMAKE_HOST_WASI) # The emscripten build has additional warnings so -Werror breaks add_compile_options(-Wno-unused-parameter) add_compile_options(-Wno-alloca) @@ -176,6 +140,129 @@ elseif (CLR_CMAKE_HOST_UNIX) endif() endif(MSVC) +if (CLR_CMAKE_ENABLE_SANITIZERS) + set (CLR_CMAKE_BUILD_SANITIZERS "") + set (CLR_CMAKE_SANITIZER_RUNTIMES "") + string(FIND "${CLR_CMAKE_ENABLE_SANITIZERS}" "address" __ASAN_POS) + if(${__ASAN_POS} GREATER -1) + # Set up build flags for AddressSanitizer + set (CLR_CMAKE_ENABLE_ASAN ON) + if (MSVC) + # /RTC1 is added by default by CMake and incompatible with ASAN, so remove it. + string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + string(REPLACE "/RTC1" "" CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}") + string(REPLACE "/RTC1" "" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}") + endif() + # For Mac and Windows platforms, we install the ASAN runtime next to the rest of our outputs to ensure that it's present when we execute our tests on Helix machines + # The rest of our platforms use statically-linked ASAN so this isn't a concern for those platforms. + if (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST) + function(getSanitizerRuntimeDirectory output) + enable_language(C) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-resource-dir + OUTPUT_VARIABLE compilerResourceDir + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(${output} "${compilerResourceDir}/lib/darwin/" PARENT_SCOPE) + endfunction() + getSanitizerRuntimeDirectory(sanitizerRuntimeDirectory) + find_library(ASAN_RUNTIME clang_rt.asan_osx_dynamic PATHS ${sanitizerRuntimeDirectory}) + add_compile_definitions(SANITIZER_SHARED_RUNTIME) + elseif (CLR_CMAKE_TARGET_WIN32) + function(getSanitizerRuntimeDirectory output archSuffixOutput) + get_filename_component(compiler_directory "${CMAKE_C_COMPILER}" DIRECTORY) + set(${output} "${compiler_directory}" PARENT_SCOPE) + if (CLR_CMAKE_TARGET_ARCH_I386) + set(${archSuffixOutput} "i386" PARENT_SCOPE) + elseif (CLR_CMAKE_TARGET_ARCH_AMD64) + set(${archSuffixOutput} "x86_64" PARENT_SCOPE) + elseif (CLR_CMAKE_TARGET_ARCH_ARM) + set(${archSuffixOutput} "armhf" PARENT_SCOPE) + elseif (CLR_CMAKE_TARGET_ARCH_ARM64) + set(${archSuffixOutput} "aarch64" PARENT_SCOPE) + endif() + endfunction() + getSanitizerRuntimeDirectory(sanitizerRuntimeDirectory archSuffix) + set(ASAN_RUNTIME "${sanitizerRuntimeDirectory}/clang_rt.asan_dynamic-${archSuffix}.dll") + add_compile_definitions(SANITIZER_SHARED_RUNTIME) + endif() + if (CLR_CMAKE_ENABLE_ASAN) + message("-- Address Sanitizer (asan) enabled") + list(APPEND CLR_CMAKE_BUILD_SANITIZERS + address) + list(APPEND CLR_CMAKE_SANITIZER_RUNTIMES + address) + # We can't use preprocessor defines to determine if we're building with ASAN in assembly, so we'll + # define the preprocessor define ourselves. + add_compile_definitions($<$:HAS_ADDRESS_SANITIZER>) + + # Disable the use-after-return check for ASAN on Clang. This is because we have a lot of code that + # depends on the fact that our locals are not saved in a parallel stack, so we can't enable this today. + # If we ever have a way to detect a parallel stack and track its bounds, we can re-enable this check. + add_compile_options($<$:-fsanitize-address-use-after-return=never>) + add_compile_options($<$:-fsanitize-address-use-after-return=never>) + endif() + endif() + + # Set up build flags for UBSanitizer + if (CLR_CMAKE_HOST_UNIX) + + set (CLR_CMAKE_ENABLE_UBSAN OFF) + # COMPAT: Allow enabling UBSAN in Debug/Checked builds via an environment variable. + if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED) + # obtain settings from running enablesanitizers.sh + string(FIND "$ENV{DEBUG_SANITIZERS}" "ubsan" __UBSAN_ENV_POS) + if (${__UBSAN_ENV_POS} GREATER -1) + set(CLR_CMAKE_ENABLE_UBSAN ON) + endif() + endif() + string(FIND "${CLR_CMAKE_ENABLE_SANITIZERS}" "undefined" __UBSAN_POS) + if (${__UBSAN_POS} GREATER -1) + set(CLR_CMAKE_ENABLE_UBSAN ON) + endif() + + # set the CLANG sanitizer flags for debug build + if(CLR_CMAKE_ENABLE_UBSAN) + list(APPEND CLR_CMAKE_BUILD_SANITIZE_OPTIONS -fsanitize-ignorelist=${CMAKE_CURRENT_SOURCE_DIR}/sanitizer-ignorelist.txt) + # all sanitizer flags are enabled except alignment (due to heavy use of __unaligned modifier) + list(APPEND CLR_CMAKE_BUILD_SANITIZERS + "bool" + bounds + enum + float-cast-overflow + float-divide-by-zero + "function" + integer + nonnull-attribute + null + object-size + "return" + returns-nonnull-attribute + shift + unreachable + vla-bound + vptr) + list(APPEND CLR_CMAKE_SANITIZER_RUNTIMES + undefined) + message("-- Undefined Behavior Sanitizer (ubsan) enabled") + endif () + endif() + list(JOIN CLR_CMAKE_BUILD_SANITIZERS "," CLR_CMAKE_BUILD_SANITIZERS) + list(JOIN CLR_CMAKE_SANITIZER_RUNTIMES "," CLR_LINK_SANITIZERS_OPTIONS) + if (CLR_CMAKE_BUILD_SANITIZERS) + list(APPEND CLR_CMAKE_BUILD_SANITIZE_OPTIONS "-fsanitize=${CLR_CMAKE_BUILD_SANITIZERS}") + endif() + if (CLR_CMAKE_SANITIZER_RUNTIMES) + list(APPEND CLR_CMAKE_LINK_SANITIZE_OPTIONS "-fsanitize=${CLR_CMAKE_SANITIZER_RUNTIMES}") + endif() + if (MSVC) + add_compile_options("$<$:${CLR_CMAKE_BUILD_SANITIZE_OPTIONS}>") + else() + add_compile_options("$<$:${CLR_CMAKE_BUILD_SANITIZE_OPTIONS}>") + add_linker_flag("${CLR_CMAKE_LINK_SANITIZE_OPTIONS}") + endif() +endif() + # CLR_ADDITIONAL_LINKER_FLAGS - used for passing additional arguments to linker # CLR_ADDITIONAL_COMPILER_OPTIONS - used for passing additional arguments to compiler # @@ -200,9 +287,12 @@ elseif(CLR_CMAKE_HOST_SUNOS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector") add_definitions(-D__EXTENSIONS__ -D_XPG4_2 -D_POSIX_PTHREAD_SEMANTICS) -elseif(CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_IOS AND NOT CLR_CMAKE_HOST_TVOS) +elseif(CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_MACCATALYST AND NOT CLR_CMAKE_HOST_IOS AND NOT CLR_CMAKE_HOST_TVOS) add_definitions(-D_XOPEN_SOURCE) add_linker_flag("-Wl,-bind_at_load") +elseif(CLR_CMAKE_HOST_HAIKU) + add_compile_options($<$:-Wa,--noexecstack>) + add_linker_flag("-Wl,--no-undefined") endif() #------------------------------------ @@ -276,7 +366,12 @@ if (CLR_CMAKE_HOST_UNIX) add_definitions(-DHOST_UNIX) if(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) - add_definitions(-DHOST_OSX) + add_definitions(-DHOST_APPLE) + if(CLR_CMAKE_HOST_MACCATALYST) + add_definitions(-DHOST_MACCATALYST) + else() + add_definitions(-DHOST_OSX) + endif() if(CLR_CMAKE_HOST_UNIX_AMD64) message("Detected OSX x86_64") elseif(CLR_CMAKE_HOST_UNIX_ARM64) @@ -284,12 +379,40 @@ if (CLR_CMAKE_HOST_UNIX) else() clr_unknown_arch() endif() + elseif (CLR_CMAKE_HOST_IOS) + add_definitions(-DHOST_APPLE) + add_definitions(-DHOST_IOS) + if(CLR_CMAKE_HOST_UNIX_AMD64) + message("Detected iOS x86_64") + elseif(CLR_CMAKE_HOST_UNIX_ARM64) + message("Detected iOS ARM64") + else() + clr_unknown_arch() + endif() + elseif (CLR_CMAKE_HOST_TVOS) + add_definitions(-DHOST_APPLE) + add_definitions(-DHOST_TVOS) + if(CLR_CMAKE_HOST_UNIX_AMD64) + message("Detected tvOS x86_64") + elseif(CLR_CMAKE_HOST_UNIX_ARM64) + message("Detected tvOS ARM64") + else() + clr_unknown_arch() + endif() elseif(CLR_CMAKE_HOST_FREEBSD) - message("Detected FreeBSD amd64") + if(CLR_CMAKE_HOST_UNIX_ARM64) + message("Detected FreeBSD aarch64") + elseif(CLR_CMAKE_HOST_UNIX_AMD64) + message("Detected FreeBSD amd64") + else() + message(FATAL_ERROR "Unsupported FreeBSD architecture") + endif() elseif(CLR_CMAKE_HOST_NETBSD) message("Detected NetBSD amd64") elseif(CLR_CMAKE_HOST_SUNOS) message("Detected SunOS amd64") + elseif(CLR_CMAKE_HOST_HAIKU) + message("Detected Haiku x86_64") endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) endif(CLR_CMAKE_HOST_UNIX) @@ -382,6 +505,17 @@ if (CLR_CMAKE_HOST_UNIX) # using twos-complement representation (this is normally undefined according to the C++ spec). add_compile_options(-fwrapv) + if(CLR_CMAKE_HOST_APPLE) + # Clang will by default emit objc_msgSend stubs in Xcode 14, which ld from earlier Xcodes doesn't understand. + # We disable this by passing -fno-objc-msgsend-selector-stubs to clang. + # We can probably remove this flag once we require developers to use Xcode 14. + # Ref: https://github.com/xamarin/xamarin-macios/issues/16223 + check_c_compiler_flag(-fno-objc-msgsend-selector-stubs COMPILER_SUPPORTS_FNO_OBJC_MSGSEND_SELECTOR_STUBS) + if(COMPILER_SUPPORTS_FNO_OBJC_MSGSEND_SELECTOR_STUBS) + set(CLR_CMAKE_COMMON_OBJC_FLAGS "${CLR_CMAKE_COMMON_OBJC_FLAGS} -fno-objc-msgsend-selector-stubs") + endif() + endif() + if(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_MACCATALYST) # We cannot enable "stack-protector-strong" on OS X due to a bug in clang compiler (current version 7.0.2) add_compile_options(-fstack-protector) @@ -390,7 +524,7 @@ if (CLR_CMAKE_HOST_UNIX) add_definitions(-DLSE_INSTRUCTIONS_ENABLED_BY_DEFAULT) add_compile_options(-mcpu=apple-m1) endif(CLR_CMAKE_HOST_UNIX_ARM64) - elseif(NOT CLR_CMAKE_HOST_BROWSER) + elseif(NOT CLR_CMAKE_HOST_BROWSER AND NOT CLR_CMAKE_HOST_WASI) check_c_compiler_flag(-fstack-protector-strong COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG) if (COMPILER_SUPPORTS_F_STACK_PROTECTOR_STRONG) add_compile_options(-fstack-protector-strong) @@ -424,6 +558,8 @@ if (CLR_CMAKE_HOST_UNIX) # optimization in the IEEE 754 specification and is therefore considered unsafe. add_compile_options(-ffp-contract=off) + add_compile_options($<$:-fno-rtti>) + if (CMAKE_C_COMPILER_ID MATCHES "Clang") add_compile_options(-Wno-unknown-warning-option) @@ -447,6 +583,14 @@ if (CLR_CMAKE_HOST_UNIX) add_compile_options(-Wno-incompatible-ms-struct) add_compile_options(-Wno-reserved-identifier) + + # clang 16.0 introduced buffer hardening https://discourse.llvm.org/t/rfc-c-buffer-hardening/65734 + # which we are not conforming to yet. + add_compile_options(-Wno-unsafe-buffer-usage) + + # other clang 16.0 suppressions + add_compile_options(-Wno-single-bit-bitfield-constant-conversion) + add_compile_options(-Wno-cast-function-type-strict) else() add_compile_options(-Wno-uninitialized) add_compile_options(-Wno-strict-aliasing) @@ -454,15 +598,14 @@ if (CLR_CMAKE_HOST_UNIX) add_compile_options($<$:-Wno-misleading-indentation>) add_compile_options($<$:-Wno-stringop-overflow>) add_compile_options($<$:-Wno-restrict>) - add_compile_options($<$:-Wno-stringop-truncation>) + add_compile_options($<$:-Wno-stringop-truncation>) + add_compile_options($<$:-Wno-class-memaccess>) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0) # this warning is only reported by g++ 11 in debug mode when building # src/coreclr/vm/stackingallocator.h. It is a false-positive, fixed in g++ 12. # see: https://github.com/dotnet/runtime/pull/69188#issuecomment-1136764770 add_compile_options($<$:-Wno-placement-new>) - - add_compile_options($<$:-Wno-class-memaccess>) endif() if (CMAKE_CXX_COMPILER_ID) @@ -479,7 +622,7 @@ if (CLR_CMAKE_HOST_UNIX) # We mark the function which needs exporting with DLLEXPORT add_compile_options(-fvisibility=hidden) - + # Separate functions so linker can remove them. add_compile_options(-ffunction-sections) @@ -508,6 +651,8 @@ if (CLR_CMAKE_HOST_UNIX) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}") + set(CMAKE_OBJC_FLAGS "${CMAKE_OBJC_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}") + set(CMAKE_OBJCXX_FLAGS "${CMAKE_OBJCXX_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}") elseif(CLR_CMAKE_HOST_OSX) if(CLR_CMAKE_HOST_ARCH_ARM64) set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0") @@ -526,14 +671,26 @@ if(CLR_CMAKE_TARGET_UNIX) add_compile_definitions($<$>>:TARGET_UNIX>) # Contracts are disabled on UNIX. add_definitions(-DDISABLE_CONTRACTS) - if(CLR_CMAKE_TARGET_OSX AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS) + if(CLR_CMAKE_TARGET_APPLE) + add_compile_definitions($<$>>:TARGET_APPLE>) + endif() + if(CLR_CMAKE_TARGET_OSX) add_compile_definitions($<$>>:TARGET_OSX>) + elseif(CLR_CMAKE_TARGET_MACCATALYST) + add_compile_definitions($<$>>:TARGET_MACCATALYST>) + elseif(CLR_CMAKE_TARGET_IOS) + add_compile_definitions($<$>>:TARGET_IOS>) + elseif(CLR_CMAKE_TARGET_TVOS) + add_compile_definitions($<$>>:TARGET_TVOS>) elseif(CLR_CMAKE_TARGET_FREEBSD) add_compile_definitions($<$>>:TARGET_FREEBSD>) elseif(CLR_CMAKE_TARGET_ANDROID) add_compile_definitions($<$>>:TARGET_ANDROID>) elseif(CLR_CMAKE_TARGET_LINUX) add_compile_definitions($<$>>:TARGET_LINUX>) + if(CLR_CMAKE_TARGET_BROWSER) + add_compile_definitions($<$>>:TARGET_BROWSER>) + endif() if(CLR_CMAKE_TARGET_LINUX_MUSL) add_compile_definitions($<$>>:TARGET_LINUX_MUSL>) endif() @@ -544,11 +701,11 @@ if(CLR_CMAKE_TARGET_UNIX) if(CLR_CMAKE_TARGET_OS_ILLUMOS) add_compile_definitions($<$>>:TARGET_ILLUMOS>) endif() + elseif(CLR_CMAKE_TARGET_HAIKU) + add_compile_definitions($<$>>:TARGET_HAIKU>) endif() elseif(CLR_CMAKE_TARGET_WASI) add_compile_definitions($<$>>:TARGET_WASI>) -elseif(CLR_CMAKE_TARGET_BROWSER) - add_compile_definitions($<$>>:TARGET_BROWSER>) else(CLR_CMAKE_TARGET_UNIX) add_compile_definitions($<$>>:TARGET_WINDOWS>) endif(CLR_CMAKE_TARGET_UNIX) @@ -676,7 +833,7 @@ if (MSVC) # Set Warning Level 4: add_compile_options($<$:/w44177>) # Pragma data_seg s/b at global scope. - add_compile_options($<$:/Zi>) # enable debugging information + add_compile_options($<$:/Zi>) # enable debugging information add_compile_options($<$:/ZH:SHA_256>) # use SHA256 for generating hashes of compiler processed source files. add_compile_options($<$:/source-charset:utf-8>) # Force MSVC to compile source as UTF-8. @@ -714,6 +871,15 @@ if (MSVC) # production-time scenarios. set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$,$>,$>>>:Debug>) + if (NOT CLR_CMAKE_ENABLE_SANITIZERS) + # Force uCRT to be dynamically linked for Release build + # We won't do this for sanitized builds as the dynamic CRT is not compatible with the static sanitizer runtime and + # the dynamic sanitizer runtime is not redistributable. Sanitized runtime builds are not production-time scenarios + # so we don't get the benefits of a dynamic CRT for sanitized runtime builds. + add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE) + add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE) + endif() + add_compile_options($<$:/ZH:SHA_256>) if (CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_ARM64) @@ -725,6 +891,15 @@ if (MSVC) add_compile_options($<$:/nologo>) endif (MSVC) +# Configure non-MSVC compiler flags that apply to all platforms (unix-like or otherwise) +if (NOT MSVC) + # Check for sometimes suppressed warnings + check_c_compiler_flag(-Wreserved-identifier COMPILER_SUPPORTS_W_RESERVED_IDENTIFIER) + if(COMPILER_SUPPORTS_W_RESERVED_IDENTIFIER) + add_compile_definitions(COMPILER_SUPPORTS_W_RESERVED_IDENTIFIER) + endif() +endif() + if(CLR_CMAKE_ENABLE_CODE_COVERAGE) if(CLR_CMAKE_HOST_UNIX) @@ -795,7 +970,7 @@ if (CLR_CMAKE_HOST_WIN32) message(FATAL_ERROR "MC not found") endif() -elseif (NOT CLR_CMAKE_HOST_BROWSER) +elseif (NOT CLR_CMAKE_HOST_BROWSER AND NOT CLR_CMAKE_HOST_WASI) # This is a workaround for upstream issue: https://gitlab.kitware.com/cmake/cmake/-/issues/22995. # # In Clang.cmake, the decision to use single or double hyphen for target and gcc-toolchain diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake index c849c5921..2f6ca03db 100644 --- a/eng/native/configureplatform.cmake +++ b/eng/native/configureplatform.cmake @@ -10,7 +10,8 @@ set(PRERELEASE 1) # - for windows we use the passed in parameter to CMAKE to determine build arch #---------------------------------------- set(CLR_CMAKE_HOST_OS ${CMAKE_SYSTEM_NAME}) -if(CLR_CMAKE_HOST_OS STREQUAL Linux) +string(TOLOWER ${CLR_CMAKE_HOST_OS} CLR_CMAKE_HOST_OS) +if(CLR_CMAKE_HOST_OS STREQUAL linux) set(CLR_CMAKE_HOST_UNIX 1) if(CLR_CROSS_COMPONENTS_BUILD) # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host. @@ -74,11 +75,6 @@ if(CLR_CMAKE_HOST_OS STREQUAL Linux) COMMAND bash -c "source ${LINUX_ID_FILE} && echo \$ID" OUTPUT_VARIABLE CLR_CMAKE_LINUX_ID OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND bash -c "if strings \"${CMAKE_SYSROOT}/usr/bin/ldd\" 2>&1 | grep -q musl; then echo musl; fi" - OUTPUT_VARIABLE CLR_CMAKE_LINUX_MUSL - OUTPUT_STRIP_TRAILING_WHITESPACE) endif() if(DEFINED CLR_CMAKE_LINUX_ID) @@ -86,24 +82,21 @@ if(CLR_CMAKE_HOST_OS STREQUAL Linux) set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine) - set(CLR_CMAKE_HOST_ALPINE_LINUX 1) - set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) - endif() - - if(CLR_CMAKE_LINUX_MUSL STREQUAL musl) set(CLR_CMAKE_HOST_LINUX_MUSL 1) + set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID}) endif() endif(DEFINED CLR_CMAKE_LINUX_ID) -endif(CLR_CMAKE_HOST_OS STREQUAL Linux) +endif(CLR_CMAKE_HOST_OS STREQUAL linux) -if(CLR_CMAKE_HOST_OS STREQUAL Darwin) +if(CLR_CMAKE_HOST_OS STREQUAL darwin) set(CLR_CMAKE_HOST_UNIX 1) + set(CLR_CMAKE_HOST_APPLE 1) - if(CMAKE_SYSTEM_VARIANT STREQUAL MacCatalyst) + if(CMAKE_SYSTEM_VARIANT STREQUAL maccatalyst) set(CLR_CMAKE_HOST_MACCATALYST 1) else() set(CLR_CMAKE_HOST_OSX 1) - endif(CMAKE_SYSTEM_VARIANT STREQUAL MacCatalyst) + endif(CMAKE_SYSTEM_VARIANT STREQUAL maccatalyst) if(CMAKE_OSX_ARCHITECTURES STREQUAL x86_64) set(CLR_CMAKE_HOST_UNIX_AMD64 1) @@ -113,10 +106,11 @@ if(CLR_CMAKE_HOST_OS STREQUAL Darwin) clr_unknown_arch() endif() set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} -o -c ") -endif(CLR_CMAKE_HOST_OS STREQUAL Darwin) +endif(CLR_CMAKE_HOST_OS STREQUAL darwin) -if(CLR_CMAKE_HOST_OS STREQUAL iOS OR CLR_CMAKE_HOST_OS STREQUAL iOSSimulator) +if(CLR_CMAKE_HOST_OS STREQUAL ios OR CLR_CMAKE_HOST_OS STREQUAL iossimulator) set(CLR_CMAKE_HOST_UNIX 1) + set(CLR_CMAKE_HOST_APPLE 1) set(CLR_CMAKE_HOST_IOS 1) if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") set(CLR_CMAKE_HOST_UNIX_AMD64 1) @@ -129,10 +123,11 @@ if(CLR_CMAKE_HOST_OS STREQUAL iOS OR CLR_CMAKE_HOST_OS STREQUAL iOSSimulator) else() clr_unknown_arch() endif() -endif(CLR_CMAKE_HOST_OS STREQUAL iOS OR CLR_CMAKE_HOST_OS STREQUAL iOSSimulator) +endif(CLR_CMAKE_HOST_OS STREQUAL ios OR CLR_CMAKE_HOST_OS STREQUAL iossimulator) -if(CLR_CMAKE_HOST_OS STREQUAL tvOS OR CLR_CMAKE_HOST_OS STREQUAL tvOSSimulator) +if(CLR_CMAKE_HOST_OS STREQUAL tvos OR CLR_CMAKE_HOST_OS STREQUAL tvossimulator) set(CLR_CMAKE_HOST_UNIX 1) + set(CLR_CMAKE_HOST_APPLE 1) set(CLR_CMAKE_HOST_TVOS 1) if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") set(CLR_CMAKE_HOST_UNIX_AMD64 1) @@ -141,9 +136,9 @@ if(CLR_CMAKE_HOST_OS STREQUAL tvOS OR CLR_CMAKE_HOST_OS STREQUAL tvOSSimulator) else() clr_unknown_arch() endif() -endif(CLR_CMAKE_HOST_OS STREQUAL tvOS OR CLR_CMAKE_HOST_OS STREQUAL tvOSSimulator) +endif(CLR_CMAKE_HOST_OS STREQUAL tvos OR CLR_CMAKE_HOST_OS STREQUAL tvossimulator) -if(CLR_CMAKE_HOST_OS STREQUAL Android) +if(CLR_CMAKE_HOST_OS STREQUAL android) set(CLR_CMAKE_HOST_UNIX 1) set(CLR_CMAKE_HOST_LINUX 1) set(CLR_CMAKE_HOST_ANDROID 1) @@ -158,27 +153,33 @@ if(CLR_CMAKE_HOST_OS STREQUAL Android) else() clr_unknown_arch() endif() -endif(CLR_CMAKE_HOST_OS STREQUAL Android) +endif(CLR_CMAKE_HOST_OS STREQUAL android) -if(CLR_CMAKE_HOST_OS STREQUAL FreeBSD) +if(CLR_CMAKE_HOST_OS STREQUAL freebsd) set(CLR_CMAKE_HOST_UNIX 1) - set(CLR_CMAKE_HOST_UNIX_AMD64 1) + if (CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64) + set(CLR_CMAKE_HOST_UNIX_AMD64 1) + elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL arm64) + set(CLR_CMAKE_HOST_UNIX_ARM64 1) + else() + clr_unknown_arch() + endif() set(CLR_CMAKE_HOST_FREEBSD 1) -endif(CLR_CMAKE_HOST_OS STREQUAL FreeBSD) +endif(CLR_CMAKE_HOST_OS STREQUAL freebsd) -if(CLR_CMAKE_HOST_OS STREQUAL OpenBSD) +if(CLR_CMAKE_HOST_OS STREQUAL openbsd) set(CLR_CMAKE_HOST_UNIX 1) set(CLR_CMAKE_HOST_UNIX_AMD64 1) set(CLR_CMAKE_HOST_OPENBSD 1) -endif(CLR_CMAKE_HOST_OS STREQUAL OpenBSD) +endif(CLR_CMAKE_HOST_OS STREQUAL openbsd) -if(CLR_CMAKE_HOST_OS STREQUAL NetBSD) +if(CLR_CMAKE_HOST_OS STREQUAL netbsd) set(CLR_CMAKE_HOST_UNIX 1) set(CLR_CMAKE_HOST_UNIX_AMD64 1) set(CLR_CMAKE_HOST_NETBSD 1) -endif(CLR_CMAKE_HOST_OS STREQUAL NetBSD) +endif(CLR_CMAKE_HOST_OS STREQUAL netbsd) -if(CLR_CMAKE_HOST_OS STREQUAL SunOS) +if(CLR_CMAKE_HOST_OS STREQUAL sunos) set(CLR_CMAKE_HOST_UNIX 1) EXECUTE_PROCESS( COMMAND isainfo -n @@ -202,21 +203,26 @@ if(CLR_CMAKE_HOST_OS STREQUAL SunOS) else(SUNOS_KERNEL_KIND STREQUAL illumos OR CMAKE_CROSSCOMPILING) set(CLR_CMAKE_HOST_OS_SOLARIS 1) endif(SUNOS_KERNEL_KIND STREQUAL illumos OR CMAKE_CROSSCOMPILING) -endif(CLR_CMAKE_HOST_OS STREQUAL SunOS) +endif(CLR_CMAKE_HOST_OS STREQUAL sunos) -if(CLR_CMAKE_HOST_OS STREQUAL Windows) - set(CLR_CMAKE_HOST_OS windows) +if(CLR_CMAKE_HOST_OS STREQUAL haiku) + set(CLR_CMAKE_HOST_UNIX 1) + set(CLR_CMAKE_HOST_UNIX_AMD64 1) + set(CLR_CMAKE_HOST_HAIKU 1) +endif(CLR_CMAKE_HOST_OS STREQUAL haiku) + +if(CLR_CMAKE_HOST_OS STREQUAL windows) set(CLR_CMAKE_HOST_WIN32 1) -endif(CLR_CMAKE_HOST_OS STREQUAL Windows) +endif(CLR_CMAKE_HOST_OS STREQUAL windows) -if(CLR_CMAKE_HOST_OS STREQUAL Emscripten) +if(CLR_CMAKE_HOST_OS STREQUAL emscripten) set(CLR_CMAKE_HOST_UNIX 1) set(CLR_CMAKE_HOST_BROWSER 1) -endif(CLR_CMAKE_HOST_OS STREQUAL Emscripten) +endif(CLR_CMAKE_HOST_OS STREQUAL emscripten) -if(CLR_CMAKE_TARGET_OS STREQUAL Wasi) +if(CLR_CMAKE_TARGET_OS STREQUAL wasi) set(CLR_CMAKE_HOST_WASI 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL Wasi) +endif(CLR_CMAKE_TARGET_OS STREQUAL wasi) #-------------------------------------------- # This repo builds two set of binaries @@ -339,14 +345,10 @@ if (NOT DEFINED CLR_CMAKE_TARGET_OS OR CLR_CMAKE_TARGET_OS STREQUAL "" ) set(CLR_CMAKE_TARGET_OS ${CLR_CMAKE_HOST_OS}) endif() -if(CLR_CMAKE_TARGET_OS STREQUAL Linux) +if(CLR_CMAKE_TARGET_OS STREQUAL linux) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL Linux) - -if(CLR_CMAKE_HOST_LINUX_MUSL) - set(CLR_CMAKE_TARGET_LINUX_MUSL 1) -endif(CLR_CMAKE_HOST_LINUX_MUSL) +endif(CLR_CMAKE_TARGET_OS STREQUAL linux) if(CLR_CMAKE_TARGET_OS STREQUAL tizen) set(CLR_CMAKE_TARGET_UNIX 1) @@ -354,54 +356,57 @@ if(CLR_CMAKE_TARGET_OS STREQUAL tizen) set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) endif(CLR_CMAKE_TARGET_OS STREQUAL tizen) -if(CLR_CMAKE_TARGET_OS STREQUAL alpine) +if(CLR_CMAKE_HOST_LINUX_MUSL OR CLR_CMAKE_TARGET_OS STREQUAL alpine) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) - set(CLR_CMAKE_TARGET_ALPINE_LINUX 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL alpine) + set(CLR_CMAKE_TARGET_LINUX_MUSL 1) +endif(CLR_CMAKE_HOST_LINUX_MUSL OR CLR_CMAKE_TARGET_OS STREQUAL alpine) -if(CLR_CMAKE_TARGET_OS STREQUAL Android) +if(CLR_CMAKE_TARGET_OS STREQUAL android) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) set(CLR_CMAKE_TARGET_ANDROID 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL Android) +endif(CLR_CMAKE_TARGET_OS STREQUAL android) -if(CLR_CMAKE_TARGET_OS STREQUAL Darwin) +if(CLR_CMAKE_TARGET_OS STREQUAL darwin) set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_APPLE 1) - if(CMAKE_SYSTEM_VARIANT STREQUAL MacCatalyst) + if(CMAKE_SYSTEM_VARIANT STREQUAL maccatalyst) set(CLR_CMAKE_TARGET_MACCATALYST 1) else() set(CLR_CMAKE_TARGET_OSX 1) - endif(CMAKE_SYSTEM_VARIANT STREQUAL MacCatalyst) -endif(CLR_CMAKE_TARGET_OS STREQUAL Darwin) + endif(CMAKE_SYSTEM_VARIANT STREQUAL maccatalyst) +endif(CLR_CMAKE_TARGET_OS STREQUAL darwin) -if(CLR_CMAKE_TARGET_OS STREQUAL iOS OR CLR_CMAKE_TARGET_OS STREQUAL iOSSimulator) +if(CLR_CMAKE_TARGET_OS STREQUAL ios OR CLR_CMAKE_TARGET_OS STREQUAL iossimulator) set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_APPLE 1) set(CLR_CMAKE_TARGET_IOS 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL iOS OR CLR_CMAKE_TARGET_OS STREQUAL iOSSimulator) +endif(CLR_CMAKE_TARGET_OS STREQUAL ios OR CLR_CMAKE_TARGET_OS STREQUAL iossimulator) -if(CLR_CMAKE_TARGET_OS STREQUAL tvOS OR CLR_CMAKE_TARGET_OS STREQUAL tvOSSimulator) +if(CLR_CMAKE_TARGET_OS STREQUAL tvos OR CLR_CMAKE_TARGET_OS STREQUAL tvossimulator) set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_APPLE 1) set(CLR_CMAKE_TARGET_TVOS 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL tvOS OR CLR_CMAKE_TARGET_OS STREQUAL tvOSSimulator) +endif(CLR_CMAKE_TARGET_OS STREQUAL tvos OR CLR_CMAKE_TARGET_OS STREQUAL tvossimulator) -if(CLR_CMAKE_TARGET_OS STREQUAL FreeBSD) +if(CLR_CMAKE_TARGET_OS STREQUAL freebsd) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_FREEBSD 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL FreeBSD) +endif(CLR_CMAKE_TARGET_OS STREQUAL freebsd) -if(CLR_CMAKE_TARGET_OS STREQUAL OpenBSD) +if(CLR_CMAKE_TARGET_OS STREQUAL openbsd) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_OPENBSD 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL OpenBSD) +endif(CLR_CMAKE_TARGET_OS STREQUAL openbsd) -if(CLR_CMAKE_TARGET_OS STREQUAL NetBSD) +if(CLR_CMAKE_TARGET_OS STREQUAL netbsd) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_NETBSD 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL NetBSD) +endif(CLR_CMAKE_TARGET_OS STREQUAL netbsd) -if(CLR_CMAKE_TARGET_OS STREQUAL SunOS) +if(CLR_CMAKE_TARGET_OS STREQUAL sunos) set(CLR_CMAKE_TARGET_UNIX 1) if(CLR_CMAKE_HOST_OS_ILLUMOS) set(CLR_CMAKE_TARGET_OS_ILLUMOS 1) @@ -409,17 +414,22 @@ if(CLR_CMAKE_TARGET_OS STREQUAL SunOS) set(CLR_CMAKE_TARGET_OS_SOLARIS 1) endif(CLR_CMAKE_HOST_OS_ILLUMOS) set(CLR_CMAKE_TARGET_SUNOS 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL SunOS) +endif(CLR_CMAKE_TARGET_OS STREQUAL sunos) -if(CLR_CMAKE_TARGET_OS STREQUAL Emscripten) +if(CLR_CMAKE_TARGET_OS STREQUAL haiku) + set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_HAIKU 1) +endif(CLR_CMAKE_TARGET_OS STREQUAL haiku) + +if(CLR_CMAKE_TARGET_OS STREQUAL emscripten) set(CLR_CMAKE_TARGET_UNIX 1) set(CLR_CMAKE_TARGET_LINUX 1) set(CLR_CMAKE_TARGET_BROWSER 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL Emscripten) +endif(CLR_CMAKE_TARGET_OS STREQUAL emscripten) -if(CLR_CMAKE_TARGET_OS STREQUAL Wasi) +if(CLR_CMAKE_TARGET_OS STREQUAL wasi) set(CLR_CMAKE_TARGET_WASI 1) -endif(CLR_CMAKE_TARGET_OS STREQUAL Wasi) +endif(CLR_CMAKE_TARGET_OS STREQUAL wasi) if(CLR_CMAKE_TARGET_UNIX) if(CLR_CMAKE_TARGET_ARCH STREQUAL x64) @@ -449,16 +459,18 @@ if(CLR_CMAKE_TARGET_UNIX) else() clr_unknown_arch() endif() -else() - set(CLR_CMAKE_TARGET_WIN32 1) endif(CLR_CMAKE_TARGET_UNIX) +if(CLR_CMAKE_TARGET_OS STREQUAL windows) + set(CLR_CMAKE_TARGET_WIN32 1) +endif() + # check if host & target os/arch combination are valid -if (NOT (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS)) +if (NOT (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS) AND NOT CLR_CMAKE_TARGET_WASI) if(NOT (CLR_CMAKE_HOST_OS STREQUAL windows)) message(FATAL_ERROR "Invalid host and target os/arch combination. Host OS: ${CLR_CMAKE_HOST_OS}") endif() - if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_ALPINE_LINUX)) + if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_LINUX_MUSL)) message(FATAL_ERROR "Invalid host and target os/arch combination. Target OS: ${CLR_CMAKE_TARGET_OS}") endif() if(NOT ((CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)) OR (CLR_CMAKE_HOST_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM))) @@ -466,9 +478,9 @@ if (NOT (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS)) endif() endif() -if(NOT CLR_CMAKE_TARGET_BROWSER) +if(NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) # The default linker on Solaris also does not support PIE. - if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS AND NOT CLR_CMAKE_TARGET_OSX AND NOT CLR_CMAKE_TARGET_MACCATALYST AND NOT CLR_CMAKE_HOST_TVOS AND NOT CLR_CMAKE_HOST_IOS AND NOT MSVC) + if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS AND NOT CLR_CMAKE_TARGET_APPLE AND NOT MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") add_compile_options($<$,EXECUTABLE>:-fPIE>) add_compile_options($<$,SHARED_LIBRARY>:-fPIC>) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 07a3bbfaf..6b23f2bb1 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -6,7 +6,7 @@ if (CMAKE_C_COMPILER MATCHES "-?[0-9]+(\.[0-9]+)?$") set(CLR_CMAKE_COMPILER_FILE_NAME_VERSION "${CMAKE_MATCH_0}") endif() -if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER) +if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(APPLE) set(TOOLSET_PREFIX "") @@ -46,13 +46,15 @@ if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER) locate_toolchain_exec(ar CMAKE_AR YES) locate_toolchain_exec(nm CMAKE_NM YES) locate_toolchain_exec(ranlib CMAKE_RANLIB YES) + locate_toolchain_exec(strings CMAKE_STRINGS YES) if(CMAKE_C_COMPILER_ID MATCHES "Clang") locate_toolchain_exec(link CMAKE_LINKER YES) endif() - if(NOT CLR_CMAKE_TARGET_OSX AND NOT CLR_CMAKE_TARGET_MACCATALYST AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS AND (NOT CLR_CMAKE_TARGET_ANDROID OR CROSS_ROOTFS)) + if(NOT CLR_CMAKE_TARGET_APPLE AND (NOT CLR_CMAKE_TARGET_ANDROID OR CROSS_ROOTFS)) locate_toolchain_exec(objdump CMAKE_OBJDUMP YES) + locate_toolchain_exec(readelf CMAKE_READELF YES) unset(CMAKE_OBJCOPY CACHE) locate_toolchain_exec(objcopy CMAKE_OBJCOPY NO) @@ -90,3 +92,18 @@ if (NOT CLR_CMAKE_HOST_WIN32) set(LD_OSX 1) endif() endif() + +# This introspection depends on CMAKE_STRINGS, which is why it's in this file instead of configureplatform +if (CLR_CMAKE_HOST_LINUX) + execute_process( + COMMAND bash -c "if ${CMAKE_STRINGS} \"${CMAKE_SYSROOT}/usr/bin/ldd\" 2>&1 | grep -q musl; then echo musl; fi" + OUTPUT_VARIABLE CLR_CMAKE_LINUX_MUSL + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(CLR_CMAKE_LINUX_MUSL STREQUAL musl) + set(CLR_CMAKE_HOST_LINUX_MUSL 1) + set(CLR_CMAKE_TARGET_UNIX 1) + set(CLR_CMAKE_TARGET_LINUX 1) + set(CLR_CMAKE_TARGET_LINUX_MUSL 1) + endif() +endif() diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake index efb36de6e..d5ef9ed62 100644 --- a/eng/native/functions.cmake +++ b/eng/native/functions.cmake @@ -89,9 +89,11 @@ function(get_compile_definitions DefinitionName) set(LastGeneratorExpression "") foreach(DEFINITION IN LISTS COMPILE_DEFINITIONS_LIST) # If there is a definition that uses the $ generator expression + # or the $ generator expression, # we need to remove it since that generator expression is only valid on binary targets. # Assume that the value is 0. string(REGEX REPLACE "\\$]+>" "0" DEFINITION "${DEFINITION}") + string(REGEX REPLACE "\\$]+(,[^>]+)*>" "0" DEFINITION "${DEFINITION}") if (${DEFINITION} MATCHES "^\\$<(.+):([^>]+)(>?)$") if("${CMAKE_MATCH_3}" STREQUAL "") @@ -327,7 +329,7 @@ function(generate_exports_file) list(GET INPUT_LIST -1 outputFilename) list(REMOVE_AT INPUT_LIST -1) - if(CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) + if(CLR_CMAKE_TARGET_APPLE) set(SCRIPT_NAME generateexportedsymbols.sh) else() set(SCRIPT_NAME generateversionscript.sh) @@ -366,18 +368,18 @@ endfunction() function (get_symbol_file_name targetName outputSymbolFilename) if (CLR_CMAKE_HOST_UNIX) - if (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) + if (CLR_CMAKE_TARGET_APPLE) set(strip_destination_file $.dwarf) else () set(strip_destination_file $.dbg) endif () set(${outputSymbolFilename} ${strip_destination_file} PARENT_SCOPE) - else(CLR_CMAKE_HOST_UNIX) + elseif(CLR_CMAKE_HOST_WIN32) # We can't use the $ generator expression here since # the generator expression isn't supported on resource DLLs. set(${outputSymbolFilename} $/$$.pdb PARENT_SCOPE) - endif(CLR_CMAKE_HOST_UNIX) + endif() endfunction() function(strip_symbols targetName outputFilename) @@ -386,7 +388,7 @@ function(strip_symbols targetName outputFilename) if (CLR_CMAKE_HOST_UNIX) set(strip_source_file $) - if (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) + if (CLR_CMAKE_TARGET_APPLE) # Ensure that dsymutil and strip are present find_program(DSYMUTIL dsymutil) @@ -401,10 +403,12 @@ function(strip_symbols targetName outputFilename) set(strip_command ${STRIP} -no_code_signature_warning -S ${strip_source_file}) - # codesign release build - string(TOLOWER "${CMAKE_BUILD_TYPE}" LOWERCASE_CMAKE_BUILD_TYPE) - if (LOWERCASE_CMAKE_BUILD_TYPE STREQUAL release) - set(strip_command ${strip_command} && codesign -f -s - ${strip_source_file}) + if (CLR_CMAKE_TARGET_OSX) + # codesign release build + string(TOLOWER "${CMAKE_BUILD_TYPE}" LOWERCASE_CMAKE_BUILD_TYPE) + if (LOWERCASE_CMAKE_BUILD_TYPE STREQUAL release) + set(strip_command ${strip_command} && codesign -f -s - ${strip_source_file}) + endif () endif () execute_process( @@ -421,44 +425,51 @@ function(strip_symbols targetName outputFilename) TARGET ${targetName} POST_BUILD VERBATIM + COMMAND sh -c "echo Stripping symbols from $(basename '${strip_source_file}') into $(basename '${strip_destination_file}')" COMMAND ${DSYMUTIL} ${DSYMUTIL_OPTS} ${strip_source_file} COMMAND ${strip_command} - COMMENT "Stripping symbols from ${strip_source_file} into file ${strip_destination_file}" ) - else (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) + else (CLR_CMAKE_TARGET_APPLE) add_custom_command( TARGET ${targetName} POST_BUILD VERBATIM + COMMAND sh -c "echo Stripping symbols from $(basename '${strip_source_file}') into $(basename '${strip_destination_file}')" COMMAND ${CMAKE_OBJCOPY} --only-keep-debug ${strip_source_file} ${strip_destination_file} COMMAND ${CMAKE_OBJCOPY} --strip-debug --strip-unneeded ${strip_source_file} COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=${strip_destination_file} ${strip_source_file} - COMMENT "Stripping symbols from ${strip_source_file} into file ${strip_destination_file}" ) - endif (CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) + endif (CLR_CMAKE_TARGET_APPLE) endif(CLR_CMAKE_HOST_UNIX) endfunction() function(install_with_stripped_symbols targetName kind destination) + get_property(target_is_framework TARGET ${targetName} PROPERTY "FRAMEWORK") if(NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS) strip_symbols(${targetName} symbol_file) - install_symbol_file(${symbol_file} ${destination} ${ARGN}) - endif() - - if ((CLR_CMAKE_TARGET_OSX OR CLR_CMAKE_TARGET_MACCATALYST OR CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) AND ("${kind}" STREQUAL "TARGETS")) - # We want to avoid the kind=TARGET install behaviors which corrupt code signatures on osx-arm64 - set(kind PROGRAMS) + if (NOT "${symbol_file}" STREQUAL "" AND NOT target_is_framework) + install_symbol_file(${symbol_file} ${destination} ${ARGN}) + endif() endif() - if ("${kind}" STREQUAL "TARGETS") - set(install_source ${targetName}) - elseif("${kind}" STREQUAL "PROGRAMS") - set(install_source $) + if (target_is_framework) + install(TARGETS ${targetName} FRAMEWORK DESTINATION ${destination} ${ARGN}) else() - message(FATAL_ERROR "The `kind` argument has to be either TARGETS or PROGRAMS, ${kind} was provided instead") + if (CLR_CMAKE_TARGET_APPLE AND ("${kind}" STREQUAL "TARGETS")) + # We want to avoid the kind=TARGET install behaviors which corrupt code signatures on osx-arm64 + set(kind PROGRAMS) + endif() + + if ("${kind}" STREQUAL "TARGETS") + set(install_source ${targetName}) + elseif("${kind}" STREQUAL "PROGRAMS") + set(install_source $) + else() + message(FATAL_ERROR "The `kind` argument has to be either TARGETS or PROGRAMS, ${kind} was provided instead") + endif() + install(${kind} ${install_source} DESTINATION ${destination} ${ARGN}) endif() - install(${kind} ${install_source} DESTINATION ${destination} ${ARGN}) endfunction() function(install_symbol_file symbol_file destination_path) @@ -615,7 +626,6 @@ function(link_natvis_sources_for_target targetName linkKind) endif() get_filename_component(extension "${source}" EXT) if ("${extension}" STREQUAL ".natvis") - message("Embedding natvis ${source}") # Since natvis embedding is only supported on Windows # we can use target_link_options since our minimum version is high enough target_link_options(${targetName} "${linkKind}" "-NATVIS:${source}") @@ -623,25 +633,34 @@ function(link_natvis_sources_for_target targetName linkKind) endforeach() endfunction() +# Add sanitizer runtime support code to the target. +function(add_sanitizer_runtime_support targetName) + # Add sanitizer support functions. + if (CLR_CMAKE_ENABLE_ASAN) + target_sources(${targetName} PRIVATE "$<$,EXECUTABLE>:${CLR_SRC_NATIVE_DIR}/minipal/asansupport.cpp>") + endif() +endfunction() + function(add_executable_clr targetName) - if(NOT WIN32) - add_executable(${ARGV} ${VERSION_FILE_PATH}) - disable_pax_mprotect(${ARGV}) - else() - add_executable(${ARGV}) - endif(NOT WIN32) - if(NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS) - strip_symbols(${ARGV0} symbolFile) - endif() + if(NOT WIN32) + add_executable(${ARGV} ${VERSION_FILE_PATH}) + disable_pax_mprotect(${ARGV}) + else() + add_executable(${ARGV}) + endif(NOT WIN32) + add_sanitizer_runtime_support(${targetName}) + if(NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS) + strip_symbols(${ARGV0} symbolFile) + endif() endfunction() function(add_library_clr targetName kind) - if(NOT WIN32 AND "${kind}" STREQUAL "SHARED") - add_library(${ARGV} ${VERSION_FILE_PATH}) - else() - add_library(${ARGV}) - endif() - if("${kind}" STREQUAL "SHARED" AND NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS) - strip_symbols(${ARGV0} symbolFile) - endif() + if(NOT WIN32 AND "${kind}" STREQUAL "SHARED") + add_library(${ARGV} ${VERSION_FILE_PATH}) + else() + add_library(${ARGV}) + endif() + if("${kind}" STREQUAL "SHARED" AND NOT CLR_CMAKE_KEEP_NATIVE_SYMBOLS) + strip_symbols(${ARGV0} symbolFile) + endif() endfunction() diff --git a/eng/native/gen-buildsys.cmd b/eng/native/gen-buildsys.cmd index b97b8125e..78bf2b4e9 100644 --- a/eng/native/gen-buildsys.cmd +++ b/eng/native/gen-buildsys.cmd @@ -11,12 +11,9 @@ if %argC% lss 4 GOTO :USAGE if %1=="/?" GOTO :USAGE setlocal enabledelayedexpansion -set basePath=%~dp0 -set __repoRoot=%~dp0..\..\ -:: remove quotes -set "basePath=%basePath:"=%" -:: remove trailing slash -if %basePath:~-1%==\ set "basePath=%basePath:~0,-1%" +set "__repoRoot=%~dp0..\.." +:: normalize +for %%i in ("%__repoRoot%") do set "__repoRoot=%%~fi" set __SourceDir=%1 set __IntermediatesDir=%2 @@ -46,23 +43,36 @@ if /i "%__Arch%" == "wasm" ( echo Error: Please add target OS parameter exit /B 1 ) - if /i "%__Os%" == "Browser" ( + if /i "%__Os%" == "browser" ( if "%EMSDK_PATH%" == "" ( - if not exist "%__repoRoot%src\mono\wasm\emsdk" ( + if not exist "%__repoRoot%\src\mono\wasm\emsdk" ( echo Error: Should set EMSDK_PATH environment variable pointing to emsdk root. exit /B 1 ) - set EMSDK_PATH=%__repoRoot%src\mono\wasm\emsdk - set EMSDK_PATH=!EMSDK_PATH:\=/! + set "EMSDK_PATH=%__repoRoot%\src\mono\wasm\emsdk" ) + :: replace backslash with forward slash and append last slash + set "EMSDK_PATH=!EMSDK_PATH:\=/!" + if not "!EMSDK_PATH:~-1!" == "/" set "EMSDK_PATH=!EMSDK_PATH!/" set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_TOOLCHAIN_FILE=!EMSDK_PATH!/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" set __UseEmcmake=1 ) if /i "%__Os%" == "wasi" ( - echo Error: WASI build not implemented on Windows yet - exit /B 1 + if "%WASI_SDK_PATH%" == "" ( + if not exist "%__repoRoot%\src\mono\wasi\wasi-sdk" ( + echo Error: Should set WASI_SDK_PATH environment variable pointing to emsdk root. + exit /B 1 + ) + + set "WASI_SDK_PATH=%__repoRoot%\src\mono\wasi\wasi-sdk" + ) + :: replace backslash with forward slash and append last slash + set "WASI_SDK_PATH=!WASI_SDK_PATH:\=/!" + if not "!WASI_SDK_PATH:~-1!" == "/" set "WASI_SDK_PATH=!WASI_SDK_PATH!/" + set __CmakeGenerator=Ninja + set __ExtraCmakeParams=%__ExtraCmakeParams% -DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm "-DWASI_SDK_PREFIX=!WASI_SDK_PATH!" "-DCMAKE_TOOLCHAIN_FILE=!WASI_SDK_PATH!/share/cmake/wasi-sdk.cmake" "-DCMAKE_SYSROOT=!WASI_SDK_PATH!/share/wasi-sysroot" ) ) else ( set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_SYSTEM_VERSION=10.0" diff --git a/eng/native/gen-buildsys.sh b/eng/native/gen-buildsys.sh index 72f90cdf1..b39448626 100755 --- a/eng/native/gen-buildsys.sh +++ b/eng/native/gen-buildsys.sh @@ -61,9 +61,9 @@ done cmake_extra_defines= if [[ "$CROSSCOMPILE" == "1" ]]; then - platform="$(uname)" + platform="$(uname -s | tr '[:upper:]' '[:lower:]')" # OSX doesn't use rootfs - if ! [[ -n "$ROOTFS_DIR" || "$platform" == "Darwin" ]]; then + if ! [[ -n "$ROOTFS_DIR" || "$platform" == "darwin" ]]; then echo "ROOTFS_DIR not set for crosscompile" exit 1 fi @@ -73,7 +73,7 @@ if [[ "$CROSSCOMPILE" == "1" ]]; then cmake_extra_defines="$cmake_extra_defines -C $scriptroot/tryrun.cmake" - if [[ "$platform" == "Darwin" ]]; then + if [[ "$platform" == "darwin" ]]; then cmake_extra_defines="$cmake_extra_defines -DCMAKE_SYSTEM_NAME=Darwin" else cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$scriptroot/../common/cross/toolchain.cmake" @@ -94,7 +94,7 @@ if [[ "$scan_build" == "ON" && -n "$SCAN_BUILD_COMMAND" ]]; then fi if [[ "$host_arch" == "wasm" ]]; then - if [[ "$target_os" == "Browser" ]]; then + if [[ "$target_os" == "browser" ]]; then cmake_command="emcmake $cmake_command" elif [[ "$target_os" == "wasi" ]]; then true diff --git a/eng/native/genmoduleindex.sh b/eng/native/genmoduleindex.sh index 399a972d7..d2cb9bc6a 100755 --- a/eng/native/genmoduleindex.sh +++ b/eng/native/genmoduleindex.sh @@ -5,7 +5,7 @@ set -euo pipefail if [[ "$#" -lt 2 ]]; then - echo "Usage: genmoduleindex.sh ModuleBinaryFile IndexHeaderFile" + echo "Usage: genmoduleindex.sh ModuleBinaryFile IndexHeaderFile readelfBinaryPath" exit 1 fi @@ -25,16 +25,18 @@ function printIdAsBinary() { case "$(uname -s)" in Darwin) - cmd="dwarfdump -u $1" + cmd="dwarfdump" + arg="-u" pattern='^UUID: ([0-9A-Fa-f\-]+)';; *) - cmd="readelf -n $1" + cmd="$3" + arg="-n" pattern='^[[:space:]]*Build ID: ([0-9A-Fa-f\-]+)';; esac -while read -r line; do +"$cmd" "$arg" "$1" | while read -r line; do if [[ "$line" =~ $pattern ]]; then printIdAsBinary "${BASH_REMATCH[1]//-/}" break fi -done < <(eval "$cmd") > "$2" +done > "$2" diff --git a/eng/native/ijw/IJW.cmake b/eng/native/ijw/IJW.cmake index 9a38a18dc..9ef90525d 100644 --- a/eng/native/ijw/IJW.cmake +++ b/eng/native/ijw/IJW.cmake @@ -1,8 +1,7 @@ if (CLR_CMAKE_HOST_WIN32) function(remove_ijw_incompatible_options options updatedOptions) - - # IJW isn't compatible with Ehsc, which CMake enables by default, + # IJW isn't compatible with Ehsc, which CMake enables by default if(options MATCHES "/EHsc") string(REPLACE "/EHsc" "" options "${options}") endif() @@ -22,6 +21,12 @@ if (CLR_CMAKE_HOST_WIN32) string(REPLACE "/GR-" "" options "${options}") endif() + # Disable native sanitizers for IJW since we don't want to have to locate + # and copy the sanitizer runtimes and IJW must be built with a dynamic CRT. + if (options MATCHES "-fsanitize=") + string(REGEX REPLACE "-fsanitize=[a-zA-z,]+" "" options "${options}") + endif() + SET(${updatedOptions} "${options}" PARENT_SCOPE) endfunction() @@ -31,6 +36,19 @@ if (CLR_CMAKE_HOST_WIN32) set_target_properties(${targetName} PROPERTIES COMPILE_OPTIONS "${compileOptions}") endfunction() + function(add_ijw_msbuild_project_properties targetName ijwhost_target) + # When we're building with MSBuild, we need to set some project properties + # in case CMake has decided to use the SDK support. + # We're dogfooding things, so we need to set settings in ways that the product doesn't quite support. + # We don't actually need an installed/available target framework version here + # since we are disabling implicit framework references. We just need a valid value, and net8.0 is valid. + set_target_properties(${targetName} PROPERTIES + DOTNET_TARGET_FRAMEWORK net8.0 + VS_GLOBAL_DisableImplicitFrameworkReferences true + VS_GLOBAL_GenerateRuntimeConfigurationFiles false + VS_PROJECT_IMPORT "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/SetIJWProperties.props") + endfunction() + # 4365 - signed/unsigned mismatch # 4679 - Could not import member. This is an issue with IJW and static abstract methods in interfaces. add_compile_options(/wd4365 /wd4679) @@ -48,6 +66,10 @@ if (CLR_CMAKE_HOST_WIN32) remove_ijw_incompatible_options("${CMAKE_CXX_FLAGS}" CMAKE_CXX_FLAGS) + get_directory_property(dirCompileOptions COMPILE_OPTIONS) + remove_ijw_incompatible_options("${dirCompileOptions}" dirCompileOptions) + set_directory_properties(PROPERTIES COMPILE_OPTIONS "${dirCompileOptions}") + set(CLR_SDK_REF_PACK_OUTPUT "") set(CLR_SDK_REF_PACK_DISCOVERY_ERROR "") set(CLR_SDK_REF_PACK_DISCOVERY_RESULT 0) diff --git a/eng/native/ijw/SetIJWProperties.props b/eng/native/ijw/SetIJWProperties.props new file mode 100644 index 000000000..d18ba7ff0 --- /dev/null +++ b/eng/native/ijw/SetIJWProperties.props @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/eng/native/ijw/getRefPackFolderFromArtifacts.ps1 b/eng/native/ijw/getRefPackFolderFromArtifacts.ps1 index f9b53286c..a4eadb815 100644 --- a/eng/native/ijw/getRefPackFolderFromArtifacts.ps1 +++ b/eng/native/ijw/getRefPackFolderFromArtifacts.ps1 @@ -14,7 +14,7 @@ $refPackPath = "$repoRoot/artifacts/bin/ref/net$majorVersion.$minorVersion" if (-not (Test-Path $refPackPath)) { - Write-Error "Reference assemblies not found in the artifacts folder at '$refPackPath'. Did you invoke 'build.cmd libs.sfx+libs.oob /p:RefOnly=true' to make sure that refs are built? Did the repo layout change?" + Write-Error "Reference assemblies not found in the artifacts folder at '$refPackPath'. Did you invoke 'build.cmd libs' to make sure that refs are built? Did the repo layout change?" exit 1 } diff --git a/eng/native/init-distro-rid.sh b/eng/native/init-distro-rid.sh deleted file mode 100644 index 309f6970a..000000000 --- a/eng/native/init-distro-rid.sh +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env bash - -# initNonPortableDistroRid -# -# Input: -# targetOs: (str) -# buildArch: (str) -# isPortable: (int) -# rootfsDir: (str) -# -# Return: -# None -# -# Notes: -# -# initNonPortableDistroRid will attempt to initialize a non portable rid. These -# rids are specific to distros need to build the product/package and consume -# them on the same platform. -# -# If -portablebuild=false is passed a non-portable rid will be created for any -# distro. -# -# It is important to note that the function does not return anything, but it -# exports __DistroRid, if there is a non-portable distro rid to be used. -# -initNonPortableDistroRid() -{ - # Make sure out parameter is cleared. - __DistroRid= - - local targetOs="$1" - local buildArch="$2" - local isPortable="$3" - local rootfsDir="$4" - local nonPortableBuildID="" - - if [ "$targetOs" = "Linux" ]; then - if [ -e "${rootfsDir}/etc/os-release" ]; then - source "${rootfsDir}/etc/os-release" - - # We have forced __PortableBuild=0. This is because -portablebuld - # has been passed as false. - if (( isPortable == 0 )); then - if [[ "${ID}" == "rhel" || "${ID}" == "rocky" || "${ID}" == "alpine" ]]; then - # remove the last version digit - VERSION_ID="${VERSION_ID%.*}" - fi - - if [ -z "${VERSION_ID+x}" ]; then - # Rolling release distros do not set VERSION_ID, so omit - # it here to be consistent with everything else. - nonPortableBuildID="${ID}-${buildArch}" - else - nonPortableBuildID="${ID}.${VERSION_ID}-${buildArch}" - fi - fi - - elif [ -e "${rootfsDir}/android_platform" ]; then - source "$rootfsDir"/android_platform - nonPortableBuildID="$RID" - fi - fi - - if [ "$targetOs" = "FreeBSD" ]; then - if (( isPortable == 0 )); then - # $rootfsDir can be empty. freebsd-version is shell script and it should always work. - __freebsd_major_version=$($rootfsDir/bin/freebsd-version | { read v; echo "${v%%.*}"; }) - nonPortableBuildID="freebsd.$__freebsd_major_version-${buildArch}" - fi - elif command -v getprop && getprop ro.product.system.model 2>&1 | grep -qi android; then - __android_sdk_version=$(getprop ro.build.version.sdk) - nonPortableBuildID="android.$__android_sdk_version-${buildArch}" - elif [ "$targetOs" = "illumos" ]; then - __uname_version=$(uname -v) - case "$__uname_version" in - omnios-*) - __omnios_major_version=$(echo "${__uname_version:8:2}") - nonPortableBuildID=omnios."$__omnios_major_version"-"$buildArch" - ;; - joyent_*) - __smartos_major_version=$(echo "${__uname_version:7:4}") - nonPortableBuildID=smartos."$__smartos_major_version"-"$buildArch" - ;; - illumos_*) - nonPortableBuildID=openindiana-"$buildArch" - ;; - esac - elif [ "$targetOs" = "Solaris" ]; then - __uname_version=$(uname -v) - __solaris_major_version=$(echo "${__uname_version%.*}") - nonPortableBuildID=solaris."$__solaris_major_version"-"$buildArch" - fi - - if [ -n "${nonPortableBuildID}" ]; then - __DistroRid="${nonPortableBuildID}" - - # We are using a non-portable build rid. Force __PortableBuild to false. - __PortableBuild=0 - - export __DistroRid __PortableBuild - fi -} - -# initDistroRidGlobal -# -# Input: -# os: (str) -# arch: (str) -# isPortable: (int) -# rootfsDir?: (nullable:string) -# -# Return: -# None -# -# Notes: -# -# It is important to note that the function does not return anything, but it -# exports the following variables on success: -# -# __DistroRid -# __PortableBuild -# -initDistroRidGlobal() -{ - # __DistroRid must be set at the end of the function. - # Previously we would create a variable __HostDistroRid and/or __DistroRid. - # - # __HostDistroRid was used in the case of a non-portable build, it has been - # deprecated. Now only __DistroRid is supported. It will be used for both - # portable and non-portable rids and will be used in build-packages.sh - - local targetOs="$1" - local buildArch="$2" - local isPortable="$3" - local rootfsDir="" - if [ "$#" -ge 4 ]; then - rootfsDir="$4" - fi - - if [ -n "${rootfsDir}" ]; then - # We may have a cross build. Check for the existence of the rootfsDir - if [ ! -e "${rootfsDir}" ]; then - echo "Error rootfsDir has been passed, but the location is not valid." - exit 1 - fi - fi - - initNonPortableDistroRid "${targetOs}" "${buildArch}" "${isPortable}" "${rootfsDir}" - - if [ "$buildArch" = "wasm" ]; then - if [ "$targetOs" = "Browser" ]; then - __DistroRid=browser-wasm - export __DistroRid - elif [ "$targetOs" = "wasi" ]; then - __DistroRid=wasi-wasm - export __DistroRid - fi - fi - - if [ -z "${__DistroRid}" ]; then - # The non-portable build rid was not set. Set the portable rid. - - __PortableBuild=1 - export __PortableBuild - local distroRid="" - - # Check for musl-based distros (e.g Alpine Linux, Void Linux). - if "${rootfsDir}/usr/bin/ldd" --version 2>&1 | grep -q musl || - strings "${rootfsDir}/usr/bin/ldd" 2>&1 | grep -q musl; then - distroRid="linux-musl-${buildArch}" - fi - - if [ -z "${distroRid}" ]; then - if [ "$targetOs" = "Linux" ]; then - distroRid="linux-$buildArch" - elif [ "$targetOs" = "linux-bionic" ]; then - distroRid="linux-bionic-$buildArch" - elif [ "$targetOs" = "OSX" ]; then - distroRid="osx-$buildArch" - elif [ "$targetOs" = "MacCatalyst" ]; then - distroRid="maccatalyst-$buildArch" - elif [ "$targetOs" = "tvOS" ]; then - distroRid="tvos-$buildArch" - elif [ "$targetOs" = "tvOSSimulator" ]; then - distroRid="tvossimulator-$buildArch" - elif [ "$targetOs" = "iOS" ]; then - distroRid="ios-$buildArch" - elif [ "$targetOs" = "iOSSimulator" ]; then - distroRid="iossimulator-$buildArch" - elif [ "$targetOs" = "Android" ]; then - distroRid="android-$buildArch" - elif [ "$targetOs" = "Browser" ]; then - distroRid="browser-$buildArch" - elif [ "$targetOs" = "wasi" ]; then - distroRid="wasi-$buildArch" - elif [ "$targetOs" = "FreeBSD" ]; then - distroRid="freebsd-$buildArch" - elif [ "$targetOs" = "illumos" ]; then - distroRid="illumos-$buildArch" - elif [ "$targetOs" = "Solaris" ]; then - distroRid="solaris-$buildArch" - fi - fi - - __DistroRid="${distroRid}" - export __DistroRid - fi - - if [ -z "$__DistroRid" ]; then - echo "DistroRid is not set. This is almost certainly an error" - exit 1 - fi - - echo "__DistroRid: ${__DistroRid}" -} diff --git a/eng/native/init-os-and-arch.sh b/eng/native/init-os-and-arch.sh index 9f8b78984..e693617a6 100644 --- a/eng/native/init-os-and-arch.sh +++ b/eng/native/init-os-and-arch.sh @@ -1,17 +1,17 @@ #!/usr/bin/env bash # Use uname to determine what the OS is. -OSName=$(uname -s) +OSName=$(uname -s | tr '[:upper:]' '[:lower:]') if command -v getprop && getprop ro.product.system.model 2>&1 | grep -qi android; then - OSName="Android" + OSName="android" fi case "$OSName" in -FreeBSD|Linux|NetBSD|OpenBSD|SunOS|Android) +freebsd|linux|netbsd|openbsd|sunos|android|haiku) os="$OSName" ;; -Darwin) - os=OSX ;; +darwin) + os=osx ;; *) echo "Unsupported OS $OSName detected!" exit 1 ;; @@ -20,11 +20,11 @@ esac # On Solaris, `uname -m` is discouraged, see https://docs.oracle.com/cd/E36784_01/html/E36870/uname-1.html # and `uname -p` returns processor type (e.g. i386 on amd64). # The appropriate tool to determine CPU is isainfo(1) https://docs.oracle.com/cd/E36784_01/html/E36870/isainfo-1.html. -if [ "$os" = "SunOS" ]; then +if [ "$os" = "sunos" ]; then if uname -o 2>&1 | grep -q illumos; then os="illumos" else - os="Solaris" + os="solaris" fi CPUName=$(isainfo -n) else diff --git a/eng/native/init-vs-env.cmd b/eng/native/init-vs-env.cmd index 403f355ec..273f49b33 100644 --- a/eng/native/init-vs-env.cmd +++ b/eng/native/init-vs-env.cmd @@ -8,7 +8,7 @@ if /i "%~1" == "x86" (set __VCBuildArch=x86) if /i "%~1" == "x64" (set __VCBuildArch=x86_amd64) if /i "%~1" == "arm" (set __VCBuildArch=x86_arm) if /i "%~1" == "arm64" (set __VCBuildArch=x86_arm64) -if /i "%~1" == "wasm" (set __VCBuildArch=x86_amd64) +if /i "%~1" == "wasm" (if /i "%PROCESSOR_ARCHITECTURE%" == "ARM64" (set __VCBuildArch=x86_arm64) else (set __VCBuildArch=x86_amd64)) :: Default to highest Visual Studio version available that has Visual C++ tools. :: @@ -61,8 +61,13 @@ exit /b 1 if "%__VCBuildArch%"=="" exit /b 0 :: Set the environment for the native build -call "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" %__VCBuildArch% -if not "%ErrorLevel%"=="0" exit /b 1 +:: We can set SkipVCEnvInit to skip setting up the MSVC environment from VS and instead assume that the current environment is set up correctly. +:: This is very useful for testing with new MSVC versions that aren't in a VS build yet. +if not defined SkipVCEnvInit ( + if not exist "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" goto :VSMissing + call "%VCINSTALLDIR%Auxiliary\Build\vcvarsall.bat" %__VCBuildArch% + if not "%ErrorLevel%"=="0" exit /b 1 +) set "__VCBuildArch=" diff --git a/eng/native/sanitizer-ignorelist.txt b/eng/native/sanitizer-ignorelist.txt new file mode 100644 index 000000000..ecc8bef9b --- /dev/null +++ b/eng/native/sanitizer-ignorelist.txt @@ -0,0 +1,14 @@ +# This file has exclusions to the Clang address sanitizer to suppress error reports +# When Clang 3.8 is available, convert these to suppression list instead as that is preferred for internal code + +# CMiniMdBase::UsesAllocatedMemory - suppress stack-buffer-underflow (code backs up pointer by -1 to check allocation ownership) +fun:_ZN11CMiniMdBase19UsesAllocatedMemoryEP11CMiniColDef + +# JIT_InitPInvokeFrame - suppress unknown sanitizer issue causing SEGV on unknown address 0x000000000000 +# 0 0x4e8a0c in __ubsan::checkDynamicType(void*, void*, unsigned long) +# 1 0x4e807f in HandleDynamicTypeCacheMiss(__ubsan::DynamicTypeCacheMissData*, unsigned long, unsigned long, __ubsan::ReportOptions) +# 2 0x4e8051 in __ubsan_handle_dynamic_type_cache_miss +# 3 0x7f02ce676cd8 in JIT_InitPInvokeFrame(InlinedCallFrame*, void*) /home/steveharter/git/dotnet_coreclr/vm/jithelpers.cpp:6491:9 +# 4 0x7f0252bbceb2 () +fun:_Z20JIT_InitPInvokeFrameP16InlinedCallFramePv + diff --git a/eng/native/sanitizerblacklist.txt b/eng/native/sanitizerblacklist.txt deleted file mode 100644 index ecc8bef9b..000000000 --- a/eng/native/sanitizerblacklist.txt +++ /dev/null @@ -1,14 +0,0 @@ -# This file has exclusions to the Clang address sanitizer to suppress error reports -# When Clang 3.8 is available, convert these to suppression list instead as that is preferred for internal code - -# CMiniMdBase::UsesAllocatedMemory - suppress stack-buffer-underflow (code backs up pointer by -1 to check allocation ownership) -fun:_ZN11CMiniMdBase19UsesAllocatedMemoryEP11CMiniColDef - -# JIT_InitPInvokeFrame - suppress unknown sanitizer issue causing SEGV on unknown address 0x000000000000 -# 0 0x4e8a0c in __ubsan::checkDynamicType(void*, void*, unsigned long) -# 1 0x4e807f in HandleDynamicTypeCacheMiss(__ubsan::DynamicTypeCacheMissData*, unsigned long, unsigned long, __ubsan::ReportOptions) -# 2 0x4e8051 in __ubsan_handle_dynamic_type_cache_miss -# 3 0x7f02ce676cd8 in JIT_InitPInvokeFrame(InlinedCallFrame*, void*) /home/steveharter/git/dotnet_coreclr/vm/jithelpers.cpp:6491:9 -# 4 0x7f0252bbceb2 () -fun:_Z20JIT_InitPInvokeFrameP16InlinedCallFramePv - diff --git a/eng/native/tryrun.cmake b/eng/native/tryrun.cmake index dc7bffb74..fa38d2459 100644 --- a/eng/native/tryrun.cmake +++ b/eng/native/tryrun.cmake @@ -1,6 +1,21 @@ set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) +# Also allow building as Android without specifying `-cross`. +if(NOT DEFINED TARGET_ARCH_NAME AND DEFINED ANDROID_PLATFORM) + if(ANDROID_ABI STREQUAL "arm64-v8a") + set(TARGET_ARCH_NAME "arm64") + elseif(ANDROID_ABI STREQUAL "x86_64") + set(TARGET_ARCH_NAME "x64") + elseif(ANDROID_ABI STREQUAL "armeabi-v7a") + set(TARGET_ARCH_NAME "arm") + elseif(ANDROID_ABI STREQUAL "x86") + set(TARGET_ARCH_NAME "x86") + else() + message(FATAL_ERROR "ANDROID_ABI ${ANDROID_ABI} not recognized!") + endif() +endif() + macro(set_cache_value) set(${ARGV0} ${ARGV1} CACHE STRING "Result from TRY_RUN" FORCE) set(${ARGV0}__TRYRUN_OUTPUT "dummy output" CACHE STRING "Output from TRY_RUN" FORCE) @@ -8,26 +23,33 @@ endmacro() if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf OR EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf OR - EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl) + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl OR + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/s390x-alpine-linux-musl OR + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/ppc64le-alpine-linux-musl OR + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl OR + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/x86_64-alpine-linux-musl OR + EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/riscv64-alpine-linux-musl) set(ALPINE_LINUX 1) elseif(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version) set(FREEBSD 1) set(CMAKE_SYSTEM_NAME FreeBSD) - set(CLR_CMAKE_TARGET_OS FreeBSD) + set(CLR_CMAKE_TARGET_OS freebsd) elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc) set(ILLUMOS 1) - set(CLR_CMAKE_TARGET_OS SunOS) + set(CLR_CMAKE_TARGET_OS sunos) elseif(EXISTS /System/Library/CoreServices) set(DARWIN 1) elseif(EXISTS ${CROSS_ROOTFS}/etc/tizen-release) set(TIZEN 1) +elseif(EXISTS ${CROSS_ROOTFS}/boot/system/develop/headers/config/HaikuConfig.h) + set(HAIKU 1) + set(CLR_CMAKE_TARGET_OS haiku) endif() if(DARWIN) if(TARGET_ARCH_NAME MATCHES "^(arm64|x64)$") set_cache_value(FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL_EXITCODE 1) - set_cache_value(GETPWUID_R_SETS_ERRNO_EXITCODE 1) set_cache_value(HAS_POSIX_SEMAPHORES_EXITCODE 1) set_cache_value(HAVE_BROKEN_FIFO_KEVENT_EXITCODE 1) set_cache_value(HAVE_BROKEN_FIFO_SELECT_EXITCODE 1) @@ -63,16 +85,15 @@ if(DARWIN) set_cache_value(PTHREAD_CREATE_MODIFIES_ERRNO_EXITCODE 1) set_cache_value(REALPATH_SUPPORTS_NONEXISTENT_FILES_EXITCODE 1) set_cache_value(SEM_INIT_MODIFIES_ERRNO_EXITCODE 1) - set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) set_cache_value(SSCANF_SUPPORT_ll_EXITCODE 0) set_cache_value(UNGETC_NOT_RETURN_EOF_EXITCODE 1) set_cache_value(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP_EXITCODE 1) + set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) else() message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm64 or x64 is supported for OSX cross build!") endif() -elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s390x|ppc64le|x86)$" OR FREEBSD OR ILLUMOS OR TIZEN) +elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s390x|ppc64le|x86|x64)$" OR FREEBSD OR ILLUMOS OR TIZEN OR HAIKU) set_cache_value(FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL_EXITCODE 1) - set_cache_value(GETPWUID_R_SETS_ERRNO_EXITCODE 0) set_cache_value(HAS_POSIX_SEMAPHORES_EXITCODE 0) set_cache_value(HAVE_CLOCK_MONOTONIC_COARSE_EXITCODE 0) set_cache_value(HAVE_CLOCK_MONOTONIC_EXITCODE 0) @@ -89,8 +110,6 @@ elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s39 set_cache_value(HAVE_LARGE_SNPRINTF_SUPPORT_EXITCODE 0) set_cache_value(HAVE_MMAP_DEV_ZERO_EXITCODE 0) set_cache_value(HAVE_PROCFS_CTL_EXITCODE 1) - set_cache_value(HAVE_PROCFS_MAPS_EXITCODE 0) - set_cache_value(HAVE_PROCFS_STATUS_EXITCODE 0) set_cache_value(HAVE_PROCFS_STAT_EXITCODE 0) set_cache_value(HAVE_SCHED_GETCPU_EXITCODE 0) set_cache_value(HAVE_SCHED_GET_PRIORITY_EXITCODE 0) @@ -102,18 +121,21 @@ elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s39 set_cache_value(PTHREAD_CREATE_MODIFIES_ERRNO_EXITCODE 1) set_cache_value(REALPATH_SUPPORTS_NONEXISTENT_FILES_EXITCODE 1) set_cache_value(SEM_INIT_MODIFIES_ERRNO_EXITCODE 1) - + set_cache_value(HAVE_TERMIOS2_EXITCODE 0) + set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 0) + set_cache_value(HAVE_PROCFS_MAPS_EXITCODE 0) + set_cache_value(HAVE_PROCFS_STATUS_EXITCODE 0) if(ALPINE_LINUX) set_cache_value(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP_EXITCODE 1) - set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 0) set_cache_value(SSCANF_SUPPORT_ll_EXITCODE 1) set_cache_value(UNGETC_NOT_RETURN_EOF_EXITCODE 1) + set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 0) else() set_cache_value(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP_EXITCODE 0) - set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) set_cache_value(SSCANF_SUPPORT_ll_EXITCODE 0) set_cache_value(UNGETC_NOT_RETURN_EOF_EXITCODE 0) + set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) endif() if (FREEBSD) @@ -124,12 +146,11 @@ elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s39 set_cache_value(HAVE_PROCFS_MAPS 0) set_cache_value(HAVE_PROCFS_STAT 0) set_cache_value(HAVE_PROCFS_STATUS_EXITCODE 1) - set_cache_value(GETPWUID_R_SETS_ERRNO 0) set_cache_value(UNGETC_NOT_RETURN_EOF 0) set_cache_value(HAVE_COMPATIBLE_ILOGBNAN 1) set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 0) + set_cache_value(HAVE_TERMIOS2_EXITCODE 1) elseif(ILLUMOS) - set_cache_value(GETPWUID_R_SETS_ERRNO_EXITCODE 1) set_cache_value(HAVE_COMPATIBLE_ACOS_EXITCODE 1) set_cache_value(HAVE_COMPATIBLE_ASIN_EXITCODE 1) set_cache_value(HAVE_COMPATIBLE_ATAN2_EXITCODE 1) @@ -139,20 +160,28 @@ elseif(TARGET_ARCH_NAME MATCHES "^(armel|arm|armv6|arm64|loongarch64|riscv64|s39 set_cache_value(HAVE_COMPATIBLE_LOG_EXITCODE 1) set_cache_value(HAVE_LARGE_SNPRINTF_SUPPORT_EXITCODE 1) set_cache_value(HAVE_PROCFS_CTL_EXITCODE 0) - set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) set_cache_value(SSCANF_SUPPORT_ll_EXITCODE 1) set_cache_value(UNGETC_NOT_RETURN_EOF_EXITCODE 0) set_cache_value(COMPILER_SUPPORTS_W_CLASS_MEMACCESS 1) set_cache_value(HAVE_SET_MAX_VARIABLE 1) set_cache_value(HAVE_FULLY_FEATURED_PTHREAD_MUTEXES 1) set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 0) + set_cache_value(HAVE_TERMIOS2_EXITCODE 1) + set_cache_value(SSCANF_CANNOT_HANDLE_MISSING_EXPONENT_EXITCODE 1) elseif (TIZEN) set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 0) + elseif(HAIKU) + set_cache_value(HAVE_CLOCK_MONOTONIC_COARSE_EXITCODE 1) + set_cache_value(HAVE_COMPATIBLE_EXP_EXITCODE 0) + set_cache_value(HAVE_COMPATIBLE_ILOGBNAN_EXITCODE 0) + set_cache_value(HAVE_PROCFS_STAT_EXITCODE 1) endif() else() - message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, armv6, arm64, loongarch64, s390x, ppc64le and x86 are supported!") + message(FATAL_ERROR "Unsupported platform. OS: ${CMAKE_SYSTEM_NAME}, arch: ${TARGET_ARCH_NAME}") endif() -if(TARGET_ARCH_NAME MATCHES "^(x86|s390x|armv6|loongarch64|riscv64|ppc64le)$") +if(TARGET_ARCH_NAME MATCHES "^(x86|x64|s390x|armv6|loongarch64|ppc64le)$") set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 0) +elseif (TARGET_ARCH_NAME STREQUAL "riscv64") + set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 1) endif() diff --git a/eng/native/tryrun_ios_tvos.cmake b/eng/native/tryrun_ios_tvos.cmake new file mode 100644 index 000000000..378af96da --- /dev/null +++ b/eng/native/tryrun_ios_tvos.cmake @@ -0,0 +1,46 @@ +macro(set_cache_value) + set(${ARGV0} ${ARGV1} CACHE STRING "Result from TRY_RUN" FORCE) + set(${ARGV0}__TRYRUN_OUTPUT "dummy output" CACHE STRING "Output from TRY_RUN" FORCE) +endmacro() + +set_cache_value(HAVE_SCHED_GETCPU_EXITCODE 1) +set_cache_value(HAVE_CLOCK_MONOTONIC_COARSE_EXITCODE 1) +set_cache_value(HAVE_CLOCK_MONOTONIC_EXITCODE 0) + + +# TODO: these are taken from macOS, check these whether they're correct for iOS +# some of them are probably not used by what we use from NativeAOT so could be reduced +set_cache_value(FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL_EXITCODE 1) +set_cache_value(HAS_POSIX_SEMAPHORES_EXITCODE 1) +set_cache_value(HAVE_BROKEN_FIFO_KEVENT_EXITCODE 1) +set_cache_value(HAVE_BROKEN_FIFO_SELECT_EXITCODE 1) +set_cache_value(HAVE_CLOCK_REALTIME_EXITCODE 0) +set_cache_value(HAVE_CLOCK_THREAD_CPUTIME_EXITCODE 0) +set_cache_value(HAVE_CLOCK_GETTIME_NSEC_NP_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_ACOS_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_ASIN_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_ATAN2_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_EXP_EXITCODE 1) +set_cache_value(HAVE_COMPATIBLE_ILOGB0_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_ILOGBNAN_EXITCODE 1) +set_cache_value(HAVE_COMPATIBLE_LOG10_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_LOG_EXITCODE 0) +set_cache_value(HAVE_COMPATIBLE_POW_EXITCODE 0) +set_cache_value(HAVE_FUNCTIONAL_PTHREAD_ROBUST_MUTEXES_EXITCODE 1) +set_cache_value(HAVE_LARGE_SNPRINTF_SUPPORT_EXITCODE 0) +set_cache_value(HAVE_MMAP_DEV_ZERO_EXITCODE 1) +set_cache_value(HAVE_PROCFS_CTL_EXITCODE 1) +set_cache_value(HAVE_PROCFS_STAT_EXITCODE 1) +set_cache_value(HAVE_SCHED_GET_PRIORITY_EXITCODE 0) +set_cache_value(HAVE_VALID_NEGATIVE_INF_POW_EXITCODE 0) +set_cache_value(HAVE_VALID_POSITIVE_INF_POW_EXITCODE 0) +set_cache_value(HAVE_WORKING_CLOCK_GETTIME_EXITCODE 0) +set_cache_value(HAVE_WORKING_GETTIMEOFDAY_EXITCODE 0) +set_cache_value(MMAP_ANON_IGNORES_PROTECTION_EXITCODE 1) +set_cache_value(ONE_SHARED_MAPPING_PER_FILEREGION_PER_PROCESS_EXITCODE 1) +set_cache_value(PTHREAD_CREATE_MODIFIES_ERRNO_EXITCODE 1) +set_cache_value(REALPATH_SUPPORTS_NONEXISTENT_FILES_EXITCODE 1) +set_cache_value(SEM_INIT_MODIFIES_ERRNO_EXITCODE 1) +set_cache_value(SSCANF_SUPPORT_ll_EXITCODE 0) +set_cache_value(UNGETC_NOT_RETURN_EOF_EXITCODE 1) +set_cache_value(HAVE_SHM_OPEN_THAT_WORKS_WELL_ENOUGH_WITH_MMAP_EXITCODE 1) diff --git a/eng/native/version/copy_version_files.cmd b/eng/native/version/copy_version_files.cmd index ef5f31e24..5fa930059 100644 --- a/eng/native/version/copy_version_files.cmd +++ b/eng/native/version/copy_version_files.cmd @@ -1,9 +1,11 @@ @if not defined _echo @echo off setlocal EnableDelayedExpansion EnableExtensions -set __VersionFolder=%~dp0 -set __RepoRoot=%~dp0..\..\.. -set __artifactsObjDir=%__RepoRoot%\artifacts\obj +set "__VersionFolder=%~dp0" +set "__RepoRoot=%~dp0..\..\.." +:: normalize +for %%i in ("%__RepoRoot%") do set "__RepoRoot=%%~fi" +set "__artifactsObjDir=%__RepoRoot%\artifacts\obj" for /r "%__VersionFolder%" %%a in (*.h *.rc) do ( if not exist "%__artifactsObjDir%\%%~nxa" ( diff --git a/eng/pipelines/build.yml b/eng/pipelines/build.yml index 03c9700f3..e9756625f 100644 --- a/eng/pipelines/build.yml +++ b/eng/pipelines/build.yml @@ -149,13 +149,13 @@ jobs: downloadPath: '$(Build.ArtifactStagingDirectory)/__download__' downloadType: specific itemPattern: | - Build_$(_BuildConfig)/bin/Linux${{ parameters.osSuffix }}.$(_BuildArch).$(_BuildConfig)/** + Build_$(_BuildConfig)/bin/linux${{ parameters.osSuffix }}.$(_BuildArch).$(_BuildConfig)/** checkDownloadedFiles: true - task: CopyFiles@2 displayName: 'Binplace Product' inputs: - sourceFolder: $(Build.ArtifactStagingDirectory)/__download__/Build_$(_BuildConfig)/bin/Linux${{ parameters.osSuffix }}.$(_BuildArch).$(_BuildConfig) - targetFolder: '$(Build.SourcesDirectory)/artifacts/bin/Linux.$(_BuildArch).$(_BuildConfig)' + sourceFolder: $(Build.ArtifactStagingDirectory)/__download__/Build_$(_BuildConfig)/bin/linux${{ parameters.osSuffix }}.$(_BuildArch).$(_BuildConfig) + targetFolder: '$(Build.SourcesDirectory)/artifacts/bin/linux.$(_BuildArch).$(_BuildConfig)' - ${{ if eq(parameters.isCodeQLRun, 'true') }}: - task: CodeQL3000Init@0 diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs index d98841efe..49a54bf27 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs @@ -75,7 +75,7 @@ namespace Microsoft.Diagnostics.TestHelpers ["Timestamp"] = GetTimeStampText(), ["TempPath"] = Path.GetTempPath(), ["WorkingDir"] = GetInitialWorkingDir(), - ["OS"] = OS.Kind.ToString(), + ["OS"] = OS.Kind.ToString().ToLowerInvariant(), ["IsAlpine"] = OS.IsAlpine.ToString().ToLowerInvariant(), ["TargetRid"] = GetRid(), ["TargetArchitecture"] = OS.TargetArchitecture.ToString().ToLowerInvariant(), diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index dbe012fad..5b869886b 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -172,10 +172,10 @@ --fx-version $(FrameworkVersion) - - diff --git a/src/shared/pal/src/config.h.in b/src/shared/pal/src/config.h.in index c68421302..2cace986e 100644 --- a/src/shared/pal/src/config.h.in +++ b/src/shared/pal/src/config.h.in @@ -137,7 +137,6 @@ #cmakedefine01 HAVE_COMPATIBLE_LOG10 #cmakedefine01 UNGETC_NOT_RETURN_EOF #cmakedefine01 HAS_POSIX_SEMAPHORES -#cmakedefine01 GETPWUID_R_SETS_ERRNO #cmakedefine01 FILE_OPS_CHECK_FERROR_OF_PREVIOUS_CALL #define PAL_THREAD_PRIORITY_MIN 0 diff --git a/src/shared/pal/src/configure.cmake b/src/shared/pal/src/configure.cmake index ee4a32411..62ae79379 100644 --- a/src/shared/pal/src/configure.cmake +++ b/src/shared/pal/src/configure.cmake @@ -962,34 +962,7 @@ int main() { exit(0); }" HAS_POSIX_SEMAPHORES) set(CMAKE_REQUIRED_LIBRARIES) -check_cxx_source_runs(" -#include -#include -#include -#include -#include - -int main(void) -{ - struct passwd sPasswd; - struct passwd *pPasswd; - char buf[1]; - int bufLen = sizeof(buf)/sizeof(buf[0]); - int euid = geteuid(); - int ret = 0; - - errno = 0; // clear errno - ret = getpwuid_r(euid, &sPasswd, buf, bufLen, &pPasswd); - if (0 != ret) - { - if (ERANGE == errno) - { - return 0; - } - } - return 1; // assume errno is NOT set for all other cases -}" GETPWUID_R_SETS_ERRNO) check_cxx_source_runs(" #include #include diff --git a/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index bc520c258..1c0211fca 100644 --- a/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -30,11 +30,11 @@ false - true + true false false - true + true false @@ -116,13 +116,13 @@ $(DotNetRoot)/shared/Microsoft.NETCore.App/$(RuntimeFrameworkVersion) - -