From ae7e4fbcc22ee240fc2a175c5928530c64f73a7a Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Thu, 15 Dec 2016 13:32:49 +0900 Subject: [PATCH 1/3] Fix buildsystem for linux cross-architecture component build --- CMakeLists.txt | 91 +++++++++++++--------- build.sh | 115 +++++++++++++++++++++++++++- src/pal/tools/gen-buildsys-clang.sh | 26 ++++--- 3 files changed, 184 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 702d177325cc..a60f5874bece 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,7 @@ else (WIN32) else (CMAKE_SYSTEM_NAME STREQUAL Darwin) # Ensure that objcopy is present - if (DEFINED ENV{CROSSCOMPILE}) + if (DEFINED ENV{CROSSCOMPILE} AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD) if (CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) find_program(OBJCOPY ${TOOLCHAIN}-objcopy) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) @@ -122,25 +122,40 @@ endif(WIN32) #---------------------------------------- # Detect and set platform variable names -# - for non-windows build platform & architecture is detected using inbuilt CMAKE variables +# - for non-windows build platform & architecture is detected using inbuilt CMAKE variables and cross target component configure # - for windows we use the passed in parameter to CMAKE to determine build arch #---------------------------------------- if(CMAKE_SYSTEM_NAME STREQUAL Linux) set(CLR_CMAKE_PLATFORM_UNIX 1) - # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p`. - # For the AMD/Intel 64bit architecure two different strings are common. - # Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the - # "amd64" string. Accept either of the two here. - if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) - set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) - set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) - set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) - set(CLR_CMAKE_PLATFORM_UNIX_X86 1) + if(CLR_CROSS_COMPONENT_BUILD) + # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host. + if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL armv7l) + set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL aarch64) + set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) + elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686) + set(CLR_CMAKE_PLATFORM_UNIX_X86 1) + else() + clr_unknown_arch() + endif() else() - clr_unknown_arch() + # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p` on target. + # For the AMD/Intel 64bit architecure two different strings are common. + # Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the + # "amd64" string. Accept either of the two here. + if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) + set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) + set(CLR_CMAKE_PLATFORM_UNIX_X86 1) + else() + clr_unknown_arch() + endif() endif() set(CLR_CMAKE_PLATFORM_LINUX 1) @@ -211,30 +226,30 @@ endif(CMAKE_SYSTEM_NAME STREQUAL SunOS) #------------------------------------------------------------- # Set HOST architecture variables if(CLR_CMAKE_PLATFORM_UNIX_ARM) - set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) - set(CLR_CMAKE_HOST_ARCH "arm") + set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) + set(CLR_CMAKE_HOST_ARCH "arm") elseif(CLR_CMAKE_PLATFORM_UNIX_ARM64) - set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) - set(CLR_CMAKE_HOST_ARCH "arm64") + set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) + set(CLR_CMAKE_HOST_ARCH "arm64") elseif(CLR_CMAKE_PLATFORM_UNIX_AMD64) - set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) - set(CLR_CMAKE_HOST_ARCH "x64") -elseif(CLR_CMAKE_PLATFORM_UNIX_X86) - set(CLR_CMAKE_PLATFORM_ARCH_I386 1) - set(CLR_CMAKE_HOST_ARCH "x86") -elseif(WIN32) - # CLR_CMAKE_HOST_ARCH is passed in as param to cmake - if (CLR_CMAKE_HOST_ARCH STREQUAL x64) set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) - elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86) + set(CLR_CMAKE_HOST_ARCH "x64") +elseif(CLR_CMAKE_PLATFORM_UNIX_X86) set(CLR_CMAKE_PLATFORM_ARCH_I386 1) - elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm) - set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) - elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64) - set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) - else() - clr_unknown_arch() - endif() + set(CLR_CMAKE_HOST_ARCH "x86") +elseif(WIN32) + # CLR_CMAKE_HOST_ARCH is passed in as param to cmake + if (CLR_CMAKE_HOST_ARCH STREQUAL x64) + set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) + elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86) + set(CLR_CMAKE_PLATFORM_ARCH_I386 1) + elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm) + set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) + elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64) + set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) + else() + clr_unknown_arch() + endif() endif() # Set TARGET architecture variables @@ -259,9 +274,9 @@ endif() # check if host & target arch combination are valid if(NOT(CLR_CMAKE_TARGET_ARCH STREQUAL CLR_CMAKE_HOST_ARCH)) - if(NOT((CLR_CMAKE_PLATFORM_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM64) OR (CLR_CMAKE_PLATFORM_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM))) - message(FATAL_ERROR "Invalid host and target arch combination") - endif() + if(NOT((CLR_CMAKE_PLATFORM_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM64) OR (CLR_CMAKE_PLATFORM_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM))) + message(FATAL_ERROR "Invalid host and target arch combination") + endif() endif() #----------------------------------------------------- diff --git a/build.sh b/build.sh index d42bf37b969f..a835d97baa3e 100755 --- a/build.sh +++ b/build.sh @@ -241,7 +241,93 @@ build_coreclr() exit 1 fi - popd + popd +} + +build_crossArchComp() +{ + if [ $__SkipCoreCLR == 1 ]; then + echo "Skipping cross-architecture native component build." + return + fi + + echo "Commencing build of cross architecture native components for $__BuildOS.$__BuildArch.$__BuildType" + + generator="" + buildFile="Makefile" + buildTool="make" + if [ $__UseNinja == 1 ]; then + generator="ninja" + buildFile="build.ninja" + if which ninja >/dev/null 2>&1; then + buildTool="ninja" + elif which ninja-build >/dev/null 2>&1; then + buildTool="ninja-build" + else + echo "Unable to locate ninja!" 1>&2 + exit 1 + fi + fi + + if [ ! -f $__CrossComponentBinDir ]; then + mkdir -p "$__CrossComponentBinDir" + fi + if [ ! -f $__CrossCompIntermediatesDir ]; then + mkdir -p "$__CrossCompIntermediatesDir" + fi + + if [ $__SkipConfigure == 0 ]; then + # Copy version.cpp file + __versionSourceFile=$__IntermediatesDir/version.cpp + if [ ! -f "$__versionSourceFile" ]; then + echo "cannot find version.cpp file" + exit 1 + fi + cp "$__versionSourceFile" "$__CrossCompIntermediatesDir/version.cpp" + + pushd "$__CrossCompIntermediatesDir" + export __CMakeBinDir="$__CrossComponentBinDir" + # Regenerate the CMake solution + __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument" + echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $__CrossArch $__BuildType crosscomp $__CodeCoverage $generator $__ExtraCmakeArgs $__cmakeargs" + "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $__CrossArch $__BuildType "crosscomp" $__CodeCoverage $generator "$__ExtraCmakeArgs" "$__cmakeargs" + popd + fi + + # Check that the makefiles were created. + pushd "$__CrossCompIntermediatesDir" + + if [ ! -f "$__CrossCompIntermediatesDir/$buildFile" ]; then + echo "Failed to generate cross-architecture 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 }'` + elif [ `uname` = "NetBSD" ]; then + NumProc=$(($(getconf NPROCESSORS_ONLN)+1)) + else + NumProc=$(($(getconf _NPROCESSORS_ONLN)+1)) + fi + + # Build cross-arthitecture components + + if [ $__ConfigureOnly == 1 ]; then + echo "Skipping cross-architecture components build." + return + fi + + echo "Executing $buildTool install -j $NumProc" + + $buildTool install -j $NumProc + if [ $? != 0 ]; then + echo "Failed to build cross-architecture components." + exit 1 + fi + popd } isMSBuildOnNETCoreSupported() @@ -699,6 +785,18 @@ __TestWorkingDir="$__RootBinDir/tests/$__BuildOS.$__BuildArch.$__BuildType" export __IntermediatesDir="$__RootBinDir/obj/$__BuildOS.$__BuildArch.$__BuildType" __TestIntermediatesDir="$__RootBinDir/tests/obj/$__BuildOS.$__BuildArch.$__BuildType" __isMSBuildOnNETCoreSupported=0 +__CrossComponentBinDir="$__BinDir" +__CrossCompIntermediatesDir="$__IntermediatesDir/crossgen" + +__CrossArch="$__HostArch" +if [[ "$__HostArch" == "x64" && "$__BuildArch" == "arm" ]]; then + __CrossArch="x86" +fi +if [ $__CrossBuild == 1 ]; then + __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch" +fi +__CrossgenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__BuildOS.$BuildArch.$__BuildType.log" +__CrossgenExe="$__CrossComponentBinDir/crossgen" # Init if MSBuild for .NET Core is supported for this platform isMSBuildOnNETCoreSupported @@ -740,6 +838,21 @@ check_prereqs build_coreclr +# Build cross-architecture components +if [[ $__CrossBuild == 1 ]]; then + __DoCrossArchBuild=0 + # prepare to build cross-architecture components for x86(x64)-host/arm-target + if [[ "$__BuildArch" == "arm" && "$__HostArch" == "x64" ]]; then + __DoCrossArchBuild=0 + elif [[ "$__BuildArch" == "arm" && "$__HostArch" == "x86" ]]; then + __DoCrossArchBuild=0 + fi + + if [ $__DoCrossArchBuild == 1 ]; then + build_crossArchComp + fi +fi + # Build System.Private.CoreLib. build_CoreLib diff --git a/src/pal/tools/gen-buildsys-clang.sh b/src/pal/tools/gen-buildsys-clang.sh index 022a9ccf56a6..b2376ce69d59 100755 --- a/src/pal/tools/gen-buildsys-clang.sh +++ b/src/pal/tools/gen-buildsys-clang.sh @@ -41,6 +41,7 @@ code_coverage=OFF build_tests=OFF generator="Unix Makefiles" __UnprocessedCMakeArgs="" +buildCrossComponent=0 for i in "${@:5}"; do upperI="$(echo $i | awk '{print toupper($0)}')" @@ -60,6 +61,9 @@ for i in "${@:5}"; do NINJA) generator=Ninja ;; + CROSSCOMP) + buildCrossComponent=1 + ;; *) __UnprocessedCMakeArgs="${__UnprocessedCMakeArgs}${__UnprocessedCMakeArgs:+ }$i" esac @@ -126,16 +130,20 @@ fi if [[ -n "$LLDB_INCLUDE_DIR" ]]; then cmake_extra_defines="$cmake_extra_defines -DWITH_LLDB_INCLUDES=$LLDB_INCLUDE_DIR" fi -if [[ -n "$CROSSCOMPILE" ]]; then - if ! [[ -n "$ROOTFS_DIR" ]]; then - echo "ROOTFS_DIR not set for crosscompile" - exit 1 - fi - if [[ -z $CONFIG_DIR ]]; then - CONFIG_DIR="$1/cross/$build_arch" +if [ $buildCrossComponent == 1 ]; then + cmake_extra_defines="$cmake_extra_defines -DCLR_CROSS_COMPONENTS_BUILD=1" +else + if [[ -n "$CROSSCOMPILE" ]]; then + if ! [[ -n "$ROOTFS_DIR" ]]; then + echo "ROOTFS_DIR not set for crosscompile" + exit 1 + fi + if [[ -z $CONFIG_DIR ]]; then + CONFIG_DIR="$1/cross/$build_arch" + fi + cmake_extra_defines="$cmake_extra_defines -C $CONFIG_DIR/tryrun.cmake" + cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$CONFIG_DIR/toolchain.cmake" fi - cmake_extra_defines="$cmake_extra_defines -C $CONFIG_DIR/tryrun.cmake" - cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$CONFIG_DIR/toolchain.cmake" fi if [ "$build_arch" == "arm-softfp" ]; then cmake_extra_defines="$cmake_extra_defines -DARM_SOFTFP=1" From 94a44963757f2baa60070c07e756f055a26f468b Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Fri, 16 Dec 2016 16:45:11 +0900 Subject: [PATCH 2/3] refactoring build.sh, bug fix and typo fix --- CMakeLists.txt | 12 +- build.sh | 175 +++++++++------------------- functions.cmake | 2 + src/pal/tools/gen-buildsys-clang.sh | 6 +- 4 files changed, 65 insertions(+), 130 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a60f5874bece..395f602492fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,14 +127,14 @@ endif(WIN32) #---------------------------------------- if(CMAKE_SYSTEM_NAME STREQUAL Linux) set(CLR_CMAKE_PLATFORM_UNIX 1) - if(CLR_CROSS_COMPONENT_BUILD) + if(CLR_CROSS_COMPONENTS_BUILD) # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host. if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) - set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) - elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL armv7l) - set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) - elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL aarch64) - set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) + if(CLR_CMAKE_TARGET_ARCH STREQUAL "arm") + set(CLR_CMAKE_PLATFORM_UNIX_X86 1) + else() + set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) + endif() elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686) set(CLR_CMAKE_PLATFORM_UNIX_X86 1) else() diff --git a/build.sh b/build.sh index a835d97baa3e..cb1b4cdaac2d 100755 --- a/build.sh +++ b/build.sh @@ -94,6 +94,11 @@ setup_dirs() mkdir -p "$__BinDir" mkdir -p "$__LogsDir" mkdir -p "$__IntermediatesDir" + + if [ $__CrossBuild == 1 ]; then + mkdir -p "$__CrossComponentBinDir" + mkdir -p "$__CrossCompIntermediatesDir" + fi } # Check the system to ensure the right prereqs are in place @@ -110,11 +115,10 @@ check_prereqs() } -build_coreclr() -{ +prepare_logingInfra() +{ if [ $__SkipCoreCLR == 1 ]; then - echo "Skipping CoreCLR build." return fi @@ -160,10 +164,23 @@ build_coreclr() fi rm -rf "$__GeneratedIntermediateEventProvider" +} - # All set to commence the build +build_native() +{ + skipCondition=$1 + platformArch="$2" + intermediatesForBuild="$3" + extraCmakeArguments="$4" + message="$5" + + if [ $skipCondition == 1 ]; then + echo "Skipping $message build." + return + fi - echo "Commencing build of native components for $__BuildOS.$__BuildArch.$__BuildType in $__IntermediatesDir" + # All set to commence the build + echo "Commencing build of $message for $__BuildOS.$__BuildArch.$__BuildType in $intermediatesForBuild" generator="" buildFile="Makefile" @@ -185,8 +202,9 @@ build_coreclr() # if msbuild is not supported, then set __SkipGenerateVersion to 1 if [ $__isMSBuildOnNETCoreSupported == 0 ]; then __SkipGenerateVersion=1; fi # Drop version.cpp file - __versionSourceFile=$__IntermediatesDir/version.cpp + __versionSourceFile="$intermediatesForBuild/version.cpp" if [ $__SkipGenerateVersion == 0 ]; then + pwd "$__ProjectRoot/run.sh" build -Project=$__ProjectDir/build.proj -generateHeaderUnix -NativeVersionSourceFile=$__versionSourceFile $__RunArgs $__UnprocessedBuildArgs else # Generate the dummy version.cpp, but only if it didn't exist to make sure we don't trigger unnecessary rebuild @@ -199,22 +217,18 @@ build_coreclr() fi fi - pushd "$__IntermediatesDir" + pushd "$intermediatesForBuild" # Regenerate the CMake solution - __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument" - echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator $__ExtraCmakeArgs $__cmakeargs" - "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $__BuildArch $__BuildType $__CodeCoverage $__IncludeTests $generator "$__ExtraCmakeArgs" "$__cmakeargs" + echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $platformArch $__BuildType $__CodeCoverage $__IncludeTests $generator $extraCmakeArguments $__cmakeargs" + "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $platformArch $__BuildType $__CodeCoverage $__IncludeTests $generator "$extraCmakeArguments" "$__cmakeargs" popd fi - # Check that the makefiles were created. - pushd "$__IntermediatesDir" - - if [ ! -f "$__IntermediatesDir/$buildFile" ]; then - echo "Failed to generate native component build project!" + if [ ! -f "$intermediatesForBuild/$buildFile" ]; then + echo "Failed to generate $message 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. @@ -226,107 +240,23 @@ build_coreclr() NumProc=$(($(getconf _NPROCESSORS_ONLN)+1)) fi - # Build CoreCLR - + # Build if [ $__ConfigureOnly == 1 ]; then - echo "Skipping CoreCLR build." - return - fi - - echo "Executing $buildTool install -j $NumProc" - - $buildTool install -j $NumProc - if [ $? != 0 ]; then - echo "Failed to build coreclr components." - exit 1 - fi - - popd -} - -build_crossArchComp() -{ - if [ $__SkipCoreCLR == 1 ]; then - echo "Skipping cross-architecture native component build." + echo "Finish configuration & skipping $message build." return fi - echo "Commencing build of cross architecture native components for $__BuildOS.$__BuildArch.$__BuildType" - - generator="" - buildFile="Makefile" - buildTool="make" - if [ $__UseNinja == 1 ]; then - generator="ninja" - buildFile="build.ninja" - if which ninja >/dev/null 2>&1; then - buildTool="ninja" - elif which ninja-build >/dev/null 2>&1; then - buildTool="ninja-build" - else - echo "Unable to locate ninja!" 1>&2 - exit 1 - fi - fi - - if [ ! -f $__CrossComponentBinDir ]; then - mkdir -p "$__CrossComponentBinDir" - fi - if [ ! -f $__CrossCompIntermediatesDir ]; then - mkdir -p "$__CrossCompIntermediatesDir" - fi - - if [ $__SkipConfigure == 0 ]; then - # Copy version.cpp file - __versionSourceFile=$__IntermediatesDir/version.cpp - if [ ! -f "$__versionSourceFile" ]; then - echo "cannot find version.cpp file" - exit 1 - fi - cp "$__versionSourceFile" "$__CrossCompIntermediatesDir/version.cpp" - - pushd "$__CrossCompIntermediatesDir" - export __CMakeBinDir="$__CrossComponentBinDir" - # Regenerate the CMake solution - __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument" - echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion $__ClangMinorVersion $__CrossArch $__BuildType crosscomp $__CodeCoverage $generator $__ExtraCmakeArgs $__cmakeargs" - "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion $__ClangMinorVersion $__CrossArch $__BuildType "crosscomp" $__CodeCoverage $generator "$__ExtraCmakeArgs" "$__cmakeargs" - popd - fi - # Check that the makefiles were created. - pushd "$__CrossCompIntermediatesDir" - - if [ ! -f "$__CrossCompIntermediatesDir/$buildFile" ]; then - echo "Failed to generate cross-architecture 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 }'` - elif [ `uname` = "NetBSD" ]; then - NumProc=$(($(getconf NPROCESSORS_ONLN)+1)) - else - NumProc=$(($(getconf _NPROCESSORS_ONLN)+1)) - fi - - # Build cross-arthitecture components - - if [ $__ConfigureOnly == 1 ]; then - echo "Skipping cross-architecture components build." - return - fi + pushd "$intermediatesForBuild" echo "Executing $buildTool install -j $NumProc" $buildTool install -j $NumProc if [ $? != 0 ]; then - echo "Failed to build cross-architecture components." + echo "Failed to build $message." exit 1 fi + popd } @@ -589,6 +519,7 @@ __HostDistroRid="" __DistroRid="" __cmakeargs="" __SkipGenerateVersion=0 +__DoCrossArchBuild=0 while :; do if [ $# -le 0 ]; then @@ -699,6 +630,10 @@ while :; do __SkipCoreCLR=1 ;; + crosscomponent) + __DoCrossArchBuild=1 + ;; + skipmscorlib) __SkipMSCorLib=1 ;; @@ -827,30 +762,32 @@ fi initTargetDistroRid # Make the directories necessary for build if they don't exist - setup_dirs # Check prereqs. - check_prereqs -# Build the coreclr (native) components. +# Event Logging Infrastructure +prepare_logingInfra -build_coreclr +# Build the coreclr (native) components. +__ExtraCmakeArgs="-DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument" +build_native $__SkipCoreCLR "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" "CoreCLR component" # Build cross-architecture components -if [[ $__CrossBuild == 1 ]]; then - __DoCrossArchBuild=0 - # prepare to build cross-architecture components for x86(x64)-host/arm-target - if [[ "$__BuildArch" == "arm" && "$__HostArch" == "x64" ]]; then - __DoCrossArchBuild=0 - elif [[ "$__BuildArch" == "arm" && "$__HostArch" == "x86" ]]; then - __DoCrossArchBuild=0 - fi - +if [ $__CrossBuild == 1 ]; then + __SkipCrossArchBuild=1 if [ $__DoCrossArchBuild == 1 ]; then - build_crossArchComp + # build cross-architecture components for x86-host/arm-target + if [[ "$__BuildArch" == "arm" && "$__CrossArch" == "x86" ]]; then + __SkipCrossArchBuild=0 + fi fi + + export __CMakeBinDir="$__CrossComponentBinDir" + export CROSSCOMPONENT=1 + __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument" + build_native $__SkipCrossArchBuild "$__CrossArch" "$__CrossCompIntermediatesDir" "$__ExtraCmakeArgs" "cross-architecture component" fi # Build System.Private.CoreLib. diff --git a/functions.cmake b/functions.cmake index bac20e8bc65a..e1a9abb46938 100644 --- a/functions.cmake +++ b/functions.cmake @@ -1,6 +1,8 @@ function(clr_unknown_arch) if (WIN32) message(FATAL_ERROR "Only AMD64, ARM64, ARM and I386 are supported") + elseif(CLR_CROSS_COMPONENTS_BUILD) + message(FATAL_ERROR "Only AMD64, I386 are supported for cross-architecture component") else() message(FATAL_ERROR "Only AMD64, ARM64 and ARM are supported") endif() diff --git a/src/pal/tools/gen-buildsys-clang.sh b/src/pal/tools/gen-buildsys-clang.sh index b2376ce69d59..4054266f0bd7 100755 --- a/src/pal/tools/gen-buildsys-clang.sh +++ b/src/pal/tools/gen-buildsys-clang.sh @@ -41,7 +41,6 @@ code_coverage=OFF build_tests=OFF generator="Unix Makefiles" __UnprocessedCMakeArgs="" -buildCrossComponent=0 for i in "${@:5}"; do upperI="$(echo $i | awk '{print toupper($0)}')" @@ -61,9 +60,6 @@ for i in "${@:5}"; do NINJA) generator=Ninja ;; - CROSSCOMP) - buildCrossComponent=1 - ;; *) __UnprocessedCMakeArgs="${__UnprocessedCMakeArgs}${__UnprocessedCMakeArgs:+ }$i" esac @@ -130,7 +126,7 @@ fi if [[ -n "$LLDB_INCLUDE_DIR" ]]; then cmake_extra_defines="$cmake_extra_defines -DWITH_LLDB_INCLUDES=$LLDB_INCLUDE_DIR" fi -if [ $buildCrossComponent == 1 ]; then +if [[ -n "$CROSSCOMPONENT" ]]; then cmake_extra_defines="$cmake_extra_defines -DCLR_CROSS_COMPONENTS_BUILD=1" else if [[ -n "$CROSSCOMPILE" ]]; then From 68d02db2c038fbeac9595cbc7d42ab3da90cc9a5 Mon Sep 17 00:00:00 2001 From: Hyeongseok Oh Date: Fri, 16 Dec 2016 23:00:59 +0900 Subject: [PATCH 3/3] Update build.sh --- build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index cb1b4cdaac2d..efdd5cbff626 100755 --- a/build.sh +++ b/build.sh @@ -116,7 +116,7 @@ check_prereqs() } -prepare_logingInfra() +generate_event_logging_sources() { if [ $__SkipCoreCLR == 1 ]; then return @@ -767,8 +767,8 @@ setup_dirs # Check prereqs. check_prereqs -# Event Logging Infrastructure -prepare_logingInfra +# Generate event logging infrastructure sources +generate_event_logging_sources # Build the coreclr (native) components. __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument"