From cbc70ea121399625b0428f3db942f4c69ba07aca Mon Sep 17 00:00:00 2001 From: wfurt Date: Mon, 23 Mar 2020 20:53:42 -0700 Subject: [PATCH 01/11] add support for FreeBSD cross-compilation --- .../libraries/freebsd-instructions.md | 2 +- eng/native/configurecompiler.cmake | 2 +- eng/native/configureplatform.cmake | 6 ++--- eng/native/init-distro-rid.sh | 7 ++++-- src/coreclr/crossgen-corelib.proj | 1 + src/coreclr/crossgen-corelib.sh | 2 +- src/coreclr/runtime.proj | 1 + src/coreclr/src/CMakeLists.txt | 4 +-- src/coreclr/src/dlls/mscordac/CMakeLists.txt | 12 ++++----- src/coreclr/src/dlls/mscordbi/CMakeLists.txt | 8 +++--- src/coreclr/src/pal/src/CMakeLists.txt | 2 ++ src/coreclr/src/pal/src/configure.cmake | 2 +- .../src/pal/src/libunwind/src/CMakeLists.txt | 25 ++++++++++--------- src/coreclr/tryrun.cmake | 20 ++++++++++++++- src/installer/corehost/build.proj | 1 + src/libraries/Native/Unix/CMakeLists.txt | 1 - src/libraries/Native/Unix/configure.cmake | 7 +++--- src/libraries/Native/Unix/tryrun.cmake | 16 +++++++++++- 18 files changed, 80 insertions(+), 39 deletions(-) diff --git a/docs/workflow/building/libraries/freebsd-instructions.md b/docs/workflow/building/libraries/freebsd-instructions.md index 1ee100dfd62978..6b12eb33bc1bf8 100644 --- a/docs/workflow/building/libraries/freebsd-instructions.md +++ b/docs/workflow/building/libraries/freebsd-instructions.md @@ -7,7 +7,7 @@ Tested on plain FreeBSD 11.3 Azure image ## Prerequisites This needs to be done once on fresh system. -```sudo pkg install cmake git icu libunwind bash python2 krb5 lttng-ust llvm60 libgit2``` +```sudo pkg install cmake git icu libunwind bash python2 krb5 lttng-ust llvm90 libgit2 libinotify``` some scripts may still assume /bin/bash exists. To workaround it for now do of needed: ``` diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 6ce429b5c46727..de13598b80d5c7 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -182,7 +182,7 @@ if(CLR_CMAKE_HOST_LINUX) endif(CLR_CMAKE_HOST_LINUX) if(CLR_CMAKE_HOST_FREEBSD) add_compile_options($<$:-Wa,--noexecstack>) - add_link_options(-fuse-ld=lld LINKER:--build-id=sha1) + add_link_options(LINKER:--build-id=sha1) endif(CLR_CMAKE_HOST_FREEBSD) #------------------------------------ diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake index 5c5accd7d1f666..539ff0421c015b 100644 --- a/eng/native/configureplatform.cmake +++ b/eng/native/configureplatform.cmake @@ -10,7 +10,7 @@ set(PRERELEASE 1) # - 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 #---------------------------------------- -set(CLR_CMAKE_HOST_OS ${CMAKE_SYSTEM_NAME}) +set(CLR_CMAKE_HOST_OS ${CMAKE_HOST_SYSTEM_NAME}) if(CLR_CMAKE_HOST_OS STREQUAL Linux OR CLR_CMAKE_HOST_OS STREQUAL Android) set(CLR_CMAKE_HOST_UNIX 1) if(CLR_CROSS_COMPONENTS_BUILD AND NOT CLR_CMAKE_HOST_OS STREQUAL Android) @@ -305,10 +305,10 @@ if (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS) endif() endif() else() - if(NOT (CLR_CMAKE_HOST_OS STREQUAL Windows_NT)) + if(NOT (CLR_CMAKE_HOST_OS STREQUAL Windows_NT) AND NOT (CLR_CMAKE_HOST_OS STREQUAL Linux AND CLR_CMAKE_TARGET_OS STREQUAL FreeBSD)) message(FATAL_ERROR "Invalid host and target os/arch combination. Host OS: ${CLR_CMAKE_HOST_OS}") endif() - if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_ALPINE_LINUX)) + if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_ALPINE_LINUX OR CLR_CMAKE_TARGET_FREEBSD)) message(FATAL_ERROR "Invalid host and target os/arch combination. Target OS: ${CLR_CMAKE_TARGET_OS}") endif() if(NOT ((CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)) OR (CLR_CMAKE_HOST_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM))) diff --git a/eng/native/init-distro-rid.sh b/eng/native/init-distro-rid.sh index 3c7f475823511a..ed6ce327294f02 100644 --- a/eng/native/init-distro-rid.sh +++ b/eng/native/init-distro-rid.sh @@ -70,8 +70,11 @@ initNonPortableDistroRid() fi if [ "$targetOs" = "FreeBSD" ]; then - __freebsd_major_version=$(freebsd-version | { read v; echo "${v%%.*}"; }) - nonPortableBuildID="freebsd.$__freebsd_major_version-${buildArch}" + if (( isPortable == 0 )); then + # $rootfsDir can be empty. freebsd-version is shell scrip and it should always work. + __freebsd_major_version=$($rootfsDir/bin/freebsd-version | { read v; echo "${v%%.*}"; }) + nonPortableBuildID="freebsd.$__freebsd_major_version-${buildArch}" + fi fi if [ -n "${nonPortableBuildID}" ]; then diff --git a/src/coreclr/crossgen-corelib.proj b/src/coreclr/crossgen-corelib.proj index 08e7e52b1201d6..8d608505ca8cf7 100644 --- a/src/coreclr/crossgen-corelib.proj +++ b/src/coreclr/crossgen-corelib.proj @@ -6,6 +6,7 @@ <_CoreClrBuildArg Condition="'$(TargetArchitecture)' != ''" Include="-$(TargetArchitecture)" /> <_CoreClrBuildArg Include="-$(Configuration.ToLower())" /> + <_CoreClrBuildArg Condition="'$(TargetOS)' != '' and '$(TargetOS)' != '$(HostOS)'" Include="-os $(TargetOS) " /> diff --git a/src/coreclr/crossgen-corelib.sh b/src/coreclr/crossgen-corelib.sh index 570f22db10511e..203ce9f1d4e8af 100755 --- a/src/coreclr/crossgen-corelib.sh +++ b/src/coreclr/crossgen-corelib.sh @@ -94,7 +94,7 @@ __UnprocessedBuildArgs= source "$__ProjectRoot"/_build-commons.sh -if [[ "${__BuildArch}" != "${__HostArch}" ]]; then +if [[ "${__BuildArch}" != "${__HostArch}" ]] || [[ "$__HostOS" != "$__TargetOS" ]]; then __CrossBuild=1 fi diff --git a/src/coreclr/runtime.proj b/src/coreclr/runtime.proj index e36aea3ea2f7b7..d1bea50a65c53c 100644 --- a/src/coreclr/runtime.proj +++ b/src/coreclr/runtime.proj @@ -10,6 +10,7 @@ <_CoreClrBuildArg Include="$(Compiler)" /> <_CoreClrBuildArg Condition="'$(ContinuousIntegrationBuild)' == 'true'" Include="-ci" /> <_CoreClrBuildArg Condition="'$(CrossBuild)' == 'true'" Include="-cross" /> + <_CoreClrBuildArg Condition="'$(TargetOS)' != ''" Include="-os $(TargetOS) " /> <_CoreClrBuildArg Condition="$([MSBuild]::IsOsPlatform(Windows)) and ('$(TargetArchitecture)' == 'x86' or '$(TargetArchitecture)' == 'x64') and '$(Configuration)' == 'Release'" Include="-enforcepgo" /> <_CoreClrBuildArg Condition="!$([MSBuild]::IsOsPlatform(Windows)) and '$(Configuration)' == 'Release'" Include="-stripsymbols" /> <_CoreClrBuildArg Condition="$([MSBuild]::IsOsPlatform(Windows)) and '$(CrossDac)' != ''" Include="-$(CrossDac)dac" /> diff --git a/src/coreclr/src/CMakeLists.txt b/src/coreclr/src/CMakeLists.txt index 262e6b7d021c3e..886510cd530b8c 100644 --- a/src/coreclr/src/CMakeLists.txt +++ b/src/coreclr/src/CMakeLists.txt @@ -16,9 +16,9 @@ endif(CLR_CMAKE_TARGET_WIN32 AND FEATURE_EVENT_TRACE) add_subdirectory(debug/dbgutil) if(CLR_CMAKE_HOST_UNIX) - if(CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID) + if(CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_FREEBSD) add_subdirectory(debug/createdump) - endif(CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID) + endif(CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID AND NOT CLR_CMAKE_TARGET_FREEBSD) # Include the dummy c++ include files include_directories("pal/inc/rt/cpp") diff --git a/src/coreclr/src/dlls/mscordac/CMakeLists.txt b/src/coreclr/src/dlls/mscordac/CMakeLists.txt index aa3c6e815471a7..63182cb60cc9a8 100644 --- a/src/coreclr/src/dlls/mscordac/CMakeLists.txt +++ b/src/coreclr/src/dlls/mscordac/CMakeLists.txt @@ -31,11 +31,11 @@ else(CLR_CMAKE_HOST_WIN32) # Add dependency on export file add_custom_target(mscordaccore_exports DEPENDS ${EXPORTS_FILE}) - if(CLR_CMAKE_HOST_DARWIN OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD) + if(CLR_CMAKE_HOST_DARWIN OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_TARGET_FREEBSD) generate_exports_file(${DEF_SOURCES} ${EXPORTS_FILE}) - endif(CLR_CMAKE_HOST_DARWIN OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD) + endif(CLR_CMAKE_HOST_DARWIN OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_TARGET_FREEBSD) - if(CLR_CMAKE_HOST_LINUX) + if(CLR_CMAKE_TARGET_LINUX) # Generate DAC export file with the DAC_ prefix generate_exports_file_prefix(${DEF_SOURCES} ${EXPORTS_FILE} DAC_) @@ -70,7 +70,7 @@ else(CLR_CMAKE_HOST_WIN32) # Add lib redefines file to DAC list(APPEND CLR_DAC_SOURCES libredefines.S) - endif(CLR_CMAKE_HOST_LINUX) + endif(CLR_CMAKE_TARGET_LINUX) endif(CLR_CMAKE_HOST_WIN32) if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD) @@ -104,9 +104,9 @@ add_library_clr(mscordaccore SHARED ${CLR_DAC_SOURCES} $$(BuildArgs) $(Compiler) $(BuildArgs) $(CMakeArgs) $(BuildArgs) -stripsymbols + $(BuildArgs) -os $(TargetOS)