blob: a749ea87829c4d14979b0b3f3012bdccd4eda41b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
cmake_minimum_required(VERSION 3.6)
project(ObjWriter)
include(ExternalProject)
set(LLVM_VERSION "5")
set(OBJWRITER_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../)
set(OBJWRITER_LLVM_POINT tools/ObjWriter)
if(NOT OBJWRITER_TARGET_ARCH)
if(CLR_CMAKE_TARGET_ARCH MATCHES "^(x64|x86)$")
if(NOT CROSS_BUILD)
set(OBJWRITER_TARGET_ARCH "X86")
else()
# If we really want a cross version for x86/x64 -> arm32/arm64
# I think in the opposite direction it's not necessary for anyone ;-)
set(OBJWRITER_TARGET_ARCH "X86::ARM")
set(USE_ARM_TARGET_TRIPLE 1)
endif()
elseif(CLR_CMAKE_TARGET_ARCH MATCHES "^(arm|armel)$")
set(OBJWRITER_TARGET_ARCH "ARM")
set(USE_ARM_TARGET_TRIPLE 1)
elseif(CLR_CMAKE_TARGET_ARCH STREQUAL "arm64")
set(OBJWRITER_TARGET_ARCH "AArch64")
else()
clr_unknown_arch()
endif()
endif()
get_target_property(CORERT_NATIVE_COMPILE_OPTIONS Runtime COMPILE_OPTIONS)
# For armel RootFS compatibility
if(CLR_CMAKE_TARGET_ARCH STREQUAL "armel")
list(APPEND CORERT_NATIVE_COMPILE_OPTIONS "-Wno-gnu-include-next")
endif()
if(USE_ARM_TARGET_TRIPLE)
list(APPEND LLVM_CMAKE_EXTRA_ARGS "-DLLVM_DEFAULT_TARGET_TRIPLE=thumbv7-linux-gnueabi")
endif()
# Make sure to remove debug flags from general build flags for LLVM
set(LLVM_COMPILE_OPTIONS "${CORERT_NATIVE_COMPILE_OPTIONS}")
list(REMOVE_ITEM LLVM_COMPILE_OPTIONS "-g")
list(REMOVE_ITEM LLVM_COMPILE_OPTIONS "-O0")
list(REMOVE_ITEM LLVM_COMPILE_OPTIONS "-Werror")
string(REPLACE ";" "\ " CORERT_NATIVE_COMPILE_OPTIONS "${CORERT_NATIVE_COMPILE_OPTIONS}")
string(REPLACE ";" "\ " LLVM_COMPILE_OPTIONS "${LLVM_COMPILE_OPTIONS}")
# If host and target are the same, we could use llvm-tblgen from LLVM itself.
# Otherwise we use host llvm-tblgen. It's universal way for cross-building.
if(NOT ${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL ${CMAKE_SYSTEM_PROCESSOR})
# Find llvm-tblgen tool
if(NOT LLVM_TBLGEN_TOOL)
execute_process (
COMMAND bash -c "echo -n `which llvm-tblgen`"
OUTPUT_VARIABLE LLVM_TBLGEN_TOOL
)
if(NOT LLVM_TBLGEN_TOOL)
message(FATAL_ERROR "Can't find llvm-tblgen! You need to make sure that you have installed LLVM version $LLVM_VERSION")
endif()
endif()
# Check compatibility
execute_process (
COMMAND bash -c "echo -n `${LLVM_TBLGEN_TOOL} --version | grep -i 'version ${LLVM_VERSION}'`"
OUTPUT_VARIABLE IS_LLVM_TBLGEN_TOOL_COMPATIBLE
)
if(NOT IS_LLVM_TBLGEN_TOOL_COMPATIBLE)
message(FATAL_ERROR "LLVM version incompatibility! You need to make sure that you have installed LLVM version ${LLVM_VERSION}")
endif()
list(APPEND LLVM_CMAKE_EXTRA_ARGS "-DLLVM_TABLEGEN=${LLVM_TBLGEN_TOOL}")
endif()
ExternalProject_Add(LLVM
GIT_REPOSITORY https://github.com/llvm-mirror/llvm
GIT_TAG release_${LLVM_VERSION}0
GIT_SHALLOW 1
GIT_PROGRESS 1
PATCH_COMMAND ""
UPDATE_COMMAND ""
INSTALL_COMMAND ""
USES_TERMINAL_DOWNLOAD 1
USES_TERMINAL_CONFIGURE 1
USES_TERMINAL_BUILD 1
USES_TERMINAL_INSTALL 1
UPDATE_DISCONNECTED 1
DEPENDS Runtime PortableRuntime
LIST_SEPARATOR ::
CMAKE_ARGS -DHAVE_POSIX_SPAWN=0
-DLLVM_BUILD_DOCS=0
-DLLVM_BUILD_TESTS=0
-DLLVM_ENABLE_DOXYGEN=0
-DLLVM_ENABLE_PEDANTIC=0
-DLLVM_ENABLE_PIC=1
-DLLVM_ENABLE_WERROR=0
-DLLVM_INCLUDE_DOCS=0
-DLLVM_INCLUDE_EXAMPLES=0
-DLLVM_INCLUDE_TESTS=0
-DLLVM_OPTIMIZED_TABLEGEN=1
-DCMAKE_BUILD_TYPE=Release
-DLLVM_TARGET_ARCH=${OBJWRITER_TARGET_ARCH}
-DLLVM_TARGETS_TO_BUILD=${OBJWRITER_TARGET_ARCH}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_C_FLAGS=${LLVM_COMPILE_OPTIONS}
-DCMAKE_CXX_FLAGS=${LLVM_COMPILE_OPTIONS}
-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}
-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS}
-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}
-DOBJWRITER_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DOBJWRITER_C_FLAGS=${CORERT_NATIVE_COMPILE_OPTIONS}
-DOBJWRITER_CXX_FLAGS=${CORERT_NATIVE_COMPILE_OPTIONS}
${LLVM_CMAKE_EXTRA_ARGS}
)
ExternalProject_Get_Property(LLVM source_dir)
set(LLVM_SOURCE_DIR ${source_dir})
ExternalProject_Add_Step(LLVM PatchingLLVM
COMMAND git apply --3way ${OBJWRITER_ROOT}/llvm.patch COMMENT "Applying LLVM patch with ObjWriter fixes"
WORKING_DIRECTORY ${LLVM_SOURCE_DIR}
DEPENDEES patch
USES_TERMINAL 1
)
ExternalProject_Add_Step(LLVM ObjWriterInjection
COMMAND ${CMAKE_COMMAND} -E create_symlink ${OBJWRITER_ROOT} ${OBJWRITER_LLVM_POINT} COMMENT "mklink ${OBJWRITER_ROOT} -> ${OBJWRITER_LLVM_POINT}"
WORKING_DIRECTORY ${LLVM_SOURCE_DIR}
DEPENDEES patch
USES_TERMINAL 1
)
|