diff options
author | dotnet-bot <dotnet-bot@microsoft.com> | 2015-09-17 07:52:11 +0300 |
---|---|---|
committer | Sergiy Kuryata <sergeyk@microsoft.com> | 2015-09-17 07:52:11 +0300 |
commit | 2fce1fbf826004e14f82cdc384cbaae2ba947897 (patch) | |
tree | d9270ee6475ea5691ca1bbf17a37ba39408e23c4 /build.sh | |
parent | 65eeb22c09442ebc4067921ddc563a702ea029bc (diff) |
Add basic build scripts
Files under src/Native have been copied from
https://github.com/dotnet/corefx/tree/master/src/Native
The root build.sh file has been copied from
https://github.com/dotnet/corefx
Commit label in the corefx repo: dbb131dcafe570fd93824820797c88eb35609fc7
Note:
- Some minor cleanup has been done build.sh, src/Native/CMakeLists.txt
and src/Native/configure.cmake: renamed corefx -> corert, removed
corefx specific parts
- No code builds yet with this change
Diffstat (limited to 'build.sh')
-rw-r--r-- | build.sh | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/build.sh b/build.sh new file mode 100644 index 000000000..71bd808ee --- /dev/null +++ b/build.sh @@ -0,0 +1,340 @@ +#!/usr/bin/env bash + +usage() +{ + echo "Usage: $0 [managed] [native] [BuildArch] [BuildType] [clean] [verbose] [clangx.y]" + echo "managed - optional argument to build the managed code" + echo "native - optional argument to build the native code" + echo "The following arguments affect native builds only:" + echo "BuildArch can be: x64, arm" + echo "BuildType can be: Debug, Release" + echo "clean - optional argument to force a clean build." + echo "verbose - optional argument to enable verbose build output." + echo "clangx.y - optional argument to build using clang version x.y." + + exit 1 +} + +setup_dirs() +{ + echo Setting up directories for build + + mkdir -p "$__BinDir" + mkdir -p "$__IntermediatesDir" +} + +# Performs "clean build" type actions (deleting and remaking directories) + +clean() +{ + echo "Cleaning previous output for the selected configuration" + rm -rf "$__BinDir" + rm -rf "$__IntermediatesDir" +} + +# Check the system to ensure the right pre-reqs are in place + +check_managed_prereqs() +{ + __monoversion=$(mono --version | grep "version 4.[1-9]") + + if [ $? -ne 0 ]; then + # if built from tarball, mono only identifies itself as 4.0.1 + __monoversion=$(mono --version | egrep "version 4.0.[1-9]+(.[0-9]+)?") + if [ $? -ne 0 ]; then + echo "Mono 4.0.1.44 or later is required to build corert." + exit 1 + else + echo "WARNING: Mono 4.0.1.44 or later is required to build corert. Unable to assess if current version is supported." + fi + fi +} + +check_native_prereqs() +{ + echo "Checking pre-requisites..." + + # Check presence of CMake on the path + hash cmake 2>/dev/null || { echo >&2 "Please install cmake before running this script"; exit 1; } + + # Check for clang + hash clang-$__ClangMajorVersion.$__ClangMinorVersion 2>/dev/null || hash clang$__ClangMajorVersion$__ClangMinorVersion 2>/dev/null || hash clang 2>/dev/null || { echo >&2 "Please install clang before running this script"; exit 1; } +} + +# Prepare the system for building + +prepare_managed_build() +{ + # Pull NuGet.exe down if we don't have it already + if [ ! -e "$__nugetpath" ]; then + which curl wget > /dev/null 2> /dev/null + if [ $? -ne 0 -a $? -ne 1 ]; then + echo "cURL or wget is required to build corert." + exit 1 + fi + echo "Restoring NuGet.exe..." + + # 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 $__packageroot + wget -q -O $__nugetpath https://api.nuget.org/downloads/nuget.exe + else + curl -sSL --create-dirs -o $__nugetpath https://api.nuget.org/downloads/nuget.exe + fi + + if [ $? -ne 0 ]; then + echo "Failed to restore NuGet.exe." + exit 1 + fi + fi + + # 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 "$__packageroot" + if [ $? -ne 0 ]; then + echo "Failed to restore MSBuild." + exit 1 + fi + fi +} + +prepare_native_build() +{ + # Specify path to be set for CMAKE_INSTALL_PREFIX. + # This is where all built CoreClr libraries will copied to. + export __CMakeBinDir="$__BinDir" + + # Configure environment if we are doing a clean build. + if [ $__CleanBuild == 1 ]; then + clean + fi + + # Configure environment if we are doing a verbose build + if [ $__VerboseBuild == 1 ]; then + export VERBOSE=1 + fi +} + +build_managed_corert() +{ + __buildproj=$__scriptpath/build.proj + __buildlog=$__scriptpath/msbuild.log + + MONO29679=1 ReferenceAssemblyRoot=$__referenceassemblyroot mono $__msbuildpath "$__buildproj" /nologo /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__buildlog" /t:Build /p:OSGroup=$__BuildOS /p:UseRoslynCompiler=true /p:COMPUTERNAME=$(hostname) /p:USERNAME=$(id -un) "$@" + BUILDERRORLEVEL=$? + + echo + + # Pull the build summary from the log file + tail -n 4 "$__buildlog" + echo Build Exit Code = $BUILDERRORLEVEL +} + +build_native_corert() +{ + # All set to commence the build + + echo "Commencing build of corert native components for $__BuildOS.$__BuildArch.$__BuildType" + cd "$__IntermediatesDir" + + # Regenerate the CMake solution + echo "Invoking cmake with arguments: \"$__nativeroot\" $__CMakeArgs" + "$__nativeroot/gen-buildsys-clang.sh" "$__nativeroot" $__ClangMajorVersion $__ClangMinorVersion $__CMakeArgs + + # Check that the makefiles were created. + + if [ ! -f "$__IntermediatesDir/Makefile" ]; then + echo "Failed to generate native component build project!" + exit 1 + fi + + # Get the number of processors available to the scheduler + # Other techniques such as `nproc` only get the number of + # processors available to a single process. + if [ `uname` = "FreeBSD" ]; then + NumProc=`sysctl hw.ncpu | awk '{ print $2+1 }'` + else + NumProc=$(($(getconf _NPROCESSORS_ONLN)+1)) + fi + + # Build + + echo "Executing make install -j $NumProc $__UnprocessedBuildArgs" + + make install -j $NumProc $__UnprocessedBuildArgs + if [ $? != 0 ]; then + echo "Failed to build corert native components." + exit 1 + fi + + echo "CoreRT native components successfully built." + echo "Product binaries are available at $__BinDir" +} + +__scriptpath=$(cd "$(dirname "$0")"; pwd -P) +__nativeroot=$__scriptpath/src/Native +__packageroot=$__scriptpath/packages +__sourceroot=$__scriptpath/src +__nugetpath=$__packageroot/NuGet.exe +__nugetconfig=$__sourceroot/NuGet.Config +__rootbinpath="$__scriptpath/bin" +__msbuildpackageid="Microsoft.Build.Mono.Debug" +__msbuildpackageversion="14.1.0.0-prerelease" +__msbuildpath=$__packageroot/$__msbuildpackageid.$__msbuildpackageversion/lib/MSBuild.exe +__BuildArch=x64 +__buildmanaged=false +__buildnative=false +# Use uname to determine what the OS is. +OSName=$(uname -s) +case $OSName in + Linux) + __BuildOS=Linux + ;; + + Darwin) + __BuildOS=OSX + ;; + + FreeBSD) + __BuildOS=FreeBSD + ;; + + *) + echo "Unsupported OS $OSName detected, configuring as if for Linux" + __BuildOS=Linux + ;; +esac +__BuildType=Debug +__CMakeArgs=DEBUG + +case $__BuildOS in + FreeBSD) + __monoroot=/usr/local + ;; + OSX) + __monoroot=/Library/Frameworks/Mono.framework/Versions/Current + ;; + *) + __monoroot=/usr + ;; +esac + +__referenceassemblyroot=$__monoroot/lib/mono/xbuild-frameworks +BUILDERRORLEVEL=0 + +# Set the various build properties here so that CMake and MSBuild can pick them up +__UnprocessedBuildArgs= +__CleanBuild=false +__VerboseBuild=false +__ClangMajorVersion=3 +__ClangMinorVersion=5 + +for i in "$@" + do + lowerI="$(echo $i | awk '{print tolower($0)}')" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + managed) + __buildmanaged=true + ;; + native) + __buildnative=true + ;; + x64) + __BuildArch=x64 + __MSBuildBuildArch=x64 + ;; + arm) + __BuildArch=arm + __MSBuildBuildArch=arm + ;; + debug) + __BuildType=Debug + ;; + release) + __BuildType=Release + __CMakeArgs=RELEASE + ;; + clean) + __CleanBuild=1 + ;; + verbose) + __VerboseBuild=1 + ;; + clang3.5) + __ClangMajorVersion=3 + __ClangMinorVersion=5 + ;; + clang3.6) + __ClangMajorVersion=3 + __ClangMinorVersion=6 + ;; + clang3.7) + __ClangMajorVersion=3 + __ClangMinorVersion=7 + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + esac +done + +# If neither managed nor native are passed as arguments, default to building native only + +if [ "$__buildmanaged" = false -a "$__buildnative" = false ]; then + __buildmanaged=false + __buildnative=true +fi + +# Set the remaining variables based upon the determined build configuration +__IntermediatesDir="$__rootbinpath/obj/$__BuildOS.$__BuildArch.$__BuildType/Native" +__BinDir="$__rootbinpath/$__BuildOS.$__BuildArch.$__BuildType/Native" + +# Make the directories necessary for build if they don't exist + +setup_dirs + +if $__buildmanaged; then + + # Check prereqs. + + check_managed_prereqs + + # Prepare the system + + prepare_managed_build + + # Build the corert native components. + + build_managed_corert + + # Build complete +fi + +# If managed build failed, exit with the status code of the managed build +if [ $BUILDERRORLEVEL != 0 ]; then + exit $BUILDERRORLEVEL +fi + +if $__buildnative; then + + # Check prereqs. + + check_native_prereqs + + # Prepare the system + + prepare_native_build + + # Build the corert native components. + + build_native_corert + + # Build complete +fi + +exit $BUILDERRORLEVEL |