blob: dbaf773a174403f322815ee8ae335aca701be74a [file] [log] [blame]
Oscar Fuentesa229b3c2008-09-22 01:08:49 +00001include(TestBigEndian)
2
Oscar Fuentes06eef1c2009-08-12 04:16:19 +00003include(FindPerl)
Oscar Fuentesa229b3c2008-09-22 01:08:49 +00004if( NOT PERL_FOUND )
5 message(FATAL_ERROR "Perl required but not found!")
6endif( NOT PERL_FOUND )
7
8set(PERL ${PERL_EXECUTABLE})
9set(VERSION PACKAGE_VERSION)
Oscar Fuentescde00a52011-04-01 19:36:06 +000010set(PREFIX ${CMAKE_INSTALL_PREFIX})
Daniel Dunbara249c422009-09-22 06:09:31 +000011set(abs_top_srcdir ${LLVM_MAIN_SRC_DIR})
12set(abs_top_builddir ${LLVM_BINARY_DIR})
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000013execute_process(COMMAND date
14 OUTPUT_VARIABLE LLVM_CONFIGTIME
15 OUTPUT_STRIP_TRAILING_WHITESPACE)
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000016# LLVM_ON_UNIX and LLVM_ON_WIN32 already set.
17# those are set to blank by `autoconf' on MinGW, so it seems they are not required:
18#set(LLVMGCCDIR "")
19#set(LLVMGCC "")
20#set(LLVMGXX "")
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000021test_big_endian(IS_BIG_ENDIAN)
22if( IS_BIG_ENDIAN )
23 set(ENDIAN "big")
24else( IS_BIG_ENDIAN )
25 set(ENDIAN "little")
26endif( IS_BIG_ENDIAN )
27set(SHLIBEXT ${LTDL_SHLIB_EXT})
28#EXEEXT already set.
29set(OS "${CMAKE_SYSTEM}")
Oscar Fuentes916fb1a2011-03-19 22:52:25 +000030set(target "${TARGET_TRIPLE}")
Xerxes Ranbya0f10882009-09-16 14:36:35 +000031set(ARCH "${LLVM_NATIVE_ARCH}")
Oscar Fuentesbf81f792008-10-26 00:47:52 +000032
Oscar Fuentes10a71da2009-05-27 15:49:33 +000033get_system_libs(LLVM_SYSTEM_LIBS_LIST)
34foreach(l ${LLVM_SYSTEM_LIBS_LIST})
35 set(LLVM_SYSTEM_LIBS ${LLVM_SYSTEM_LIBS} "-l${l}")
36endforeach()
37
Oscar Fuentescdc95492008-09-26 04:40:32 +000038foreach(c ${LLVM_TARGETS_TO_BUILD})
39 set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
40endforeach(c)
41set(TARGETS_TO_BUILD ${TARGETS_BUILT})
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000042set(TARGET_HAS_JIT "1") # TODO
43
44# Avoids replacement at config-time:
45set(LLVM_CPPFLAGS "@LLVM_CPPFLAGS@")
46set(LLVM_CFLAGS "@LLVM_CFLAGS@")
47set(LLVM_CXXFLAGS "@LLVM_CXXFLAGS@")
48set(LLVM_LDFLAGS "@LLVM_LDFLAGS@")
49set(LIBS "@LIBS@")
50set(LLVM_BUILDMODE "@LLVM_BUILDMODE@")
51
52configure_file(
53 ${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.in.in
54 ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in
55 @ONLY
56)
57
Oscar Fuentescae1b902011-03-19 22:52:33 +000058set(LIBDEPS LibDeps.txt)
59set(LIBDEPS_TMP LibDeps.txt.tmp)
60set(FINAL_LIBDEPS FinalLibDeps.txt)
Oscar Fuentesb97e9632009-01-07 19:24:44 +000061set(LLVM_CONFIG ${LLVM_TOOLS_BINARY_DIR}/llvm-config)
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000062set(LLVM_CONFIG_IN ${CMAKE_CURRENT_BINARY_DIR}/llvm-config.in)
63
Oscar Fuentesb45a43a2008-11-09 18:53:19 +000064if( CMAKE_CROSSCOMPILING )
65 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
66endif()
67
Oscar Fuentesa6da0272008-11-09 20:26:31 +000068find_program(NM_PATH nm PATH_SUFFIXES /bin)
69
Oscar Fuentesb45a43a2008-11-09 18:53:19 +000070if( NOT NM_PATH )
Oscar Fuentesa6da0272008-11-09 20:26:31 +000071 message(FATAL_ERROR "`nm' not found")
Oscar Fuentesb45a43a2008-11-09 18:53:19 +000072endif()
73
Oscar Fuentes5ed96262011-02-18 22:06:14 +000074get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS)
75
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000076add_custom_command(OUTPUT ${LIBDEPS_TMP}
Douglas Gregor6d1ec142009-03-16 22:53:26 +000077 COMMAND ${PERL_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/GenLibDeps.pl -flat ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR} ${NM_PATH} > ${LIBDEPS_TMP}
Oscar Fuentes93bf9882008-11-11 17:10:58 +000078 DEPENDS ${llvm_libs}
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000079 COMMENT "Regenerating ${LIBDEPS_TMP}")
80
81add_custom_command(OUTPUT ${LIBDEPS}
Oscar Fuentes7e173692008-11-15 20:51:18 +000082 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LIBDEPS_TMP} ${LIBDEPS}
83 DEPENDS ${LIBDEPS_TMP}
Oscar Fuentes5b823e02010-08-15 22:14:36 +000084 COMMENT "Updating ${LIBDEPS} if necessary...")
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000085
Oscar Fuentes6e063792010-10-02 03:04:49 +000086# This must stop the build if find-cycles.pl returns error:
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000087add_custom_command(OUTPUT ${FINAL_LIBDEPS}
Oscar Fuentes6e063792010-10-02 03:04:49 +000088 COMMAND ${CMAKE_COMMAND} -E remove -f ${FINAL_LIBDEPS} ${FINAL_LIBDEPS}.tmp
89 COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/find-cycles.pl < ${LIBDEPS} > ${FINAL_LIBDEPS}.tmp
90 COMMAND ${CMAKE_COMMAND} -E copy ${FINAL_LIBDEPS}.tmp ${FINAL_LIBDEPS}
Oscar Fuentesa229b3c2008-09-22 01:08:49 +000091 DEPENDS ${LIBDEPS}
92 COMMENT "Checking for cyclic dependencies between LLVM libraries.")
93
Oscar Fuentescde00a52011-04-01 19:36:06 +000094set(C_FLGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
95message(STATUS "C_FLGS: ${C_FLGS}")
96message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
97message(STATUS "LLVM_DEFINITIONS: ${LLVM_DEFINITIONS}")
98message(STATUS "other: ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}}")
99set(CXX_FLGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
100set(CPP_FLGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${LLVM_DEFINITIONS}")
Oscar Fuentesbda403b2009-04-04 22:41:07 +0000101
Oscar Fuentes632ad9b2011-01-27 19:29:48 +0000102# We don't want certain flags on the output of
103# llvm-config --cflags --cxxflags
104macro(remove_option_from_llvm_config option)
105 llvm_replace_compiler_option(C_FLGS "${option}" "")
106 llvm_replace_compiler_option(CXX_FLGS "${option}" "")
107 llvm_replace_compiler_option(CPP_FLGS "${option}" "")
108endmacro(remove_option_from_llvm_config)
109remove_option_from_llvm_config("-pedantic")
110remove_option_from_llvm_config("-Wall")
111remove_option_from_llvm_config("-W")
112
Oscar Fuentesa229b3c2008-09-22 01:08:49 +0000113add_custom_command(OUTPUT ${LLVM_CONFIG}
Oscar Fuentescae1b902011-03-19 22:52:33 +0000114 COMMAND echo s!@LLVM_CPPFLAGS@!${CPP_FLGS}! > temp.sed
115 COMMAND echo s!@LLVM_CFLAGS@!${C_FLGS}! >> temp.sed
116 COMMAND echo s!@LLVM_CXXFLAGS@!${CXX_FLGS}! >> temp.sed
Oscar Fuentescf03f4b2009-04-03 12:16:32 +0000117 # TODO: Use general flags for linking! not just for shared libs:
Oscar Fuentescae1b902011-03-19 22:52:33 +0000118 COMMAND echo s!@LLVM_LDFLAGS@!${CMAKE_SHARED_LINKER_FLAGS}! >> temp.sed
119 COMMAND echo s!@LIBS@!${LLVM_SYSTEM_LIBS}! >> temp.sed
120 COMMAND echo s!@LLVM_BUILDMODE@!${CMAKE_BUILD_TYPE}! >> temp.sed
Oscar Fuentesa229b3c2008-09-22 01:08:49 +0000121 COMMAND sed -f temp.sed < ${LLVM_CONFIG_IN} > ${LLVM_CONFIG}
Oscar Fuentesb97e9632009-01-07 19:24:44 +0000122 COMMAND ${CMAKE_COMMAND} -E remove -f temp.sed
Oscar Fuentesa229b3c2008-09-22 01:08:49 +0000123 COMMAND cat ${FINAL_LIBDEPS} >> ${LLVM_CONFIG}
124 COMMAND chmod +x ${LLVM_CONFIG}
Oscar Fuentescae1b902011-03-19 22:52:33 +0000125 VERBATIM
Oscar Fuentesa229b3c2008-09-22 01:08:49 +0000126 DEPENDS ${FINAL_LIBDEPS} ${LLVM_CONFIG_IN}
127 COMMENT "Building llvm-config script."
128 )
129
130add_custom_target(llvm-config.target ALL
Oscar Fuentes8807bdd2008-09-22 18:21:51 +0000131 DEPENDS ${LLVM_CONFIG})
132
Oscar Fuentesab046502011-02-22 15:40:20 +0000133add_dependencies( llvm-config.target ${llvm_libs} )
Oscar Fuentes64c99622008-10-22 02:56:07 +0000134
Michael J. Spencer93c9b2e2010-09-13 23:59:48 +0000135# Make sure that llvm-config builds before the llvm tools, so we have
136# LibDeps.txt and can use it for updating the hard-coded library
137# dependencies on cmake/modules/LLVMLibDeps.cmake when the tools'
138# build fail due to outdated dependencies:
Oscar Fuentes9082c712009-08-14 01:55:05 +0000139set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} llvm-config.target)
140
Oscar Fuentes64c99622008-10-22 02:56:07 +0000141install(FILES ${LLVM_CONFIG}
142 PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
143 WORLD_READ WORLD_EXECUTE
144 DESTINATION bin)
Oscar Fuentes5444cb12009-08-14 04:29:33 +0000145
Oscar Fuentes1ea4b3a2009-08-14 16:59:41 +0000146
Michael J. Spencer93c9b2e2010-09-13 23:59:48 +0000147# Regeneration of library dependencies.
148
149# See the comments at the end of cmake/modules/LLVMConfig.cmake for
150# notes and guidelines.
151
152set(LLVMLibDeps ${LLVM_MAIN_SRC_DIR}/cmake/modules/LLVMLibDeps.cmake)
153set(LLVMLibDeps_TMP ${CMAKE_CURRENT_BINARY_DIR}/LLVMLibDeps.cmake.tmp)
154
155add_custom_command(OUTPUT ${LLVMLibDeps_TMP}
156 COMMAND sed -e s'@\\.a@@g' -e s'@\\.so@@g' -e 's@libLLVM@LLVM@g' -e 's@: @ @' -e 's@\\\(.*\\\)@set\(MSVC_LIB_DEPS_\\1\)@' ${FINAL_LIBDEPS} > ${LLVMLibDeps_TMP}
157 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${LLVMLibDeps_TMP} ${LLVMLibDeps}
158 DEPENDS ${FINAL_LIBDEPS}
159 COMMENT "Updating cmake library dependencies file ${LLVMLibDeps}"
160 )
161
162if( LLVM_TARGETS_TO_BUILD STREQUAL LLVM_ALL_TARGETS )
163 add_custom_target(llvmlibdeps.target ALL DEPENDS ${LLVMLibDeps_TMP})
164 add_dependencies(llvmlibdeps.target llvm-config.target)
165 set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} llvmlibdeps.target)
166endif()
167
Oscar Fuentes5444cb12009-08-14 04:29:33 +0000168set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)