blob: 6ed89bae447713a831f6c5ae0a98e4e570dfae40 [file] [log] [blame]
Oscar Fuentes808e3a92008-11-16 04:13:19 +00001macro(llvm_config executable)
2 # extra args is the list of link components.
Oscar Fuentes3d01fc72008-09-22 01:08:49 +00003 if( MSVC )
Oscar Fuentes808e3a92008-11-16 04:13:19 +00004 msvc_llvm_config(${executable} ${ARGN})
Oscar Fuentes3d01fc72008-09-22 01:08:49 +00005 else( MSVC )
Oscar Fuentes808e3a92008-11-16 04:13:19 +00006 nix_llvm_config(${executable} ${ARGN})
Oscar Fuentes3d01fc72008-09-22 01:08:49 +00007 endif( MSVC )
Oscar Fuentes808e3a92008-11-16 04:13:19 +00008endmacro(llvm_config)
Oscar Fuentes3d01fc72008-09-22 01:08:49 +00009
10
Oscar Fuentes808e3a92008-11-16 04:13:19 +000011function(msvc_llvm_config executable)
12 set( link_components ${ARGN} )
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000013 foreach(c ${link_components})
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000014 if( c STREQUAL "jit" )
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000015 set(lfgs "${lfgs} /INCLUDE:_X86TargetMachineModule")
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000016 endif( c STREQUAL "jit" )
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000017 list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
18 if( NOT idx LESS 0 )
19 set(lfgs "${lfgs} /INCLUDE:_${c}TargetMachineModule")
20 list(FIND LLVM_ASMPRINTERS_FORCE_LINK ${c} idx)
21 if( NOT idx LESS 0 )
22 set(lfgs "${lfgs} /INCLUDE:_${c}AsmPrinterForceLink")
23 endif()
24 endif()
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000025 endforeach(c)
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000026
Oscar Fuentes808e3a92008-11-16 04:13:19 +000027 msvc_map_components_to_libraries(LIBRARIES ${link_components})
Oscar Fuentes9b17d972008-10-31 01:24:51 +000028 target_link_libraries(${executable} ${LIBRARIES})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000029
30 if( lfgs )
31 set_target_properties(${executable}
32 PROPERTIES
33 LINK_FLAGS ${lfgs})
34 endif()
Oscar Fuentes808e3a92008-11-16 04:13:19 +000035endfunction(msvc_llvm_config)
Oscar Fuentes9b17d972008-10-31 01:24:51 +000036
37
Oscar Fuentes808e3a92008-11-16 04:13:19 +000038function(msvc_map_components_to_libraries out_libs)
39 set( link_components ${ARGN} )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000040 foreach(c ${link_components})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000041 # add codegen/asmprinter
42 list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
43 if( NOT idx LESS 0 )
Oscar Fuentes808e3a92008-11-16 04:13:19 +000044 list(FIND llvm_libs "LLVM${c}CodeGen" idx)
45 if( NOT idx LESS 0 )
46 list(APPEND expanded_components "LLVM${c}CodeGen")
47 else()
48 list(FIND llvm_libs "LLVM${c}" idx)
49 if( NOT idx LESS 0 )
50 list(APPEND expanded_components "LLVM${c}")
51 else()
52 message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
53 endif()
54 endif()
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000055 list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
56 if( NOT asmidx LESS 0 )
57 list(APPEND expanded_components "LLVM${c}AsmPrinter")
58 endif()
59 elseif( c STREQUAL "native" )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000060 # TODO: we assume ARCH is X86. In this case, we must use nativecodegen
61 # component instead. Do nothing, as in llvm-config script.
62 elseif( c STREQUAL "nativecodegen" )
63 # TODO: we assume ARCH is X86.
64 list(APPEND expanded_components "LLVMX86CodeGen")
65 elseif( c STREQUAL "backend" )
66 # same case as in `native'.
67 elseif( c STREQUAL "engine" )
68 # TODO: as we assume we are on X86, this is `jit'.
69 list(APPEND expanded_components "LLVMJIT")
Oscar Fuentes9b17d972008-10-31 01:24:51 +000070 elseif( c STREQUAL "all" )
71 list(APPEND expanded_components ${llvm_libs})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000072 else( NOT idx LESS 0 )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000073 list(APPEND expanded_components LLVM${c})
Oscar Fuentes7f6f21e2008-11-15 22:51:03 +000074 endif( NOT idx LESS 0 )
Oscar Fuentes9b17d972008-10-31 01:24:51 +000075 endforeach(c)
76 # We must match capitalization.
77 string(TOUPPER "${llvm_libs}" capitalized_libs)
Oscar Fuentes808e3a92008-11-16 04:13:19 +000078 list(REMOVE_DUPLICATES expanded_components)
Oscar Fuentes9b17d972008-10-31 01:24:51 +000079 set(curr_idx 0)
80 list(LENGTH expanded_components lst_size)
81 while( ${curr_idx} LESS ${lst_size} )
82 list(GET expanded_components ${curr_idx} c)
83 string(TOUPPER "${c}" capitalized)
84 list(FIND capitalized_libs ${capitalized} idx)
85 if( idx LESS 0 )
86 message(FATAL_ERROR "Library ${c} not found in list of llvm libraries.")
87 endif( idx LESS 0 )
88 list(GET llvm_libs ${idx} canonical_lib)
89 list(APPEND result ${canonical_lib})
90 list(APPEND result ${MSVC_LIB_DEPS_${canonical_lib}})
91 list(APPEND expanded_components ${MSVC_LIB_DEPS_${canonical_lib}})
Oscar Fuentes808e3a92008-11-16 04:13:19 +000092 list(REMOVE_DUPLICATES expanded_components)
Oscar Fuentes9b17d972008-10-31 01:24:51 +000093 list(LENGTH expanded_components lst_size)
94 math(EXPR curr_idx "${curr_idx} + 1")
95 endwhile( ${curr_idx} LESS ${lst_size} )
96 list(REMOVE_DUPLICATES result)
97 set(${out_libs} ${result} PARENT_SCOPE)
98endfunction(msvc_map_components_to_libraries)
Oscar Fuentes3d01fc72008-09-22 01:08:49 +000099
100
Oscar Fuentes808e3a92008-11-16 04:13:19 +0000101macro(nix_llvm_config executable)
Oscar Fuentes3d01fc72008-09-22 01:08:49 +0000102 set(lc "")
Oscar Fuentes808e3a92008-11-16 04:13:19 +0000103 foreach(c ${ARGN})
Oscar Fuentes3d01fc72008-09-22 01:08:49 +0000104 set(lc "${lc} ${c}")
105 endforeach(c)
106 if( NOT HAVE_LLVM_CONFIG )
107 target_link_libraries(${executable}
108 "`${LLVM_TOOLS_BINARY_DIR}/llvm-config --libs ${lc}`")
109 else( NOT HAVE_LLVM_CONFIG )
110 # tbi: Error handling.
111 if( NOT PERL_FOUND )
112 message(FATAL_ERROR "Perl required but not found!")
113 endif( NOT PERL_FOUND )
114 execute_process(
115 COMMAND sh -c "${PERL_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/llvm-config --libs ${lc}"
116 RESULT_VARIABLE rv
117 OUTPUT_VARIABLE libs
118 OUTPUT_STRIP_TRAILING_WHITESPACE)
119 if(NOT rv EQUAL 0)
120 message(FATAL_ERROR "llvm-config failed for executable ${executable}")
121 endif(NOT rv EQUAL 0)
122 string(REPLACE " " ";" libs ${libs})
123 foreach(c ${libs})
124 if(c MATCHES ".*\\.o")
125 get_filename_component(fn ${c} NAME)
126 target_link_libraries(${executable}
127 ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${fn})
128 else(c MATCHES ".*\\.o")
129 string(REPLACE "-l" "" fn ${c})
130 target_link_libraries(${executable} ${fn})
131 endif(c MATCHES ".*\\.o")
132 endforeach(c)
133 endif( NOT HAVE_LLVM_CONFIG )
Oscar Fuentes808e3a92008-11-16 04:13:19 +0000134endmacro(nix_llvm_config)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000135
136
137# This data is used on MSVC for stablishing executable/library
138# dependencies. Comes from the llvm-config script, which is built and
139# installed on the bin directory for MinGW or Linux. At the end of the
140# script, you'll see lines like this:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000141
142# LLVMARMAsmPrinter.o: LLVMARMCodeGen.o libLLVMAsmPrinter.a libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMTarget.a
143
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000144# This is translated to:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000145
146# set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
147
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000148# It is necessary to remove the `lib' prefix, the `.a' and `.o'
149# suffixes. Watch out for this line:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000150
151# LLVMExecutionEngine.o LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
152
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000153# See how there are two elements before the colon. This must be
154# translated as if it were:
Oscar Fuentes4727f832008-10-31 01:37:26 +0000155
156# LLVMExecutionEngine.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
157# LLVMJIT.o: libLLVMCodeGen.a libLLVMCore.a libLLVMSupport.a libLLVMSystem.a libLLVMTarget.a
158
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000159# TODO: do this transformations on cmake.
Oscar Fuentes4727f832008-10-31 01:37:26 +0000160
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000161# It is very important that the LLVM built for extracting this data
162# must contain all targets, not just X86.
163
164
165set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMARMCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
166set(MSVC_LIB_DEPS_LLVMARMCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000167set(MSVC_LIB_DEPS_LLVMAlphaAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
168set(MSVC_LIB_DEPS_LLVMAlphaCodeGen LLVMAlphaAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000169set(MSVC_LIB_DEPS_LLVMCBackend LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000170set(MSVC_LIB_DEPS_LLVMCellSPUAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
171set(MSVC_LIB_DEPS_LLVMCellSPUCodeGen LLVMCellSPUAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000172set(MSVC_LIB_DEPS_LLVMCppBackend LLVMCore LLVMSupport LLVMTarget)
173set(MSVC_LIB_DEPS_LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
174set(MSVC_LIB_DEPS_LLVMJIT LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
175set(MSVC_LIB_DEPS_LLVMIA64 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
176set(MSVC_LIB_DEPS_LLVMInterpreter LLVMExecutionEngine LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
177set(MSVC_LIB_DEPS_LLVMMSIL LLVMAnalysis LLVMCodeGen LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)
178set(MSVC_LIB_DEPS_LLVMMips LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
179set(MSVC_LIB_DEPS_LLVMPIC16 LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
180set(MSVC_LIB_DEPS_LLVMPowerPCAsmPrinter LLVMPowerPCCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
181set(MSVC_LIB_DEPS_LLVMPowerPCCodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000182set(MSVC_LIB_DEPS_LLVMSparcAsmPrinter LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
183set(MSVC_LIB_DEPS_LLVMSparcCodeGen LLVMSparcAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000184set(MSVC_LIB_DEPS_LLVMX86AsmPrinter LLVMX86CodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMTarget)
185set(MSVC_LIB_DEPS_LLVMX86CodeGen LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000186set(MSVC_LIB_DEPS_LLVMXCore LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSelectionDAG LLVMSupport LLVMTarget)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000187set(MSVC_LIB_DEPS_LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget)
188set(MSVC_LIB_DEPS_LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
189set(MSVC_LIB_DEPS_LLVMAsmParser LLVMCore LLVMSupport)
190set(MSVC_LIB_DEPS_LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
191set(MSVC_LIB_DEPS_LLVMBitReader LLVMCore LLVMSupport)
192set(MSVC_LIB_DEPS_LLVMBitWriter LLVMCore LLVMSupport LLVMSystem)
193set(MSVC_LIB_DEPS_LLVMCodeGen LLVMAnalysis LLVMCore LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils)
194set(MSVC_LIB_DEPS_LLVMCore LLVMSupport LLVMSystem)
195set(MSVC_LIB_DEPS_LLVMDebugger LLVMAnalysis LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
Oscar Fuentes3af7fd52008-11-11 20:04:40 +0000196set(MSVC_LIB_DEPS_LLVMHello LLVMCore LLVMSupport)
Oscar Fuentes9b17d972008-10-31 01:24:51 +0000197set(MSVC_LIB_DEPS_LLVMInstrumentation LLVMCore LLVMScalarOpts LLVMSupport LLVMTransformUtils)
198set(MSVC_LIB_DEPS_LLVMLinker LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem)
199set(MSVC_LIB_DEPS_LLVMScalarOpts LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils)
200set(MSVC_LIB_DEPS_LLVMSelectionDAG LLVMAnalysis LLVMCodeGen LLVMCore LLVMSupport LLVMSystem LLVMTarget)
201set(MSVC_LIB_DEPS_LLVMSupport LLVMSystem)
202set(MSVC_LIB_DEPS_LLVMSystem )
203set(MSVC_LIB_DEPS_LLVMTarget LLVMCore LLVMSupport)
204set(MSVC_LIB_DEPS_LLVMTransformUtils LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMipa)
205set(MSVC_LIB_DEPS_LLVMipa LLVMAnalysis LLVMCore LLVMSupport)
206set(MSVC_LIB_DEPS_LLVMipo LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa)