Build mscorlib with CoreCLR MSBuild on Linux
authorJohn Chen <jochen@microsoft.com>
Sat, 9 Jan 2016 00:14:24 +0000 (16:14 -0800)
committerJohn Chen <jochen@microsoft.com>
Sun, 24 Jan 2016 06:12:12 +0000 (22:12 -0800)
.gitignore
BuildToolsVersion.txt [new file with mode: 0644]
DotnetCLIVersion.txt [new file with mode: 0644]
build.sh
dir.props
init-tools.sh [new file with mode: 0755]
src/mscorlib/Tools/PostProcessingTools.targets
src/mscorlib/mscorlib.csproj

index 3d5b266..8b34a47 100644 (file)
@@ -2,6 +2,9 @@ syntax: glob
 
 [Bb]inaries/
 
+# Build tools related files
+[Tt]ools/
+
 ### VisualStudio ###
 
 # User-specific files
diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt
new file mode 100644 (file)
index 0000000..b0667ae
--- /dev/null
@@ -0,0 +1 @@
+1.0.25-prerelease-00157
diff --git a/DotnetCLIVersion.txt b/DotnetCLIVersion.txt
new file mode 100644 (file)
index 0000000..8e793ae
--- /dev/null
@@ -0,0 +1 @@
+1.0.0.000973
\ No newline at end of file
index b1a98ab..05072c5 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -200,7 +200,8 @@ build_mscorlib()
     # Grab the MSBuild package if we don't have it already
     if [ ! -e "$__MSBuildPath" ]; then
         echo "Restoring MSBuild..."
-        mono "$__NuGetPath" install $__MSBuildPackageId -Version $__MSBuildPackageVersion -source "https://www.myget.org/F/dotnet-buildtools/" -OutputDirectory "$__PackagesDir"
+        cd $__ProjectRoot
+        sh ./init-tools.sh
         if [ $? -ne 0 ]; then
             echo "Failed to restore MSBuild."
             exit 1
@@ -221,12 +222,21 @@ build_mscorlib()
     esac
 
     # Invoke MSBuild
-    mono "$__MSBuildPath" /nologo "$__ProjectRoot/build.proj" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/MSCorLib_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:UseRoslynCompiler=true /p:BuildNugetPackage=false /p:ToolNugetRuntimeId=$_ToolNugetRuntimeId
+    $__ProjectRoot/Tools/corerun "$__MSBuildPath" /nologo "$__ProjectRoot/build.proj" /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__LogsDir/MSCorLib_$__BuildOS__$__BuildArch__$__BuildType.log" /t:Build /p:__BuildOS=$__BuildOS /p:__BuildArch=$__BuildArch /p:__BuildType=$__BuildType /p:__IntermediatesDir=$__IntermediatesDir /p:UseRoslynCompiler=true /p:BuildNugetPackage=false /p:ToolNugetRuntimeId=$_ToolNugetRuntimeId /p:UseSharedCompilation=false
 
     if [ $? -ne 0 ]; then
         echo "Failed to build mscorlib."
         exit 1
     fi
+
+    if [ $__SkipCoreCLR == 0 ]; then
+        echo "Generating native image for mscorlib."
+        $__BinDir/crossgen $__BinDir/mscorlib.dll
+        if [ $? -ne 0 ]; then
+            echo "Failed to generate native image for mscorlib."
+            exit 1
+        fi
+    fi
 }
 
 echo "Commencing CoreCLR Repo build"
@@ -329,9 +339,7 @@ __VerboseBuild=0
 __CrossBuild=0
 __ClangMajorVersion=3
 __ClangMinorVersion=5
-__MSBuildPackageId="Microsoft.Build.Mono.Debug"
-__MSBuildPackageVersion="14.1.0.0-prerelease"
-__MSBuildPath="$__PackagesDir/$__MSBuildPackageId.$__MSBuildPackageVersion/lib/MSBuild.exe"
+__MSBuildPath=$__ProjectRoot/Tools/MSBuild.exe
 __NuGetPath="$__PackagesDir/NuGet.exe"
 
 for i in "$@"
index b21f754..fbbb49a 100644 (file)
--- a/dir.props
+++ b/dir.props
@@ -4,6 +4,7 @@
     $(OS) is set to Unix/Windows_NT. This comes from an environment variable on Windows and MSBuild on Unix.
   -->
   <PropertyGroup>
+    <OsEnvironment Condition="'$(OsEnvironment)'=='' and '$(OS)'=='OSX'">Unix</OsEnvironment>
     <OsEnvironment Condition="'$(OsEnvironment)'==''">$(OS)</OsEnvironment>
   </PropertyGroup>
   
diff --git a/init-tools.sh b/init-tools.sh
new file mode 100755 (executable)
index 0000000..79e1042
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+__scriptpath=$(cd "$(dirname "$0")"; pwd -P)
+__PACKAGES_DIR=$__scriptpath/packages
+__TOOLRUNTIME_DIR=$__scriptpath/Tools
+__DOTNET_PATH=$__TOOLRUNTIME_DIR/dotnetcli
+__DOTNET_CMD=$__DOTNET_PATH/bin/dotnet
+if [ -z "$__BUILDTOOLS_SOURCE" ]; then __BUILDTOOLS_SOURCE=https://www.myget.org/F/dotnet-buildtools/; fi
+__BUILD_TOOLS_PACKAGE_VERSION=$(cat BuildToolsVersion.txt)
+__DOTNET_TOOLS_VERSION=$(cat DotnetCLIVersion.txt)
+__BUILD_TOOLS_PATH=$__PACKAGES_DIR/Microsoft.DotNet.BuildTools/$__BUILD_TOOLS_PACKAGE_VERSION/lib
+__PROJECT_JSON_PATH=$__TOOLRUNTIME_DIR/$__BUILD_TOOLS_PACKAGE_VERSION
+__PROJECT_JSON_FILE=$__PROJECT_JSON_PATH/project.json
+__PROJECT_JSON_CONTENTS="{ \"dependencies\": { \"Microsoft.DotNet.BuildTools\": \"$__BUILD_TOOLS_PACKAGE_VERSION\" }, \"frameworks\": { \"dnxcore50\": { } } }"
+
+OSName=$(uname -s)
+case $OSName in
+    Darwin)
+        OS=OSX
+        __DOTNET_PKG=dotnet-osx-x64
+        ;;
+
+    Linux)
+        OS=Linux
+        __DOTNET_PKG=dotnet-ubuntu-x64
+        ;;
+
+    *)
+        echo "Unsupported OS $OSName detected. Downloading ubuntu-x64 tools"
+        OS=Linux
+        __DOTNET_PKG=dotnet-ubuntu-x64
+        ;;
+esac
+
+if [ ! -e $__PROJECT_JSON_FILE ]; then
+ if [ -e $__TOOLRUNTIME_DIR ]; then rm -rf -- $__TOOLRUNTIME_DIR; fi
+
+ if [ ! -e $__DOTNET_PATH ]; then
+    # curl has HTTPS CA trust-issues less often than wget, so lets try that first.
+    which curl > /dev/null 2> /dev/null
+    if [ $? -ne 0 ]; then
+      mkdir -p "$__DOTNET_PATH"
+      wget -q -O $__DOTNET_PATH/dotnet.tar https://dotnetcli.blob.core.windows.net/dotnet/dev/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz
+    else
+      curl -sSL --create-dirs -o $__DOTNET_PATH/dotnet.tar https://dotnetcli.blob.core.windows.net/dotnet/dev/Binaries/${__DOTNET_TOOLS_VERSION}/${__DOTNET_PKG}.${__DOTNET_TOOLS_VERSION}.tar.gz
+    fi
+    cd $__DOTNET_PATH
+    tar -xf $__DOTNET_PATH/dotnet.tar
+    if [ -n "$BUILDTOOLS_OVERRIDE_RUNTIME" ]; then
+        find $__DOTNET_PATH -name *.ni.* | xargs rm 2>/dev/null
+        cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin
+        cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/bin/dnx
+        cp -R $BUILDTOOLS_OVERRIDE_RUNTIME/* $__DOTNET_PATH/runtime/coreclr
+    fi
+
+    cd $__scriptpath
+ fi
+
+ mkdir "$__PROJECT_JSON_PATH"
+ echo $__PROJECT_JSON_CONTENTS > "$__PROJECT_JSON_FILE"
+
+ if [ ! -e $__BUILD_TOOLS_PATH ]; then
+    $__DOTNET_CMD restore "$__PROJECT_JSON_FILE" --packages $__PACKAGES_DIR --source $__BUILDTOOLS_SOURCE
+ fi
+
+ sh $__BUILD_TOOLS_PATH/init-tools.sh $__scriptpath $__DOTNET_CMD $__TOOLRUNTIME_DIR
+ chmod a+x $__TOOLRUNTIME_DIR/corerun
+fi
index 2574db5..2f48efc 100644 (file)
@@ -21,7 +21,7 @@
     
     <!-- Copy to the final output location -->
     <Copy Retries="3" SourceFiles="@(RewrittenAssembly)" DestinationFiles="$(FinalOutputPath)\%(RewrittenAssembly.FileName)%(RewrittenAssembly.Extension)"/>
-    <Message Importance="High" Text="$(MSBuildProjectName) -&gt; $(FinalOutputPath)\%(RewrittenAssembly.FileName)%(RewrittenAssembly.Extension)" />
+    <Message Importance="High" Text="$(MSBuildProjectName) -&gt; $(FinalOutputPath)%(RewrittenAssembly.FileName)%(RewrittenAssembly.Extension)" />
     <Copy Condition="Exists('$(CurrentAssemblyPdb)')" Retries="3" SourceFiles="$(CurrentAssemblyPdb)" DestinationFiles="$(FinalOutputPath)\$(TargetName).pdb"/>
   </Target>
 
index ea53e97..8a1c0b4 100644 (file)
     </EmbeddedResource>
   </ItemGroup>
 
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.Targets" />
 
   <!-- Import signing tools -->
   <Import Condition="Exists('$(ToolsDir)\sign.targets')" Project="$(ToolsDir)\sign.targets" />