#1 Update to .NET Core 3.1 Preview 3
Closed a year ago by omajid. Opened 4 years ago by omajid.
dotnet-sig/ omajid/dotnet-3-1 master  into  master

file modified
+68 -23
@@ -3,10 +3,12 @@ 

  # Usage:

  #   build-dotnet-tarball <tag-from-source-build>

  #

- # Creates a source archive from a tag at github.com/dotnet/source-build

+ # Creates a source archive from a tag (or commit) at github.com/dotnet/source-build

  

- # Source-build is a little strange, we need to clone it, check out the tag,

- # build it and then create a tarball from the archive directory it creates.

+ # Source-build is a little strange, we need to clone it, check out the

+ # tag, build it and then create a tarball from the archive directory

+ # it creates. Also, it is likely that the source archive is only

+ # buildable on the OS it was initially created in.

  

  set -euo pipefail

  IFS=$'\n\t'
@@ -23,6 +25,31 @@ 

      rm -rf /tmp/NuGet /tmp/NuGetScratch /tmp/.NETCore* /tmp/.NETStandard* /tmp/.dotnet /tmp/dotnet.* /tmp/clr-debug-pipe* /tmp/Razor-Server /tmp/CoreFxPipe* /tmp/VBCSCompiler /tmp/.NETFramework*

  }

  

+ function runtime_id {

+ 

+     declare -A archmap

+     archmap=(

+         ["aarch64"]="arm64"

+         ["amd64"]="x64"

+         ["armv8l"]="arm"

+         ["i686"]="x86"

+         ["i386"]="x86"

+         ["x86_64"]="x64"

+     )

+ 

+     arch=${archmap["$(uname -m)"]}

+ 

+     source /etc/os-release

+     case "${ID}" in

+         # Remove the RHEL minor version

+         rhel) rid_version=${VERSION_ID%.*} ;;

+ 

+         *) rid_version=${VERSION_ID} ;;

+     esac

+ 

+     echo "${ID}.${rid_version}-${arch}"

+ }

+ 

  positional_args=()

  while [[ "$#" -gt 0 ]]; do

      arg="${1}"
@@ -47,26 +74,44 @@ 

  

  set -x

  

- temp_dir=$(mktemp -d -p "$(pwd)")

- dir_name="dotnet-${tag}"

- pushd "${temp_dir}"

- git clone https://github.com/dotnet/source-build

- pushd source-build

- git checkout "${tag}"

- git submodule update --init --recursive

- clean_dotnet_cache

- sed -i -e 's|cmakeargs -DCLR_CMAKE_USE_SYSTEM_LIBUNWIND=TRUE||' repos/coreclr.proj

- ./build-source-tarball.sh "${dir_name}"

- 

- # Remove files with funny licenses and crypto implementations

- pushd "${dir_name}"

- find src/AspNetCore.*/src -type d -name samples | xargs rm -r

- rm -r src/NuGet.Client.*/test/EndToEnd/ProjectTemplates/NetCoreWebApplication1.0.zip

- popd

+ dir_name="dotnet-${tag}-$(runtime_id)"

+ unmodified_tarball_name="${dir_name}-original"

+ tarball_name="${dir_name}"

  

- popd

- popd

+ if [ -f "${tarball_name}.tar.gz" ]; then

+     echo "error: ${tarball_name}.tar.gz already exists"

+     exit 1

+ fi

+ 

+ if [ ! -f "${unmodified_tarball_name}.tar.gz" ]; then

+     temp_dir=$(mktemp -d -p "$(pwd)")

+     pushd "${temp_dir}"

+     git clone https://github.com/dotnet/source-build

+     pushd source-build

+     git checkout "${tag}"

+     git submodule update --init --recursive

+     clean_dotnet_cache

+     sed -i -e 's|cmakeargs -DCLR_CMAKE_USE_SYSTEM_LIBUNWIND=TRUE||' repos/coreclr.proj

+     ./build-source-tarball.sh "${unmodified_tarball_name}"

+     popd

+     popd

+ 

+     tar czf "${unmodified_tarball_name}.tar.gz" -C "${temp_dir}/source-build" "${unmodified_tarball_name}"

  

- tar czf "${dir_name}.tar.gz" -C "${temp_dir}/source-build" "${dir_name}"

+     rm -rf "${temp_dir}"

+ fi

+ 

+ rm -rf "${tarball_name}"

+ tar xf "${unmodified_tarball_name}.tar.gz"

+ mv "${unmodified_tarball_name}" "${tarball_name}"

+ 

+ pushd "${tarball_name}"

+ # Remove files with funny licenses, crypto implementations and other

+ # not-very-useful artifacts to reduce tarball size

+ rm -r src/AspNetCore.*/src/SignalR/clients/java/signalr/gradle*

+ find src/AspNetCore.*/src -type d -name samples -print0 | xargs -0 rm -r

+ rm -r src/NuGet.Client.*/test/EndToEnd/ProjectTemplates/NetCoreWebApplication1.0.zip

+ find src/coreclr.*/ -depth -name tests -print0 | xargs -0 rm -r

+ popd

  

- rm -rf "${temp_dir}"

+ tar czf "${tarball_name}.tar.gz" "${tarball_name}"

@@ -1,58 +0,0 @@ 

- --- a/src/settings.cmake

- +++ b/src/settings.cmake

- @@ -69,55 +69,10 @@

-      endif (CMAKE_SYSTEM_NAME STREQUAL Darwin)

-  endif ()

-  

- -function(strip_symbols targetName outputFilename)

- -    if(CLR_CMAKE_PLATFORM_UNIX)

- -        if(STRIP_SYMBOLS)

- -

- -            # On the older version of cmake (2.8.12) used on Ubuntu 14.04 the TARGET_FILE

- -            # generator expression doesn't work correctly returning the wrong path and on

- -            # the newer cmake versions the LOCATION property isn't supported anymore.

- -            if(CMAKE_VERSION VERSION_EQUAL 3.0 OR CMAKE_VERSION VERSION_GREATER 3.0)

- -                set(strip_source_file $<TARGET_FILE:${targetName}>)

- -            else()

- -                get_property(strip_source_file TARGET ${targetName} PROPERTY LOCATION)

- -            endif()

- -

- -            if(CMAKE_SYSTEM_NAME STREQUAL Darwin)

- -                set(strip_destination_file ${strip_source_file}.dwarf)

- -

- -                add_custom_command(

- -                    TARGET ${targetName}

- -                    POST_BUILD

- -                    VERBATIM 

- -                    COMMAND ${DSYMUTIL} --flat --minimize ${strip_source_file}

- -                    COMMAND ${STRIP} -u -r ${strip_source_file}

- -                    COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file}

- -                )

- -            else(CMAKE_SYSTEM_NAME STREQUAL Darwin)

- -                set(strip_destination_file ${strip_source_file}.dbg)

- -

