blob: 3d5e3bc55a4659c2784d2df0378acf40514d0c00 [file] [log] [blame]
Oscar Fuentes3d01fc72008-09-22 01:08:49 +00001macro(llvm_config executable link_components)
2 if( MSVC )
3 msvc_llvm_config(${executable} ${link_components})
4 else( MSVC )
5 nix_llvm_config(${executable} ${link_components})
6 endif( MSVC )
7endmacro(llvm_config executable link_components)
8
9
Oscar Fuentes9b17d972008-10-31 01:24:51 +000010function(msvc_llvm_config executable link_components)
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000011 foreach(c ${link_components})
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000012 if( c STREQUAL "jit" )
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000013 set(lfgs "${lfgs} /INCLUDE:_X86TargetMachineModule")
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000014 endif( c STREQUAL "jit" )
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000015 list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
16 if( NOT idx LESS 0 )
17 set(lfgs "${lfgs} /INCLUDE:_${c}TargetMachineModule")
18 list(FIND LLVM_ASMPRINTERS_FORCE_LINK ${c} idx)
19 if( NOT idx LESS 0 )
20 set(lfgs "${lfgs} /INCLUDE:_${c}AsmPrinterForceLink")
21 endif()
22 endif()
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000023 endforeach(c)
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000024
Oscar Fuentes9b17d972008-10-31 01:24:51 +000025 msvc_map_components_to_libraries(${link_components} LIBRARIES)
26 target_link_libraries(${executable} ${LIBRARIES})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000027
28 if( lfgs )
29 set_target_properties(${executable}
30 PROPERTIES
31 LINK_FLAGS ${lfgs})
32 endif()
Oscar Fuentes9b17d972008-10-31 01:24:51 +000033endfunction(msvc_llvm_config executable link_components)
34
35
36function(msvc_map_components_to_libraries link_components out_libs)
37 foreach(c ${link_components})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000038 # add codegen/asmprinter
39 list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
40 if( NOT idx LESS 0 )
41 list(APPEND expanded_components "LLVM${c}CodeGen")
42 list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
43 if( NOT asmidx LESS 0 )
44 list(APPEND expanded_components "LLVM${c}AsmPrinter")
45 endif()
46 elseif( c STREQUAL "native" )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000047 # TODO: we assume ARCH is X86. In this case, we must use nativecodegen
48 # component instead. Do nothing, as in llvm-config script.
49 elseif( c STREQUAL "nativecodegen" )
50 # TODO: we assume ARCH is X86.
51 list(APPEND expanded_components "LLVMX86CodeGen")
52 elseif( c STREQUAL "backend" )
53 # same case as in `native'.
54 elseif( c STREQUAL "engine" )
55 # TODO: as we assume we are on X86, this is `jit'.
56 list(APPEND expanded_components "LLVMJIT")
Oscar Fuentes9b17d972008-10-31 01:24:51 +000057 elseif( c STREQUAL "all" )
58 list(APPEND expanded_components ${llvm_libs})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000059 else( NOT idx LESS 0 )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000060 list(APPEND expanded_components LLVM${c})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000061 endif( NOT idx LESS 0 )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000062 endforeach(c)
63 # We must match capitalization.
64 string(TOUPPER "${llvm_libs}" capitalized_libs)
65 set(curr_idx 0)
66 list(LENGTH expanded_components lst_size)
67 while( ${curr_idx} LESS ${lst_size} )
68 list(GET expanded_components ${curr_idx} c)
69 string(TOUPPER "${c}" capitalized)
70 list(FIND capitalized_libs ${capitalized} idx)
71 if( idx LESS 0 )
72 message(FATAL_ERROR "Library ${c} not found in list of llvm libraries.")
73 endif( idx LESS 0 )
74 list(GET llvm_libs ${idx} canonical_lib)
75 list(APPEND result ${canonical_lib})
76 list(APPEND result ${MSVC_LIB_DEPS_${canonical_lib}})
77 list(APPEND expanded_components ${MSVC_LIB_DEPS_${canonical_lib}})
78 list(LENGTH expanded_components lst_size)
79 math(EXPR curr_idx "${curr_idx} + 1")
80 endwhile( ${curr_idx} LESS ${lst_size} )
81 list(REMOVE_DUPLICATES result)
82 set(${out_libs} ${result} PARENT_SCOPE)
83endfunction(msvc_map_components_to_libraries)
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000084
85
86macro(nix_llvm_config executable link_components)
87 set(lc "")
88 foreach(c ${LLVM_LINK_COMPONENTS})
89 set(lc "${lc} ${c}")
90 endforeach(c)
91 if( NOT HAVE_LLVM_CONFIG )
92 target_link_libraries(${executable}
93 "`${LLVM_TOOLS_BINARY_DIR}/llvm-config --libs ${lc}`")
94 else( NOT HAVE_LLVM_CONFIG )
95 # tbi: Error handling.
96 if( NOT PERL_FOUND )
97 message(FATAL_ERROR "Perl required but not found!")
98 endif( NOT PERL_FOUND )
99 execute_process(
100 COMMAND sh -c "${PERL_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/llvm-config --libs ${lc}"
101 RESULT_VARIABLE rv
102 OUTPUT_VARIABLE libs
103 OUTPUT_STRIP_TRAILING_WHITESPACE)
104 if(NOT rv EQUAL 0)
105 message(FATAL_ERROR "llvm-config failed for executable ${executable}")
106 endif(NOT rv EQUAL 0)
107 string(REPLACE " " ";" libs ${libs})
108 foreach(c ${libs})
109 if(c MATCHES ".*\\.o")
110 get_filename_component(fn ${c} NAME)
111 target_link_libraries(${executable}
112 ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${fn})
113 else(c MATCHES ".*\\.o")
114 string(REPLACE "-l" "" fn ${c})
115 target_link_libraries(${executable} ${fn})
116 endif(c MATCHES ".*\\.o")
117 endforeach(c)
118 endif( NOT HAVE_LLVM_CONFIG )
119endmacro(nix_llvm_config executable link_components)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000120
121
122# This data is used on MSVC for stablishing executable/library
123# dependencies. Comes from the llvm-config script, which is built and
124# installed on the bin directory for MinGW or Linux. At the end of the
125# script, you'll see lines like this:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000126
127# LLVMARMAsmPrinter.o: LLVMARMCodeGen.o libLLVMAsmPrinter.a libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMTarget.a
128
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000129# This is translated to:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000130
131# set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
132
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000133# It is necessary to remove the `lib' prefix, the `.a' and `.o'
134# suffixes. Watch out for this line:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000135
136# LLVMExecutionEngine.o LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
137
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000138# See how there are two elements before the colon. This must be
139# translated as if it were:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000140
141# LLVMExecutionEngine.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
142# LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
143
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000144# TODO: do this transformations on cmake.
Oscar Fuentes4727f832008-10-31 01:37:26 +0000145
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000146# It is very important that the LLVM built for extracting this data
147# must contain all targets, not just X86.
148
149
150set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
151set(MSVC_LIB_DEPS_LLVMARMCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000152set(MSVC_LIB_DEPS_LLVMAlphaAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
153set(MSVC_LIB_DEPS_LLVMAlphaCodeGen LLVMAlphaAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000154set(MSVC_LIB_DEPS_LLVMCBackend LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000155set(MSVC_LIB_DEPS_LLVMCellSPUAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
156set(MSVC_LIB_DEPS_LLVMCellSPUCodeGen LLVMCellSPUAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000157set(MSVC_LIB_DEPS_LLVMCppBackend LLVMCore LLVMSupport LLVMTarget)
158set(MSVC_LIB_DEPS_LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
159set(MSVC_LIB_DEPS_LLVMJIT LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
160set(MSVC_LIB_DEPS_LLVMIA64 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
161set(MSVC_LIB_DEPS_LLVMInterpreter LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
162set(MSVC_LIB_DEPS_LLVMMSIL LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
163set(MSVC_LIB_DEPS_LLVMMips LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
164set(MSVC_LIB_DEPS_LLVMPIC16 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
165set(MSVC_LIB_DEPS_LLVMPowerPCAsmPrinter LLVMPowerPCCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
166set(MSVC_LIB_DEPS_LLVMPowerPCCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000167set(MSVC_LIB_DEPS_LLVMSparcAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
168set(MSVC_LIB_DEPS_LLVMSparcCodeGen LLVMSparcAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000169set(MSVC_LIB_DEPS_LLVMX86AsmPrinter LLVMX86CodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
170set(MSVC_LIB_DEPS_LLVMX86CodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000171set(MSVC_LIB_DEPS_LLVMXCore LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000172set(MSVC_LIB_DEPS_LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget)
173set(MSVC_LIB_DEPS_LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
174set(MSVC_LIB_DEPS_LLVMAsmParser LLVMCore LLVMSupport)
175set(MSVC_LIB_DEPS_LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
176set(MSVC_LIB_DEPS_LLVMBitReader LLVMCore LLVMSupport)
177set(MSVC_LIB_DEPS_LLVMBitWriter LLVMCore LLVMSupport LLVMSystem)
178set(MSVC_LIB_DEPS_LLVMCodeGen LLVMAnalysis LLVMCore LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils)
179set(MSVC_LIB_DEPS_LLVMCore LLVMSupport LLVMSystem)
180set(MSVC_LIB_DEPS_LLVMDebugger LLVMAnalysis LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000181set(MSVC_LIB_DEPS_LLVMHello LLVMCore LLVMSupport)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000182set(MSVC_LIB_DEPS_LLVMInstrumentation LLVMCore LLVMScalarOpts LLVMSupport LLVMTransformUtils)
183set(MSVC_LIB_DEPS_LLVMLinker LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
184set(MSVC_LIB_DEPS_LLVMScalarOpts LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils)
185set(MSVC_LIB_DEPS_LLVMSelectionDAG LLVMAnalysis LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
186set(MSVC_LIB_DEPS_LLVMSupport LLVMSystem)
187set(MSVC_LIB_DEPS_LLVMSystem )
188set(MSVC_LIB_DEPS_LLVMTarget LLVMCore LLVMSupport)
189set(MSVC_LIB_DEPS_LLVMTransformUtils LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMipa)
190set(MSVC_LIB_DEPS_LLVMipa LLVMAnalysis LLVMCore LLVMSupport)
191set(MSVC_LIB_DEPS_LLVMipo LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)