Welcome to mirror list, hosted at ThFree Co, Russian Federation.

CMakeLists.txt « llvmCap « ObjWriter « Native « src - github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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
  )