- -                add_custom_command(

- -                    TARGET ${targetName}

- -                    POST_BUILD

- -                    VERBATIM 

- -                    COMMAND ${OBJCOPY} --only-keep-debug ${strip_source_file} ${strip_destination_file}

- -                    COMMAND ${OBJCOPY} --strip-unneeded ${strip_source_file}

- -                    COMMAND ${OBJCOPY} --add-gnu-debuglink=${strip_destination_file} ${strip_source_file}

- -                    COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file}

- -                )

- -            endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)

- -

- -            set(${outputFilename} ${strip_destination_file} PARENT_SCOPE)

- -        endif(STRIP_SYMBOLS)

- -    endif(CLR_CMAKE_PLATFORM_UNIX)

- -endfunction()

- -

-  function(install_symbols targetName destination_path)

-      if(WIN32)

-          install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${targetName}.pdb DESTINATION ${destination_path})

-      else()

- -        strip_symbols(${targetName} strip_destination_file)

- -        install(FILES ${strip_destination_file} DESTINATION ${destination_path})

-      endif()

-  endfunction()

-  

@@ -26,8 +26,8 @@ 

  --- a/src/pal/src/misc/sysinfo.cpp

  +++ b/src/pal/src/misc/sysinfo.cpp

  @@ -28,9 +28,12 @@ Revision History:

-  #include <errno.h>

-  #include <unistd.h>

+  #define __STDC_FORMAT_MACROS

+  #include <inttypes.h>

   #include <sys/types.h>

  -#if HAVE_SYSCTL

  +

@@ -1,54 +0,0 @@ 

- diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp

- index e5760bebd8..d9a4e2dedd 100644

- --- a/src/gc/unix/cgroup.cpp

- +++ b/src/gc/unix/cgroup.cpp

- @@ -31,6 +31,9 @@ Abstract:

-  #ifndef SIZE_T_MAX

-  #define SIZE_T_MAX (~(size_t)0)

-  #endif

- +#ifndef _countof

- +#define _countof(_array) (sizeof(_array) / sizeof(_array[0]))

- +#endif // !_countof

-  

-  #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo"

-  #define PROC_CGROUP_FILENAME "/proc/self/cgroup"

- @@ -74,7 +77,7 @@ public:

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

- +        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files));

-          if (mem_limit_filename == nullptr)

-              return result;

-  

- @@ -97,7 +100,7 @@ public:

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

- +        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files));

-          if (mem_usage_filename == nullptr)

-              return result;

-  

- diff --git a/src/pal/src/misc/cgroup.cpp b/src/pal/src/misc/cgroup.cpp

- index e32b74aabe..0b922123c8 100644

- --- a/src/pal/src/misc/cgroup.cpp

- +++ b/src/pal/src/misc/cgroup.cpp

- @@ -62,7 +61,7 @@ public:

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

- +        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files));

-          if (mem_limit_filename == nullptr)

-              return result;

-  

- @@ -85,7 +84,7 @@ public:

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

- +        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files));

-          if (mem_usage_filename == nullptr)

-              return result;

-  

file removed
-876
@@ -1,876 +0,0 @@ 

- From 7b33e078b41819284175533215047359bb952b5d Mon Sep 17 00:00:00 2001

- From: Omair Majid <omajid@redhat.com>

- Date: Fri, 26 Jul 2019 17:12:48 -0400

- Subject: [PATCH] Add cgroup v2 support to CoreCLR

- 

- Upstream cgroup v2 documentation is available at:

- https://www.kernel.org/doc/Documentation/cgroup-v2.txt

- 

- Some notable differences between cgroup v1 and v2, from a CoreCLR point

- of view, include:

- 

- - cgroup v2 has a single hierarchy, so we just look for a single "cgroup2"

-   entry in /proc/self/mountinfo (without looking for a subsystem match).

- 

- - Since cgroup v2 has a single hierarchy, /proc/self/cgroup generally

-   has a single line "0::/path". There's no need to match subsystems or

-   hierarchy ids here.

- 

- - "memory.limit_in_bytes" is now "memory.max". It can contain the

-   literal "max" to indicate no limit.

- 

- - "memory.usage_in_bytes" is now "memory.current"

- 

- - "cpu.cfs_quota_us" and "cpu.cfs_period_us" have been combined into a

-   single "cpu.max" file with the format "$MAX $PERIOD". The max value

-   can be a literal "max" to indicate a limit is not active.

- ---

-  src/gc/unix/cgroup.cpp      | 292 +++++++++++++++++++++++++++++-------

-  src/pal/src/misc/cgroup.cpp | 287 ++++++++++++++++++++++++++++-------

-  2 files changed, 471 insertions(+), 108 deletions(-)

- 

- diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp

- index 1e60898948..e5760bebd8 100644

- --- a/src/gc/unix/cgroup.cpp

- +++ b/src/gc/unix/cgroup.cpp

- @@ -35,20 +35,24 @@ Abstract:

-  #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo"

-  #define PROC_CGROUP_FILENAME "/proc/self/cgroup"

-  #define PROC_STATM_FILENAME "/proc/self/statm"

- -#define MEM_LIMIT_FILENAME "/memory.limit_in_bytes"

- -#define MEM_USAGE_FILENAME "/memory.usage_in_bytes"

- -#define CFS_QUOTA_FILENAME "/cpu.cfs_quota_us"

- -#define CFS_PERIOD_FILENAME "/cpu.cfs_period_us"

- +#define CGROUP1_MEMORY_LIMIT_FILENAME "/memory.limit_in_bytes"

- +#define CGROUP2_MEMORY_LIMIT_FILENAME "/memory.max"

- +#define CGROUP1_MEMORY_USAGE_FILENAME "/memory.usage_in_bytes"

- +#define CGROUP2_MEMORY_USAGE_FILENAME "/memory.current"

- +#define CGROUP1_CFS_QUOTA_FILENAME "/cpu.cfs_quota_us"

- +#define CGROUP1_CFS_PERIOD_FILENAME "/cpu.cfs_period_us"

- +#define CGROUP2_CPU_MAX_FILENAME "/cpu.max"

- +

-  

-  class CGroup

-  {

- -    static char* s_memory_cgroup_path;

- -    static char* s_cpu_cgroup_path;

- +    static char *s_memory_cgroup_path;

- +    static char *s_cpu_cgroup_path;

-  public:

-      static void Initialize()

-      {

- -        s_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem);

- -        s_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem);

- +        s_memory_cgroup_path = FindCGroupPath(&IsCGroup1MemorySubsystem);

- +        s_cpu_cgroup_path = FindCGroupPath(&IsCGroup1CpuSubsystem);

-      }

-  

-      static void Cleanup()

- @@ -59,20 +63,21 @@ public:

-  

-      static bool GetPhysicalMemoryLimit(size_t *val)

-      {

- +        const char *files[] = {

- +            CGROUP1_MEMORY_LIMIT_FILENAME,

- +            CGROUP2_MEMORY_LIMIT_FILENAME

- +        };

- +

-          char *mem_limit_filename = nullptr;

-          bool result = false;

-  

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        size_t len = strlen(s_memory_cgroup_path);

- -        len += strlen(MEM_LIMIT_FILENAME);

- -        mem_limit_filename = (char*)malloc(len+1);

- +        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

-          if (mem_limit_filename == nullptr)

-              return result;

-  

- -        strcpy(mem_limit_filename, s_memory_cgroup_path);

- -        strcat(mem_limit_filename, MEM_LIMIT_FILENAME);

-          result = ReadMemoryValueFromFile(mem_limit_filename, val);

-          free(mem_limit_filename);

-          return result;

- @@ -80,6 +85,11 @@ public:

-  

-      static bool GetPhysicalMemoryUsage(size_t *val)

-      {

- +        const char *files[] = {

- +            CGROUP1_MEMORY_USAGE_FILENAME,

- +            CGROUP2_MEMORY_USAGE_FILENAME

- +        };

- +

-          char *mem_usage_filename = nullptr;

-          bool result = false;

-  

- @@ -87,14 +97,10 @@ public:

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        size_t len = strlen(s_memory_cgroup_path);

- -        len += strlen(MEM_USAGE_FILENAME);

- -        mem_usage_filename = (char*)malloc(len+1);

- +        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

-          if (mem_usage_filename == nullptr)

-              return result;

-  

- -        strcpy(mem_usage_filename, s_memory_cgroup_path);

- -        strcat(mem_usage_filename, MEM_USAGE_FILENAME);

-          result = ReadMemoryValueFromFile(mem_usage_filename, val);

-          free(mem_usage_filename);

-          return result;

- @@ -112,16 +118,149 @@ public:

-      }

-  

-      static bool GetCpuLimit(uint32_t *val)

- +    {

- +        if (GetCGroup1CpuLimit(val))

- +        {

- +            return true;

- +        }

- +

- +        if (GetCGroup2CpuLimit(val))

- +        {

- +            return true;

- +        }

- +

- +        return false;

- +    }

- +

- +private:

- +    static bool IsCGroup1MemorySubsystem(const char *strTok){

- +        return strcmp("memory", strTok) == 0;

- +    }

- +

- +    static bool IsCGroup1CpuSubsystem(const char *strTok){

- +        return strcmp("cpu", strTok) == 0;

- +    }

- +

- +    static bool GetCGroup2CpuLimit(uint32_t *val)

- +    {

- +        char *line = nullptr;

- +        char *filename = nullptr;

- +        FILE *file = nullptr;

- +        char *max_quota_string = nullptr;

- +        char *period_string = nullptr;

- +

- +        size_t lineLen = 0;

- +        int sscanRet = 0;

- +        long long max_quota = 0;

- +        long long period = 0;

- +        double cpu_count = 0;

- +

- +        bool result = false;

- +

- +        if (s_cpu_cgroup_path == nullptr)

- +        {

- +            return false;

- +        }

- +

- +        size_t filename_len = strlen(s_cpu_cgroup_path) + strlen(CGROUP2_CPU_MAX_FILENAME);

- +        filename = (char*)malloc(filename_len + 1);

- +        if (filename == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        strcpy(filename, s_cpu_cgroup_path);

- +        strcat(filename, CGROUP2_CPU_MAX_FILENAME);

- +

- +        file = fopen(filename, "r");

- +        if (file == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        if (getline(&line, &lineLen, file) == -1)

- +        {

- +            goto done;

- +        }

- +

- +        // The expected format is:

- +        //     $MAX $PERIOD

- +        // Where "$MAX" may be the string literal "max"

- +

- +        max_quota_string = (char*) malloc(lineLen + 1);

- +        if (max_quota_string == nullptr)

- +        {

- +            goto done;

- +        }

- +        period_string = (char*) malloc(lineLen + 1);

- +        if (period_string == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        sscanRet = sscanf(line, "%s %s", max_quota_string, period_string);

- +        if (sscanRet != 2)

- +        {

- +            assert(!"Unable to parse " CGROUP2_CPU_MAX_FILENAME " file contents with sscanf.");

- +            goto done;

- +        }

- +

- +        // "max" means no cpu limit

- +        if (strncmp("max", max_quota_string, lineLen + 1) == 0)

- +        {

- +            goto done;

- +        }

- +

- +        errno = 0;

- +        max_quota = atoll(max_quota_string);

- +        if (errno != 0)

- +        {

- +            goto done;

- +        }

- +

- +        errno = 0;

- +        period = atoll(period_string);

- +        if (errno != 0)

- +        {

- +            goto done;

- +        }

- +

- +        // Cannot have less than 1 CPU

- +        if (max_quota <= period)

- +        {

- +            result = true;

- +            *val = 1;

- +            goto done;

- +        }

- +

- +        // Calculate cpu count based on quota and round it up

- +        cpu_count = (double) max_quota / period  + 0.999999999;

- +        *val = (cpu_count < UINT32_MAX) ? (uint32_t)cpu_count : UINT32_MAX;

- +

- +        result = true;

- +

- +    done:

- +        if (file)

- +            fclose(file);

- +        free(filename);

- +        free(line);

- +        free(max_quota_string);

- +        free(period_string);

- +

- +        return result;

- +    }

- +

- +    static bool GetCGroup1CpuLimit(uint32_t *val)

-      {

-          long long quota;

-          long long period;

-          double cpu_count;

-  

- -        quota = ReadCpuCGroupValue(CFS_QUOTA_FILENAME);

- +        quota = ReadCpuCGroupValue(CGROUP1_CFS_QUOTA_FILENAME);

-          if (quota <= 0)

-              return false;

-  

- -        period = ReadCpuCGroupValue(CFS_PERIOD_FILENAME);

- +        period = ReadCpuCGroupValue(CGROUP1_CFS_PERIOD_FILENAME);

-          if (period <= 0)

-              return false;

-  

- @@ -138,27 +277,19 @@ public:

-  

-          return true;

-      }

- -    

- -private:

- -    static bool IsMemorySubsystem(const char *strTok){

- -        return strcmp("memory", strTok) == 0;

- -    }

-  

- -    static bool IsCpuSubsystem(const char *strTok){

- -        return strcmp("cpu", strTok) == 0;

- -    }

- -

- -    static char* FindCgroupPath(bool (*is_subsystem)(const char *)){

- +    static char* FindCGroupPath(bool (*is_subsystem)(const char *)){

-          char *cgroup_path = nullptr;

-          char *hierarchy_mount = nullptr;

-          char *hierarchy_root = nullptr;

-          char *cgroup_path_relative_to_mount = nullptr;

- +        bool is_cgroupv2 = false;

-  

- -        FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root);

- +        FindHierarchyMount(is_subsystem, &is_cgroupv2, &hierarchy_mount, &hierarchy_root);

-          if (hierarchy_mount == nullptr || hierarchy_root == nullptr)

-              goto done;

-  

- -        cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem);

- +        cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_cgroupv2, is_subsystem);

-          if (cgroup_path_relative_to_mount == nullptr)

-              goto done;

-  

- @@ -179,7 +310,7 @@ private:

-          return cgroup_path;

-      }

-  

- -    static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot)

- +    static void FindHierarchyMount(bool (*is_subsystem)(const char *), bool* is_cgroupv2, char** pmountpath, char** pmountroot)

-      {

-          char *line = nullptr;

-          size_t lineLen = 0, maxLineLen = 0;

- @@ -219,14 +350,18 @@ private:

-                  assert(!"Failed to parse mount info file contents with sscanf.");

-                  goto done;

-              }

- -    

- +

-              if (strncmp(filesystemType, "cgroup", 6) == 0)

-              {

- +                if (strncmp(filesystemType, "cgroup2", 8) == 0)

- +                {

- +                    *is_cgroupv2 = true;

- +                }

-                  char* context = nullptr;

-                  char* strTok = strtok_r(options, ",", &context); 

-                  while (strTok != nullptr)

-                  {

- -                    if (is_subsystem(strTok))

- +                    if (*is_cgroupv2 || is_subsystem(strTok))

-                      {

-                          mountpath = (char*)malloc(lineLen+1);

-                          if (mountpath == nullptr)

- @@ -234,7 +369,7 @@ private:

-                          mountroot = (char*)malloc(lineLen+1);

-                          if (mountroot == nullptr)

-                              goto done;

- -    

- +

-                          sscanfRet = sscanf(line,

-                                             "%*s %*s %*s %s %s ",

-                                             mountroot,

- @@ -261,8 +396,8 @@ private:

-          if (mountinfofile)

-              fclose(mountinfofile);

-      }

- -    

- -    static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *))

- +

- +    static char* FindCGroupPathForSubsystem(bool is_cgroupv2, bool (*is_subsystem)(const char *))

-      {

-          char *line = nullptr;

-          size_t lineLen = 0;

- @@ -274,7 +409,7 @@ private:

-          FILE *cgroupfile = fopen(PROC_CGROUP_FILENAME, "r");

-          if (cgroupfile == nullptr)

-              goto done;

- -    

- +

-          while (!result && getline(&line, &lineLen, cgroupfile) != -1)

-          {

-              if (subsystem_list == nullptr || lineLen > maxLineLen)

- @@ -289,28 +424,43 @@ private:

-                      goto done;

-                  maxLineLen = lineLen;

-              }

- -                   

- -            // See man page of proc to get format for /proc/self/cgroup file

- -            int sscanfRet = sscanf(line, 

- -                                   "%*[^:]:%[^:]:%s",

- -                                   subsystem_list,

- -                                   cgroup_path);

- -            if (sscanfRet != 2)

- +

- +            if (is_cgroupv2)

-              {

- -                assert(!"Failed to parse cgroup info file contents with sscanf.");

- -                goto done;

- +                // See https://www.kernel.org/doc/Documentation/cgroup-v2.txt

- +                // Look for "0::/some/path"

- +                int sscanfRet = sscanf(line,

- +                                       "0::%s",

- +                                       cgroup_path);

- +                if (sscanfRet == 1)

- +                {

- +                    result = true;

- +                }

-              }

- -    

- -            char* context = nullptr;

- -            char* strTok = strtok_r(subsystem_list, ",", &context); 

- -            while (strTok != nullptr)

- +            else

-              {

- -                if (is_subsystem(strTok))

- +                // See man page of proc to get format for /proc/self/cgroup file

- +                int sscanfRet = sscanf(line,

- +                                       "%*[^:]:%[^:]:%s",

- +                                       subsystem_list,

- +                                       cgroup_path);

- +                if (sscanfRet != 2)

-                  {

- -                    result = true;

- -                    break;  

- +                    assert(!"Failed to parse cgroup info file contents with sscanf.");

- +                    goto done;

- +                }

- +

- +                char* context = nullptr;

- +                char* strTok = strtok_r(subsystem_list, ",", &context);

- +                while (strTok != nullptr)

- +                {

- +                    if (is_subsystem(strTok))

- +                    {

- +                        result = true;

- +                        break;

- +                    }

- +                    strTok = strtok_r(nullptr, ",", &context);

-                  }

- -                strTok = strtok_r(nullptr, ",", &context);

-              }

-          }

-      done:

- @@ -325,6 +475,36 @@ private:

-              fclose(cgroupfile);

-          return cgroup_path;

-      }

- +

- +    static char* SearchForFile(char* search_root, const char* possible_files[], size_t possible_files_len)

- +    {

- +        if (search_root == nullptr)

- +        {

- +            return nullptr;

- +        }

- +

- +        for (size_t i = 0; i < possible_files_len; i++)

- +        {

- +            const char* possible_file = possible_files[i];

- +            size_t len = strlen(search_root);

- +            len += strlen(possible_file);

- +            char* full_filename = (char*)malloc(len+1);

- +            if (full_filename == nullptr)

- +            {

- +                return nullptr;

- +            }

- +            strcpy(full_filename, search_root);

- +            strcat(full_filename, possible_file);

- +            if (access(full_filename, R_OK) != -1)

- +            {

- +                return full_filename;

- +            }

- +

- +            free(full_filename);

- +        }

- +

- +        return nullptr;

- +    }

-      

-      static bool ReadMemoryValueFromFile(const char* filename, size_t* val)

-      {

- diff --git a/src/pal/src/misc/cgroup.cpp b/src/pal/src/misc/cgroup.cpp

- index 3fc43a7b05..e32b74aabe 100644

- --- a/src/pal/src/misc/cgroup.cpp

- +++ b/src/pal/src/misc/cgroup.cpp

- @@ -23,10 +23,15 @@

-  #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo"

-  #define PROC_CGROUP_FILENAME "/proc/self/cgroup"

-  #define PROC_STATM_FILENAME "/proc/self/statm"

- -#define MEM_LIMIT_FILENAME "/memory.limit_in_bytes"

- -#define MEM_USAGE_FILENAME "/memory.usage_in_bytes"

- -#define CFS_QUOTA_FILENAME "/cpu.cfs_quota_us"

- -#define CFS_PERIOD_FILENAME "/cpu.cfs_period_us"

- +#define CGROUP1_MEMORY_LIMIT_FILENAME "/memory.limit_in_bytes"

- +#define CGROUP2_MEMORY_LIMIT_FILENAME "/memory.max"

- +#define CGROUP1_MEMORY_USAGE_FILENAME "/memory.usage_in_bytes"

- +#define CGROUP2_MEMORY_USAGE_FILENAME "/memory.current"

- +#define CGROUP1_CFS_QUOTA_FILENAME "/cpu.cfs_quota_us"

- +#define CGROUP1_CFS_PERIOD_FILENAME "/cpu.cfs_period_us"

- +#define CGROUP2_CPU_MAX_FILENAME "/cpu.max"

- +

- +

-  class CGroup

-  {

-      static char *s_memory_cgroup_path;

- @@ -34,8 +39,8 @@

-  public:

-      static void Initialize()

-      {

- -        s_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem);

- -        s_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem);

- +        s_memory_cgroup_path = FindCGroupPath(&IsCGroup1MemorySubsystem);

- +        s_cpu_cgroup_path = FindCGroupPath(&IsCGroup1CpuSubsystem);

-      }

-  

-      static void Cleanup()

- @@ -43,23 +48,24 @@

-          PAL_free(s_memory_cgroup_path);

-          PAL_free(s_cpu_cgroup_path);

-      }

- -    

- +

-      static bool GetPhysicalMemoryLimit(size_t *val)

-      {

- +        const char *files[] = {

- +            CGROUP1_MEMORY_LIMIT_FILENAME,

- +            CGROUP2_MEMORY_LIMIT_FILENAME

- +        };

- +

-          char *mem_limit_filename = nullptr;

-          bool result = false;

-  

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        size_t len = strlen(s_memory_cgroup_path);

- -        len += strlen(MEM_LIMIT_FILENAME);

- -        mem_limit_filename = (char*)PAL_malloc(len+1);

- +        mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

-          if (mem_limit_filename == nullptr)

-              return result;

-  

- -        strcpy_s(mem_limit_filename, len+1, s_memory_cgroup_path);

- -        strcat_s(mem_limit_filename, len+1, MEM_LIMIT_FILENAME);

-          result = ReadMemoryValueFromFile(mem_limit_filename, val);

-          PAL_free(mem_limit_filename);

-          return result;

- @@ -67,36 +73,172 @@

-  

-      static bool GetPhysicalMemoryUsage(size_t *val)

-      {

- +        const char *files[] = {

- +            CGROUP1_MEMORY_USAGE_FILENAME,

- +            CGROUP2_MEMORY_USAGE_FILENAME

- +        };

- +

-          char *mem_usage_filename = nullptr;

-          bool result = false;

-  

-          if (s_memory_cgroup_path == nullptr)

-              return result;

-  

- -        size_t len = strlen(s_memory_cgroup_path);

- -        len += strlen(MEM_USAGE_FILENAME);

- -        mem_usage_filename = (char*)malloc(len+1);

- +        mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files));

-          if (mem_usage_filename == nullptr)

-              return result;

-  

- -        strcpy(mem_usage_filename, s_memory_cgroup_path);

- -        strcat(mem_usage_filename, MEM_USAGE_FILENAME);

-          result = ReadMemoryValueFromFile(mem_usage_filename, val);

- -        free(mem_usage_filename);

- +        PAL_free(mem_usage_filename);

-          return result;

-      }

-  

-      static bool GetCpuLimit(UINT *val)

-      {

- +        if (GetCGroup1CpuLimit(val))

- +        {

- +            return true;

- +        }

- +

- +        if (GetCGroup2CpuLimit(val))

- +        {

- +            return true;

- +        }

- +

- +        return false;

- +    }

- +

- +private:

- +    static bool IsCGroup1MemorySubsystem(const char *strTok){

- +        return strcmp("memory", strTok) == 0;

- +    }

- +

- +    static bool IsCGroup1CpuSubsystem(const char *strTok){

- +        return strcmp("cpu", strTok) == 0;

- +    }

- +

- +    static bool GetCGroup2CpuLimit(UINT *val)

- +    {

- +        char *line = nullptr;

- +        char *filename = nullptr;

- +        FILE *file = nullptr;

- +        char *max_quota_string = nullptr;

- +        char *period_string = nullptr;

- +

- +        size_t lineLen = 0;

- +        int sscanRet = 0;

- +        long long max_quota = 0;

- +        long long period = 0;

- +        double cpu_count = 0;

- +

- +        bool result = false;

- +

- +        if (s_cpu_cgroup_path == nullptr)

- +        {

- +            return false;

- +        }

- +

- +        size_t filename_len = strlen(s_cpu_cgroup_path) + strlen(CGROUP2_CPU_MAX_FILENAME);

- +        filename = (char*)PAL_malloc(filename_len + 1);

- +        if (filename == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        strcpy_s(filename, filename_len + 1, s_cpu_cgroup_path);

- +        strcat_s(filename, filename_len + 1, CGROUP2_CPU_MAX_FILENAME);

- +

- +        file = fopen(filename, "r");

- +        if (file == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        if (getline(&line, &lineLen, file) == -1)

- +        {

- +            goto done;

- +        }

- +

- +        // The expected format is:

- +        //     $MAX $PERIOD

- +        // Where "$MAX" may be the string literal "max"

- +

- +        max_quota_string = (char*)PAL_malloc(lineLen + 1);

- +        if (max_quota_string == nullptr)

- +        {

- +            goto done;

- +        }

- +        period_string = (char*)PAL_malloc(lineLen + 1);

- +        if (period_string == nullptr)

- +        {

- +            goto done;

- +        }

- +

- +        sscanRet = sscanf_s(line, "%s %s",

- +                            max_quota_string, lineLen + 1,

- +                            period_string, lineLen + 1);

- +        if (sscanRet != 2)

- +        {

- +            _ASSERTE(!"Unable to parse " CGROUP2_CPU_MAX_FILENAME " file contents with sscanf_s.");

- +            goto done;

- +        }

- +

- +        // "max" means no cpu limit

- +        if (strncmp("max", max_quota_string, lineLen + 1) == 0)

- +        {

- +            goto done;

- +        }

- +

- +        errno = 0;

- +        max_quota = atoll(max_quota_string);

- +        if (errno != 0)

- +        {

- +            goto done;

- +        }

- +

- +        errno = 0;

- +        period = atoll(period_string);

- +        if (errno != 0)

- +        {

- +            goto done;

- +        }

- +

- +        // Cannot have less than 1 CPU

- +        if (max_quota <= period)

- +        {

- +            result = true;

- +            *val = 1;

- +            goto done;

- +        }

- +

- +        // Calculate cpu count based on quota and round it up

- +        cpu_count = (double) max_quota / period  + 0.999999999;

- +        *val = (cpu_count < UINT_MAX) ? (UINT)cpu_count : UINT_MAX;

- +

- +        result = true;

- +

- +    done:

- +        if (file)

- +            fclose(file);

- +        PAL_free(filename);

- +        PAL_free(line);

- +        PAL_free(max_quota_string);

- +        PAL_free(period_string);

- +

- +        return result;

- +    }

- +

- +    static bool GetCGroup1CpuLimit(UINT *val)

- +    {

-          long long quota;

-          long long period;

-          double cpu_count;

-  

- -        quota = ReadCpuCGroupValue(CFS_QUOTA_FILENAME);

- +        quota = ReadCpuCGroupValue(CGROUP1_CFS_QUOTA_FILENAME);

-          if (quota <= 0)

-              return false;

-  

- -        period = ReadCpuCGroupValue(CFS_PERIOD_FILENAME);

- +        period = ReadCpuCGroupValue(CGROUP1_CFS_PERIOD_FILENAME);

-          if (period <= 0)

-              return false;

-  

- @@ -114,27 +256,19 @@

-          return true;

-      }

-  

- -private:

- -    static bool IsMemorySubsystem(const char *strTok){

- -        return strcmp("memory", strTok) == 0;

- -    }

- -

- -    static bool IsCpuSubsystem(const char *strTok){

- -        return strcmp("cpu", strTok) == 0;

- -    }

- -

- -    static char* FindCgroupPath(bool (*is_subsystem)(const char *)){

- +    static char* FindCGroupPath(bool (*is_subsystem)(const char *)){

-          char *cgroup_path = nullptr;

-          char *hierarchy_mount = nullptr;

-          char *hierarchy_root = nullptr;

-          char *cgroup_path_relative_to_mount = nullptr;

- +        bool is_cgroupv2 = false;

-          size_t len;

-  

- -        FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root);

- +        FindHierarchyMount(is_subsystem, &is_cgroupv2, &hierarchy_mount, &hierarchy_root);

-          if (hierarchy_mount == nullptr || hierarchy_root == nullptr)

-              goto done;

-  

- -        cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem);

- +        cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_cgroupv2, is_subsystem);

-          if (cgroup_path_relative_to_mount == nullptr)

-              goto done;

-  

- @@ -157,7 +291,7 @@

-          return cgroup_path;

-      }

