Skip to content

Commit 4dfa389

Browse files
committed
Merge remote-tracking branch 'upstream/master' into icu-normalization-casing-idna
2 parents 4be54ce + 5d8b6c7 commit 4dfa389

File tree

380 files changed

+13587
-4559
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

380 files changed

+13587
-4559
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,3 +269,6 @@ CMakeFiles/
269269
cmake_install.cmake
270270
CMakeCache.txt
271271
Makefile
272+
273+
# Cross compilation
274+
cross/rootfs/*

CMakeLists.txt

Lines changed: 123 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,30 @@ set(CLR_DIR ${CMAKE_CURRENT_SOURCE_DIR})
1515
set(VM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/vm)
1616
set(GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/inc)
1717

18+
function(clr_unknown_arch)
19+
if (WIN32)
20+
message(FATAL_ERROR "Only AMD64 and I386 are supported")
21+
else()
22+
message(FATAL_ERROR "Only AMD64, ARM64 and ARM are supported")
23+
endif()
24+
endfunction()
25+
1826
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
1927
set(CLR_CMAKE_PLATFORM_UNIX 1)
20-
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
28+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
29+
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
30+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
31+
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM 1)
32+
# Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang
33+
# we have to set the triple by adding a compiler argument
34+
add_compile_options(-target armv7-linux-gnueabihf)
35+
add_compile_options(-mthumb)
36+
add_compile_options(-mfpu=vfpv3)
37+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
38+
set(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64 1)
39+
else()
40+
clr_unknown_arch()
41+
endif()
2142
set(CLR_CMAKE_PLATFORM_LINUX 1)
2243
endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
2344

@@ -46,6 +67,24 @@ if(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
4667
set(CLR_CMAKE_PLATFORM_NETBSD 1)
4768
endif(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
4869

70+
if(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
71+
set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
72+
elseif(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64)
73+
set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
74+
elseif(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
75+
set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
76+
elseif(WIN32)
77+
if (CLR_CMAKE_TARGET_ARCH STREQUAL x64)
78+
set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
79+
set(IS_64BIT_BUILD 1)
80+
elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86)
81+
set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
82+
set(IS_64BIT_BUILD 0)
83+
else()
84+
clr_unknown_arch()
85+
endif()
86+
endif()
87+
4988
if(WIN32)
5089
enable_language(ASM_MASM)
5190
else()
@@ -121,7 +160,7 @@ function(generate_exports_file inputFilename outputFilename)
121160
add_custom_command(
122161
OUTPUT ${outputFilename}
123162
COMMAND ${AWK} -f ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT} ${inputFilename} >${outputFilename}
124-
DEPENDS ${inputFilename}
163+
DEPENDS ${inputFilename} ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT}
125164
COMMENT "Generating exports file ${outputFilename}"
126165
)
127166
set_source_files_properties(${outputFilename}
@@ -203,21 +242,15 @@ add_subdirectory(src/pal/prebuilt/inc)
203242

204243
if (WIN32)
205244
set(OVERRIDE_CMAKE_CXX_FLAGS 1)
206-
207-
# Set flag to indicate if this will be a 64bit Windows build
208-
if(CMAKE_SYSTEM_PROCESSOR STREQUAL AMD64)
209-
set(IS_64BIT_BUILD 1)
210-
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL AMD64)
211-
212245
elseif (CLR_CMAKE_PLATFORM_UNIX)
213246
# Set flag to indicate if this will be a 64bit build
214247
# CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p`.
215248
# For the AMD/Intel 64bit architecure two different strings are common.
216249
# Linux and Darwin identify it as "x86_64" while FreeBSD uses the
217250
# "amd64" string. Accept either of the two here.
218-
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64)
251+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
219252
set(IS_64BIT_BUILD 1)
220-
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64)
253+
endif (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
221254

222255
add_definitions(-DFEATURE_IMPLICIT_TLS)
223256
endif(WIN32)
@@ -255,6 +288,10 @@ add_compile_options(/wd4960 /wd4961 /wd4603 /wd4627 /wd4838 /wd4456 /wd4457 /wd4
255288
add_compile_options(/O1) # minimize space
256289
add_compile_options(/Zi) # enable debugging information
257290

291+
if (CLR_CMAKE_PLATFORM_ARCH_I386)
292+
add_compile_options(/Gz)
293+
endif (CLR_CMAKE_PLATFORM_ARCH_I386)
294+
258295
add_compile_options($<$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>:/GL>)
259296

260297
if (IS_64BIT_BUILD EQUAL 1)
@@ -346,7 +383,6 @@ include_directories("src/pal/prebuilt/inc")
346383
if (CLR_CMAKE_PLATFORM_UNIX)
347384
include_directories("src/pal/inc")
348385
include_directories("src/pal/inc/rt")
349-
include_directories("src/pal/inc/rt/cpp")
350386
include_directories("src/pal/src/safecrt")
351387
endif (CLR_CMAKE_PLATFORM_UNIX)
352388

@@ -370,15 +406,25 @@ if (CLR_CMAKE_PLATFORM_UNIX)
370406

371407
if(IS_64BIT_BUILD)
372408
add_definitions(-DBIT64=1)
373-
add_definitions(-DFEATURE_PAL)
374-
else (IS_64BIT_BUILD)
375-
message(FATAL_ERROR "error: Detected non x86_64 target processor. Not supported!")
376409
endif(IS_64BIT_BUILD)
377410

411+
add_definitions(-DFEATURE_PAL)
412+
378413
if(CLR_CMAKE_PLATFORM_LINUX)
379414
add_definitions(-D__LINUX__=1)
380-
message("Detected Linux x86_64")
381-
add_definitions(-DLINUX64)
415+
if(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
416+
message("Detected Linux x86_64")
417+
add_definitions(-DLINUX64)
418+
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
419+
message("Detected Linux ARM")
420+
add_definitions(-DLINUX32)
421+
elseif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
422+
message("Detected Linux ARM64")
423+
add_definitions(-DLINUX64)
424+
else()
425+
clr_unknown_arch()
426+
endif()
427+
382428
endif(CLR_CMAKE_PLATFORM_LINUX)
383429
if(CLR_CMAKE_PLATFORM_DARWIN)
384430
message("Detected OSX x86_64")
@@ -404,12 +450,28 @@ add_definitions(-DNTDDI_VERSION=NTDDI_WIN8)
404450
if (IS_64BIT_BUILD EQUAL 1)
405451
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
406452
add_definitions(-DDBG_TARGET_AMD64_UNIX)
453+
add_definitions(-D_TARGET_AMD64_=1)
454+
add_definitions(-DDBG_TARGET_AMD64)
455+
elseif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64)
456+
add_definitions(-DDBG_TARGET_ARM64_UNIX)
457+
add_definitions(-D_TARGET_ARM64_=1)
458+
add_definitions(-DDBG_TARGET_ARM64)
459+
else ()
460+
# Windows is assumed in this path -- fix this
461+
add_definitions(-DDBG_TARGET_AMD64)
462+
add_definitions(-D_TARGET_AMD64_=1)
407463
endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
408-
add_definitions(-D_TARGET_AMD64_=1)
409-
add_definitions(-DDBG_TARGET_AMD64)
464+
elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
465+
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
466+
add_definitions(-DDBG_TARGET_ARM_UNIX)
467+
endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
468+
add_definitions(-D_TARGET_ARM_=1)
469+
add_definitions(-DDBG_TARGET_ARM)
470+
elseif (CLR_CMAKE_PLATFORM_ARCH_I386)
471+
add_definitions(-D_TARGET_X86_=1)
472+
add_definitions(-DDBG_TARGET_X86)
410473
else ()
411-
# TODO: Support this
412-
message(FATAL_ERROR "Not Implemented!")
474+
clr_unknown_arch()
413475
endif (IS_64BIT_BUILD EQUAL 1)
414476

415477
if(WIN32)
@@ -425,10 +487,16 @@ if(WIN32)
425487
add_definitions(-DEnC_SUPPORTED)
426488
endif(WIN32)
427489
add_definitions(-DFEATURE_APPDOMAIN_RESOURCE_MONITORING)
428-
add_definitions(-DFEATURE_ARRAYSTUB_AS_IL)
490+
if(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
491+
add_definitions(-DFEATURE_ARRAYSTUB_AS_IL)
492+
endif()
429493
if (CLR_CMAKE_PLATFORM_UNIX)
430494
add_definitions(-DFEATURE_STUBS_AS_IL)
431-
add_definitions(-DUNIX_AMD64_ABI)
495+
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
496+
add_definitions(-DUNIX_AMD64_ABI)
497+
elseif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
498+
add_definitions(-DUNIX_ARM_ABI)
499+
endif()
432500
endif(CLR_CMAKE_PLATFORM_UNIX)
433501
add_definitions(-DFEATURE_ASYNC_IO)
434502
add_definitions(-DFEATURE_BCL_FORMATTING)
@@ -519,16 +587,27 @@ if(CLR_CMAKE_PLATFORM_UNIX)
519587
add_definitions(-DFEATURE_DBGIPC_TRANSPORT_VM)
520588
endif(CLR_CMAKE_PLATFORM_UNIX)
521589

522-
if (IS_64BIT_BUILD EQUAL 1)
523-
add_definitions(-D_AMD64_)
524-
add_definitions(-D_AMD64_SIMULATOR_)
525-
add_definitions(-D_AMD64_SIMULATOR_PERF_)
526-
add_definitions(-D_AMD64_WORKAROUND_)
527-
add_definitions(-D_WIN64)
528-
add_definitions(-DAMD64)
590+
if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
591+
add_definitions(-D_AMD64_)
592+
add_definitions(-D_AMD64_SIMULATOR_)
593+
add_definitions(-D_AMD64_SIMULATOR_PERF_)
594+
add_definitions(-D_AMD64_WORKAROUND_)
595+
add_definitions(-D_WIN64)
596+
add_definitions(-DAMD64)
597+
elseif (CLR_CMAKE_PLATFORM_ARCH_I386)
598+
add_definitions(-D_WIN32)
599+
add_definitions(-D_X86_)
600+
elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
601+
add_definitions(-D_ARM_)
602+
add_definitions(-DARM)
603+
add_definitions(-D_WIN32)
604+
elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64)
605+
add_definitions(-D_ARM64_)
606+
add_definitions(-DARM64)
607+
add_definitions(-D_WIN64)
529608
else ()
530-
# TODO - Support this
531-
endif (IS_64BIT_BUILD EQUAL 1)
609+
clr_unknown_arch()
610+
endif ()
532611

533612
add_definitions(-D_SKIP_IF_SIMULATOR_)
534613
add_definitions(-D_SECURE_SCL=0)
@@ -540,9 +619,20 @@ add_definitions(-DUNICODE)
540619
add_definitions(-D_UNICODE)
541620

542621
if (IS_64BIT_BUILD EQUAL 1)
543-
set(ARCH_SOURCES_DIR amd64)
622+
if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 EQUAL 1)
623+
set(ARCH_SOURCES_DIR amd64)
624+
elseif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64 EQUAL 1)
625+
set(ARCH_SOURCES_DIR arm64)
626+
else ()
627+
# Windows is assumed in this path -- fix this
628+
set(ARCH_SOURCES_DIR amd64)
629+
endif ()
544630
else ()
545-
set(ARCH_SOURCES_DIR i386)
631+
if (CLR_CMAKE_PLATFORM_ARCH_ARM)
632+
set(ARCH_SOURCES_DIR arm)
633+
else ()
634+
set(ARCH_SOURCES_DIR i386)
635+
endif ()
546636
endif (IS_64BIT_BUILD EQUAL 1)
547637

548638
add_subdirectory(src)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
Cross Compilation
2+
=================
3+
4+
Through cross compilation, on Linux it is possible to build CoreCLR for ARM or ARM64.
5+
6+
Generating the rootfs
7+
---------------------
8+
The `cross\build-rootfs.sh` script can be used to download the files needed for cross compilation. It will generate an Ubuntu 14.04 rootfs as this is what CoreCLR targets.
9+
10+
Usage: build-rootfs.sh [BuildArch]
11+
BuildArch can be: arm, arm64
12+
13+
This script requires a Debian based host, and the following packages installed
14+
15+
qemu
16+
qemu-user-static
17+
binfmt-support
18+
debootstrap
19+
20+
The `build-rootfs.sh` script must be run as root as it has to make some symlinks to the system, it will by default generate the rootfs in `cross\rootfs\<BuildArch>` however this can be changed by setting the `ROOTFS_DIR` environment variable.
21+
22+
For example, to generate an ARM rootfs:
23+
24+
ben@ubuntu ~/git/coreclr/ $ sudo ./cross/build-rootfs.sh arm
25+
26+
and if you wanted to generate the rootfs elsewhere:
27+
28+
ben@ubuntu ~/git/coreclr/ $ sudo ROOTFS_DIR=/home/ben/coreclr-cross/arm ./build-rootfs.sh arm
29+
30+
Cross compiling CoreCLR
31+
-----------------------
32+
Once the rootfs has been generated it will be possible to cross compile CoreCLR. To cross compile CoreCLR the binutils for the target are required, for ARM this is `binutils-arm-linux-gnueabihf` and for ARM64 this is `binutils-aarch64-linux-gnu`. If `ROOTFS_DIR` was set when generating the rootfs, then it must also be set when running `build.sh`.
33+
34+
So, without `ROOTFS_DIR`:
35+
36+
ben@ubuntu ~/git/coreclr/ $ ./build.sh arm debug verbose clean cross
37+
38+
And with:
39+
40+
ben@ubuntu ~/git/coreclr/ $ ROOTFS_DIR=/home/ben/coreclr-cross/arm ./build.sh arm debug verbose clean cross
41+
42+
As usual the resulting binaries will be found in `bin/Product/BuildOS.BuildArch.BuildType/`

Documentation/building/custom-dnx-instructions.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ You need to restore dependent nuget packages with the dnu tool (comes with DNX).
8080

8181
You can now run the app, with dnx.
8282

83-
C:\coreclr-demo>dnx . run
83+
C:\coreclr-demo>dnx run
8484

8585
Switching to CoreCLR
8686
====================
@@ -101,7 +101,7 @@ You should now have two runtimes installed. The CoreCLR one will be the default.
101101
You will need to repeat the steps above to run your app on CoreCLR (CoreCLR requires more NuGet packages).
102102

103103
C:\coreclr-demo>dnu restore
104-
C:\coreclr-demo>dnx . run
104+
C:\coreclr-demo>dnx run
105105

106106
Creating a Custom DNX
107107
=====================
@@ -139,7 +139,7 @@ You now need to select the custom DNX as the use to 'use'. You can see the new D
139139

140140
Try running the app again to validate that you have a working installation with the custom DNX.
141141

142-
C:\coreclr-demo>dnx . run
142+
C:\coreclr-demo>dnx run
143143

144144
Injecting a Custom CoreCLR into your Custom DNX
145145
===============================================
@@ -159,4 +159,4 @@ You should re-generate crossgen images for your DNX to provide the best performa
159159

160160
You should now have a working custom CoreCLR x64 DNX. Give it a try.
161161

162-
C:\coreclr-demo>dnx . run
162+
C:\coreclr-demo>dnx run

0 commit comments

Comments
 (0)