-  

- -    static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot)

- +    static void FindHierarchyMount(bool (*is_subsystem)(const char *), bool* is_cgroupv2, char** pmountpath, char** pmountroot)

-      {

-          char *line = nullptr;

-          size_t lineLen = 0, maxLineLen = 0;

- @@ -199,11 +333,15 @@

-  

-              if (strncmp(filesystemType, "cgroup", 6) == 0)

-              {

- +                if (strncmp(filesystemType, "cgroup2", 8) == 0)

- +                {

- +                    *is_cgroupv2 = true;

- +                }

-                  char* context = nullptr;

-                  char* strTok = strtok_s(options, ",", &context); 

-                  while (strTok != nullptr)

-                  {

- -                    if (is_subsystem(strTok))

- +                    if (*is_cgroupv2 || is_subsystem(strTok))

-                      {

-                          mountpath = (char*)PAL_malloc(lineLen+1);

-                          if (mountpath == nullptr)

- @@ -239,7 +377,7 @@

-              fclose(mountinfofile);

-      }

-  

- -    static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *))

- +    static char* FindCGroupPathForSubsystem(bool is_cgroupv2, bool (*is_subsystem)(const char *))

-      {

-          char *line = nullptr;

-          size_t lineLen = 0;

- @@ -267,27 +405,42 @@

-                  maxLineLen = lineLen;

-              }

-  

- -            // See man page of proc to get format for /proc/self/cgroup file

- -            int sscanfRet = sscanf_s(line, 

- -                                     "%*[^:]:%[^:]:%s",

- -                                     subsystem_list, lineLen+1,

- -                                     cgroup_path, lineLen+1);

- -            if (sscanfRet != 2)

- +            if (is_cgroupv2)

-              {

- -                _ASSERTE(!"Failed to parse cgroup info file contents with sscanf_s.");

- -                goto done;

- +                // See https://www.kernel.org/doc/Documentation/cgroup-v2.txt

- +                // Look for "0::/some/path"

- +                int sscanfRet = sscanf_s(line,

- +                                         "0::%s",

- +                                         cgroup_path, lineLen+1);

- +                if (sscanfRet == 1)

- +                {

- +                    result = true;

- +                }

-              }

- -

- -            char* context = nullptr;

- -            char* strTok = strtok_s(subsystem_list, ",", &context); 

- -            while (strTok != nullptr)

- +            else

-              {

- -                if (is_subsystem(strTok))

- +                // See man page of proc to get format for /proc/self/cgroup file

- +                int sscanfRet = sscanf_s(line,

- +                                        "%*[^:]:%[^:]:%s",

- +                                        subsystem_list, lineLen+1,

- +                                        cgroup_path, lineLen+1);

- +                if (sscanfRet != 2)

-                  {

- -                    result = true;

- -                    break;  

- +                    _ASSERTE(!"Failed to parse cgroup info file contents with sscanf_s.");

- +                    goto done;

- +                }

- +

- +                char* context = nullptr;

- +                char* strTok = strtok_s(subsystem_list, ",", &context);

- +                while (strTok != nullptr)

- +                {

- +                    if (is_subsystem(strTok))

- +                    {

- +                        result = true;

- +                        break;

- +                    }

- +                    strTok = strtok_s(nullptr, ",", &context);

-                  }

- -                strTok = strtok_s(nullptr, ",", &context);

-              }

-          }

-      done:

- @@ -303,6 +456,36 @@

-          return cgroup_path;

-      }

-  

- +    static char* SearchForFile(char* search_root, const char* possible_files[], size_t possible_files_len)

- +    {

- +        if (search_root == nullptr)

- +        {

- +            return nullptr;

- +        }

- +

- +        for (size_t i = 0; i < possible_files_len; i++)

- +        {

- +            const char* possible_file = possible_files[i];

- +            size_t len = strlen(search_root);

- +            len += strlen(possible_file);

- +            char* full_filename = (char*)PAL_malloc(len+1);

- +            if (full_filename == nullptr)

- +            {

- +                return nullptr;

- +            }

- +            strcpy_s(full_filename, len+1, search_root);

- +            strcat_s(full_filename, len+1, possible_file);

- +            if (access(full_filename, R_OK) != -1)

- +            {

- +                return full_filename;

- +            }

- +

- +            PAL_free(full_filename);

- +        }

- +

- +        return nullptr;

- +    }

- +

-      static bool ReadMemoryValueFromFile(const char* filename, size_t* val)

-      {

-          return ::ReadMemoryValueFromFile(filename, val);

- -- 

- 2.23.0

file modified
+110 -34
@@ -1,3 +1,5 @@ 

+ %bcond_without bootstrap

+ 

  # Avoid provides/requires from private libraries

  %global privlibs             libhostfxr

  %global privlibs %{privlibs}|libclrjit
@@ -23,16 +25,16 @@ 

  %endif

  %global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g')

  

- %global host_version 3.1.0-preview1.19506.1

- %global runtime_version 3.1.0-preview1.19506.1

- %global aspnetcore_runtime_version 3.1.0-preview1.19508.20

- %global sdk_version 3.1.100-preview1-014459

- %global templates_version 3.1.0-preview1-014459

+ %global host_version 3.1.1

+ %global runtime_version 3.1.1

+ %global aspnetcore_runtime_version %{runtime_version}

+ %global sdk_version 3.1.101

+ %global templates_version %{runtime_version}

  

- %global host_rpm_version 3.1.0

- %global aspnetcore_runtime_rpm_version 3.1.0

- %global runtime_rpm_version 3.1.0

- %global sdk_rpm_version 3.1.100

+ %global host_rpm_version %{host_version}

+ %global aspnetcore_runtime_rpm_version %{aspnetcore_runtime_version}

+ %global runtime_rpm_version %{runtime_version}

+ %global sdk_rpm_version %{sdk_version}

  

  %if 0%{?fedora} || 0%{?rhel} < 8

  %global use_bundled_libunwind 0
@@ -40,21 +42,28 @@ 

  %global use_bundled_libunwind 1

  %endif

  

+ %ifarch x86_64

+ %global runtime_arch x64

+ %endif

+ %ifarch aarch64

+ %global runtime_arch arm64

+ %endif

+ 

  %if 0%{?fedora}

- %global runtime_id fedora.%{fedora}-x64

+ %global runtime_id fedora.%{fedora}-%{runtime_arch}

  %else

  %if 0%{?centos}

- %global runtime_id centos.%{centos}-x64

+ %global runtime_id centos.%{centos}-%{runtime_arch}

  %else

- %global runtime_id rhel.%{rhel}-x64

+ %global runtime_id rhel.%{rhel}-%{runtime_arch}

  %endif

  %endif

  

  Name:           dotnet3.1

  Version:        %{sdk_rpm_version}

- Release:        0.1%{?dist}

- Summary:        .NET Core CLI tools and runtime

- License:        MIT and ASL 2.0 and BSD

+ Release:        1%{?dist}

+ Summary:        .NET Core Runtime and SDK

+ License:        MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib

  URL:            https://github.com/dotnet/

  

  # The source is generated on a Fedora box via:
@@ -70,11 +79,8 @@ 

  

  Patch200:       coreclr-27048-sysctl-deprecation.patch

  Patch201:       coreclr-hardening-flags.patch

- Patch202:       coreclr-cgroupv2.patch

- Patch203:       coreclr-cgroupv2-02.patch

  

- Patch300:       core-setup-do-not-strip.patch

- Patch301:       core-setup-hardening-flags.patch

+ Patch300:       core-setup-hardening-flags.patch

  

  Patch500:       cli-telemetry-optout.patch

  
@@ -83,6 +89,11 @@ 

  BuildRequires:  clang

  BuildRequires:  cmake

  BuildRequires:  coreutils

+ %if %{without bootstrap}

+ BuildRequires:  dotnet-build-reference-packages

+ BuildRequires:  dotnet-sdk-3.1

+ BuildRequires:  dotnet-sdk-3.1-source-built-artifacts

+ %endif

  BuildRequires:  git

  %if 0%{?fedora} || 0%{?rhel} > 7

  BuildRequires:  glibc-langpack-en
@@ -97,6 +108,7 @@ 

  BuildRequires:  lldb-devel

  BuildRequires:  llvm

  BuildRequires:  lttng-ust-devel

+ BuildRequires:  make

  BuildRequires:  openssl-devel

  BuildRequires:  python3

  BuildRequires:  tar
@@ -177,7 +189,7 @@ 

  Requires:       dotnet-hostfxr-3.1%{?_isa} >= %{host_rpm_version}-%{release}

  

  # libicu is dlopen()ed

- Requires:       libicu

+ Requires:       libicu%{?_isa}

  

  %if %{use_bundled_libunwind}

  Provides: bundled(libunwind) = 1.3
@@ -238,6 +250,9 @@ 

  Version:        %{sdk_rpm_version}

  Summary:        .NET Core 3.1 Software Development Kit

  

+ Provides:       bundled(js-jquery)

+ Provides:       bundled(npm)

+ 

  Requires:       dotnet-runtime-3.1%{?_isa} >= %{runtime_rpm_version}-%{release}

  Requires:       aspnetcore-runtime-3.1%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release}

  
@@ -259,16 +274,16 @@ 

  applications and micro-services.

  

  

- %define dotnet_targeting_pack() %{expand:

+ %global dotnet_targeting_pack() %{expand:

  %package -n %{1}

  

  Version:        %{2}

  Summary:        Targeting Pack for %{3} %{4}

  

- Requires:       dotnet-host

+ Requires:       dotnet-host%{?_isa}

  

  %description -n %{1}

- This package provides a targetting pack for %{3} %{4}

+ This package provides a targeting pack for %{3} %{4}

  that allows developers to compile against and target %{3} %{4}

  applications using the .NET Core SDK.

  
@@ -283,11 +298,41 @@ 

  %dotnet_targeting_pack netstandard-targeting-pack-2.1 %{sdk_rpm_version} NETStandard.Library 2.1 NETStandard.Library.Ref

  

  

+ %package -n dotnet-sdk-3.1-source-built-artifacts

+ 

+ Version:        %{sdk_rpm_version}

+ Summary:        Internal package for building .NET Core 3.1 Software Development Kit

+ 

+ %description -n dotnet-sdk-3.1-source-built-artifacts

+ The .NET Core source-built archive is a collection of packages needed

+ to build the .NET Core SDK itself.

+ 

+ These are not meant for general use.

+ 

+ 

  %prep

  %setup -q -n dotnet-v%{sdk_version}-SDK

  

+ %if %{without bootstrap}

+ # Remove all prebuilts

+ find -iname '*.dll' -type f -delete

+ find -iname '*.so' -type f -delete

+ find -iname '*.tar.gz' -type f -delete

+ find -iname '*.nupkg' -type f -delete

+ find -iname '*.zip' -type f -delete

+ rm -r .dotnet/

+ rm -r packages/source-built

+ %endif

+ 

+ %if %{without bootstrap}

+ sed -i -e 's|3.1.100-preview1-014459|3.1.101|' global.json

+ mkdir -p packages/archive

+ ln -s %{_libdir}/dotnet/source-built-artifacts/*.tar.gz packages/archive/

+ ln -s %{_libdir}/dotnet/reference-packages/Private.SourceBuild.ReferencePackages*.tar.gz packages/archive

+ %endif

+ 

  # Fix bad hardcoded path in build

- sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/core-setup.*/src/corehost/common/pal.unix.cpp

+ sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/dotnet-core-setup.*/src/corehost/common/pal.unix.cpp

  

  # Disable warnings

  sed -i 's|skiptests|skiptests ignorewarnings|' repos/coreclr.proj
@@ -302,16 +347,13 @@ 

  pushd src/coreclr.*

  %patch200 -p1

  %patch201 -p1

- %patch202 -p1

- %patch203 -p1

  popd

  

- pushd src/core-setup.*

+ pushd src/dotnet-core-setup.*

  %patch300 -p1

- %patch301 -p1

  popd

  

- pushd src/cli.*

+ pushd src/dotnet-cli.*

  %patch500 -p1

  popd

  
@@ -331,6 +373,10 @@ 

  %build

  cat /etc/os-release

  

+ %if %{without bootstrap}

+ cp -a %{_libdir}/dotnet .dotnet

+ %endif

+ 

  export CFLAGS="%{dotnet_cflags}"

  export CXXFLAGS="%{dotnet_cflags}"

  export LDFLAGS="%{dotnet_ldflags}"
@@ -347,11 +393,11 @@ 

  

  %install

  install -dm 0755 %{buildroot}%{_libdir}/dotnet

- ls bin/x64/Release

- tar xf bin/x64/Release/dotnet-sdk-%{sdk_version}-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/

+ ls bin/%{runtime_arch}/Release

+ tar xf bin/%{runtime_arch}/Release/dotnet-sdk-%{sdk_version}-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/

  

  # Install managed symbols

- tar xf bin/x64/Release/runtime/dotnet-runtime-symbols-%{runtime_version}-%{runtime_id}.tar.gz \

+ tar xf bin/%{runtime_arch}/Release/runtime/dotnet-runtime-symbols-%{runtime_version}-%{runtime_id}.tar.gz \

      -C %{buildroot}/%{_libdir}/dotnet/shared/Microsoft.NETCore.App/%{runtime_version}/

  

  # Fix executable permissions on files
@@ -360,13 +406,19 @@ 

  find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.props' -exec chmod -x {} \;

  find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.pubxml' -exec chmod -x {} \;

  find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.targets' -exec chmod -x {} \;

+ chmod 0755 %{buildroot}/%{_libdir}/dotnet/sdk/%{sdk_version}/AppHostTemplate/apphost

+ chmod 0755 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/libnethost.so

+ chmod 0755 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/apphost

+ chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/nethost.h

+ chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Ref/3.1.0/obj/Microsoft.AspNetCore.App.Ref.csproj.nuget.cache

+ chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Ref/3.1.0/Microsoft.AspNetCore.App.Ref/3.1.0/Debug/netstandard2.0/Microsoft.AspNetCore.App.Ref.assets.cache

  

  install -dm 0755 %{buildroot}%{_sysconfdir}/profile.d/

  install dotnet.sh %{buildroot}%{_sysconfdir}/profile.d/

  

  install -dm 0755 %{buildroot}/%{_datadir}/bash-completion/completions

  # dynamic completion needs the file to be named the same as the base command

- install src/cli.*/scripts/register-completions.bash %{buildroot}/%{_datadir}/bash-completion/completions/dotnet

+ install src/dotnet-cli.*/scripts/register-completions.bash %{buildroot}/%{_datadir}/bash-completion/completions/dotnet

  

  # TODO: the zsh completion script needs to be ported to use #compdef

  #install -dm 755 %%{buildroot}/%%{_datadir}/zsh/site-functions
@@ -382,6 +434,9 @@ 

  install -dm 0755 %{buildroot}%{_sysconfdir}/dotnet

  install install_location %{buildroot}%{_sysconfdir}/dotnet/

  

+ install -dm 0755 %{buildroot}%{_libdir}/dotnet/source-built-artifacts

+ install bin/%{runtime_arch}/Release/Private.SourceBuilt.Artifacts.*.tar.gz %{buildroot}/%{_libdir}/dotnet/source-built-artifacts/

+ 

  # Check debug symbols in all elf objects. This is not in %%check

  # because native binaries are stripped by rpm-build after %%install.

  # So we need to do this check earlier.
@@ -434,7 +489,28 @@ 

  %{_libdir}/dotnet/sdk/%{sdk_version}

  %dir %{_libdir}/dotnet/packs

  

+ %files -n dotnet-sdk-3.1-source-built-artifacts

+ %dir %{_libdir}/dotnet

+ %{_libdir}/dotnet/source-built-artifacts

+ 

+ 

  %changelog

+ * Tue Jan 21 2020 Omair Majid <omajid@redhat.com> - 3.1.101-1

+ - Update to .NET Core Runtime 3.1.1 and SDK 3.1.101

+ 

+ * Thu Dec 05 2019 Omair Majid <omajid@redhat.com> - 3.1.100-1

+ - Update to .NET Core Runtime 3.1.0 and SDK 3.1.100

+ 

+ * Mon Nov 18 2019 Omair Majid <omajid@redhat.com> - 3.1.100-0.4.preview3

+ - Fix apphost permissions

+ 

+ * Fri Nov 15 2019 Omair Majid <omajid@redhat.com> - 3.1.100-0.3.preview3

+ - Update to .NET Core Runtime 3.1.0-preview3.19553.2 and SDK

+   3.1.100-preview3-014645

+ 

+ * Wed Nov 06 2019 Omair Majid <omajid@redhat.com> - 3.1.100-0.2

+ - Update to .NET Core 3.1 Preview 2

+ 

  * Wed Oct 30 2019 Omair Majid <omajid@redhat.com> - 3.1.100-0.1

  - Update to .NET Core 3.1 Preview 1

  
@@ -483,7 +559,7 @@ 

  * Wed Jun 26 2019 Omair Majid <omajid@redhat.com> - 3.0.0-0.6.preview6

  - Update to .NET Core Runtime 3.0.0-preview6-27804-01 and SDK 3.0.100-preview6-012264

  - Set dotnet installation location in /etc/dotnet/install_location

- - Update targetting packs

+ - Update targeting packs

  - Install managed symbols

  - Completely conditionalize libunwind bundling

  

file modified
+5 -9
@@ -26,7 +26,7 @@ 

      esac

  done

  

- spec_file=dotnet3.0.spec

+ spec_file=dotnet3.1.spec

  

  runtime_version=${positional_args[0]:-}

  if [[ -z ${runtime_version} ]]; then
@@ -41,18 +41,14 @@ 

      exit 1

  fi

  

- if [[ ! -f "dotnet-v${runtime_version}.tar.gz" ]] && [[ -f "dotnet-${runtime_version}.tar.gz" ]]; then

-     ./rename-tarball "dotnet-${runtime_version}.tar.gz" "dotnet-v${runtime_version}.tar.gz"

- fi

- 

- if [[ ! -f "dotnet-v${runtime_version}.tar.gz" ]]; then

-     ./build-dotnet-tarball "v${runtime_version}"

+ if [[ ! -f "dotnet-v${sdk_version}-SDK.tar.gz" ]]; then

+     ./build-dotnet-tarball "v${sdk_version}-SDK"

  fi

  

  set -x

  

- sed -i -E "s|^%global host_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]|%global host_version ${host_version}|" "$spec_file"

- sed -i -E "s|^%global runtime_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]|%global runtime_version ${runtime_version}|" "$spec_file"

+ sed -i -E "s|^%global host_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]+|%global host_version ${host_version}|" "$spec_file"

+ sed -i -E "s|^%global runtime_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]+|%global runtime_version ${runtime_version}|" "$spec_file"

  sed -i -E "s|^%global sdk_version [[:digit:]]\.[[:digit:]]\.[[:digit:]][[:digit:]][[:digit:]]|%global sdk_version ${sdk_version}|" "$spec_file"

  

  comment="Update to .NET Core Runtime ${runtime_version} and SDK ${sdk_version}"

Build: https://copr.fedorainfracloud.org/coprs/g/dotnet-sig/dotnet-preview/build/1095760/

There is an unfortunate issue with the "source" tarball only working on the platform it was generated on :( Since it built it on Fedora 31, that works, but everything else fails.

1 new commit added

  • Fix apphost permissions
4 years ago

rebased onto 734f83f

4 years ago

5 new commits added

  • Remove strip patch
  • Fix spelling mistake
  • Add BuildRequires on dotnet/source-build-reference-packages
  • Improve package
  • Update to .NET Core SDK 3.1.101 and Runtime 3.1.1
4 years ago

Pull-Request has been closed by omajid

a year ago