summaryrefslogtreecommitdiff
path: root/cmake/modules
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/modules')
-rwxr-xr-xcmake/modules/AddLLVM.cmake39
-rwxr-xr-xcmake/modules/AddPartiallyLinkedObject.cmake21
-rwxr-xr-xcmake/modules/CheckCxxHashmap.cmake53
-rwxr-xr-xcmake/modules/CheckCxxHashset.cmake52
-rwxr-xr-xcmake/modules/FindBison.cmake52
-rwxr-xr-xcmake/modules/LLVMConfig.cmake57
6 files changed, 274 insertions, 0 deletions
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
new file mode 100755
index 0000000000..c3641eacd2
--- /dev/null
+++ b/cmake/modules/AddLLVM.cmake
@@ -0,0 +1,39 @@
+include(LLVMConfig)
+
+macro(add_llvm_library name)
+ add_library( ${name} ${ARGN} )
+ set( llvm_libs ${llvm_libs} ${name} PARENT_SCOPE)
+endmacro(add_llvm_library name)
+
+
+macro(add_llvm_executable name)
+ add_executable(${name} ${ARGN})
+ if( LLVM_LINK_COMPONENTS )
+ llvm_config(${name} ${LLVM_LINK_COMPONENTS})
+ endif( LLVM_LINK_COMPONENTS )
+ if( MSVC )
+ target_link_libraries(${name} ${llvm_libs})
+ else( MSVC )
+ add_dependencies(${name} llvm-config.target)
+ set_target_properties(${name}
+ PROPERTIES
+ LINK_FLAGS "-L ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
+ if( MINGW )
+ target_link_libraries(${name} DbgHelp psapi)
+ elseif( CMAKE_HOST_UNIX )
+ target_link_libraries(${name} dl)
+ endif( MINGW )
+ endif( MSVC )
+endmacro(add_llvm_executable name)
+
+
+macro(add_llvm_tool name)
+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
+ add_llvm_executable(${name} ${ARGN})
+endmacro(add_llvm_tool name)
+
+
+macro(add_llvm_example name)
+# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR})
+ add_llvm_executable(${name} ${ARGN})
+endmacro(add_llvm_example name)
diff --git a/cmake/modules/AddPartiallyLinkedObject.cmake b/cmake/modules/AddPartiallyLinkedObject.cmake
new file mode 100755
index 0000000000..b985b3eb28
--- /dev/null
+++ b/cmake/modules/AddPartiallyLinkedObject.cmake
@@ -0,0 +1,21 @@
+
+macro(add_partially_linked_object lib)
+ if( MSVC )
+ add_llvm_library( ${lib} ${ARGN})
+ else( MSVC )
+ set(pll ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${lib}.o)
+ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib)
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib)
+ add_library( ${lib} STATIC ${ARGN})
+ add_custom_command(OUTPUT ${pll}
+ MESSAGE "Building ${lib}.o..."
+ DEPENDS ${lib}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp_lib
+ COMMAND ar x ${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}
+ COMMAND ld -r *${CMAKE_CXX_OUTPUT_EXTENSION} -o ${pll}
+ COMMAND rm -f *${CMAKE_CXX_OUTPUT_EXTENSION}
+ )
+ add_custom_target(${lib}_pll ALL DEPENDS ${pll})
+ set( llvm_libs ${llvm_libs} ${pll} PARENT_SCOPE)
+ endif( MSVC )
+endmacro(add_partially_linked_object lib)
diff --git a/cmake/modules/CheckCxxHashmap.cmake b/cmake/modules/CheckCxxHashmap.cmake
new file mode 100755
index 0000000000..5f16c0ac44
--- /dev/null
+++ b/cmake/modules/CheckCxxHashmap.cmake
@@ -0,0 +1,53 @@
+# - Check if for hash_map.
+# CHECK_HASHMAP ()
+#
+
+include(CheckCXXSourceCompiles)
+
+macro(CHECK_HASHMAP)
+ message(STATUS "Checking for C++ hash_map implementation...")
+ check_cxx_source_compiles("
+ #include <ext/hash_map>
+ int main() {
+ __gnu_cxx::hash_map<int, int> t;
+ }
+"
+ HAVE_GNU_EXT_HASH_MAP
+ )
+ if(HAVE_GNU_EXT_HASH_MAP)
+ message(STATUS "C++ hash_map found in 'ext' dir in namespace __gnu_cxx::")
+ endif(HAVE_GNU_EXT_HASH_MAP)
+
+ check_cxx_source_compiles("
+ #include <ext/hash_map>
+ int main() {
+ std::hash_map<int, int> t;
+ }
+"
+ HAVE_STD_EXT_HASH_MAP
+ )
+ if(HAVE_STD_EXT_HASH_MAP)
+ message(STATUS "C++ hash_map found in 'ext' dir in namespace std::")
+ endif(HAVE_STD_EXT_HASH_MAP)
+
+ check_cxx_source_compiles("
+ #include <hash_map>
+ int main() {
+ hash_map<int, int> t;
+ }
+"
+ HAVE_GLOBAL_HASH_MAP
+ )
+ if(HAVE_GLOBAL_HASH_MAP)
+ message(STATUS "C++ hash_map found in global namespace")
+ endif(HAVE_GLOBAL_HASH_MAP)
+
+ if(NOT HAVE_GNU_EXT_HASH_MAP)
+ if(NOT HAVE_STD_EXT_HASH_MAP)
+ if(NOT HAVE_GLOBAL_HASH_MAP)
+ message(STATUS "C++ hash_map not found")
+ endif(NOT HAVE_GLOBAL_HASH_MAP)
+ endif(NOT HAVE_STD_EXT_HASH_MAP)
+ endif(NOT HAVE_GNU_EXT_HASH_MAP)
+
+endmacro(CHECK_HASHMAP)
diff --git a/cmake/modules/CheckCxxHashset.cmake b/cmake/modules/CheckCxxHashset.cmake
new file mode 100755
index 0000000000..940c388127
--- /dev/null
+++ b/cmake/modules/CheckCxxHashset.cmake
@@ -0,0 +1,52 @@
+# - Check if for hash_set.
+# CHECK_HASHSET ()
+#
+
+include(CheckCXXSourceCompiles)
+
+macro(CHECK_HASHSET)
+ message(STATUS "Checking for C++ hash_set implementation...")
+ check_cxx_source_compiles("
+ #include <ext/hash_set>
+ int main() {
+ __gnu_cxx::hash_set<int> t;
+ }
+"
+ HAVE_GNU_EXT_HASH_SET
+ )
+ if(HAVE_GNU_EXT_HASH_SET)
+ message(STATUS "C++ hash_set found in 'ext' dir in namespace __gnu_cxx::")
+ endif(HAVE_GNU_EXT_HASH_SET)
+
+ check_cxx_source_compiles("
+ #include <ext/hash_set>
+ int main() {
+ std::hash_set<int> t;
+ }
+"
+ HAVE_STD_EXT_HASH_SET
+ )
+ if(HAVE_STD_EXT_HASH_SET)
+ message(STATUS "C++ hash_set found in 'ext' dir in namespace std::")
+ endif(HAVE_STD_EXT_HASH_SET)
+
+ check_cxx_source_compiles("
+ #include <hash_set>
+ int main() {
+ hash_set<int> t;
+ }
+"
+ HAVE_GLOBAL_HASH_SET
+ )
+ if(HAVE_GLOBAL_HASH_SET)
+ message(STATUS "C++ hash_set found in global namespace")
+ endif(HAVE_GLOBAL_HASH_SET)
+
+ if(NOT HAVE_GNU_EXT_HASH_SET)
+ if(NOT HAVE_STD_EXT_HASH_SET)
+ if(NOT HAVE_GLOBAL_HASH_SET)
+ message(STATUS "C++ hash_set not found")
+ endif(NOT HAVE_GLOBAL_HASH_SET)
+ endif(NOT HAVE_STD_EXT_HASH_SET)
+ endif(NOT HAVE_GNU_EXT_HASH_SET)
+endmacro(CHECK_HASHSET)
diff --git a/cmake/modules/FindBison.cmake b/cmake/modules/FindBison.cmake
new file mode 100755
index 0000000000..0320ae3ce1
--- /dev/null
+++ b/cmake/modules/FindBison.cmake
@@ -0,0 +1,52 @@
+# - Try to find Bison
+# Once done this will define
+#
+# BISON_FOUND - system has Bison
+# BISON_EXECUTABLE - path of the bison executable
+# BISON_VERSION - the version string, like "2.5.31"
+#
+
+MACRO(FIND_BISON)
+ FIND_PROGRAM(BISON_EXECUTABLE NAMES bison)
+
+ IF(BISON_EXECUTABLE)
+ SET(BISON_FOUND TRUE)
+
+ EXECUTE_PROCESS(COMMAND ${BISON_EXECUTABLE} --version
+ OUTPUT_VARIABLE _BISON_VERSION
+ )
+ string (REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" BISON_VERSION "${_bison_VERSION}")
+ ENDIF(BISON_EXECUTABLE)
+
+ IF(BISON_FOUND)
+ IF(NOT Bison_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Bison: ${BISON_EXECUTABLE}")
+ ENDIF(NOT Bison_FIND_QUIETLY)
+ ELSE(BISON_FOUND)
+ IF(Bison_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find Bison")
+ ENDIF(Bison_FIND_REQUIRED)
+ ENDIF(BISON_FOUND)
+ENDMACRO(FIND_BISON)
+
+MACRO(BISON_GENERATOR _PREFIX _Y_INPUT _H_OUTPUT _CPP_OUTPUT)
+ IF(BISON_EXECUTABLE)
+ GET_FILENAME_COMPONENT(_Y_DIR ${_Y_INPUT} PATH)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_CPP_OUTPUT}
+ OUTPUT ${_H_OUTPUT}
+ DEPENDS ${_Y_INPUT}
+ COMMAND ${BISON_EXECUTABLE}
+ ARGS
+ -p ${_PREFIX} -o"${_CPP_OUTPUT}"
+ --defines="${_H_OUTPUT}" ${_Y_INPUT}
+ WORKING_DIRECTORY ${_Y_DIR}
+ )
+ SET_SOURCE_FILES_PROPERTIES(
+ ${_CPP_OUTPUT} ${_H_OUTPUT}
+ GENERATED
+ )
+ ELSE(BISON_EXECUTABLE)
+ MESSAGE(SEND_ERROR "Can't find bison program, and it's required")
+ ENDIF(BISON_EXECUTABLE)
+ENDMACRO(BISON_GENERATOR)
diff --git a/cmake/modules/LLVMConfig.cmake b/cmake/modules/LLVMConfig.cmake
new file mode 100755
index 0000000000..f87d16cd1f
--- /dev/null
+++ b/cmake/modules/LLVMConfig.cmake
@@ -0,0 +1,57 @@
+macro(llvm_config executable link_components)
+ if( MSVC )
+ msvc_llvm_config(${executable} ${link_components})
+ else( MSVC )
+ nix_llvm_config(${executable} ${link_components})
+ endif( MSVC )
+endmacro(llvm_config executable link_components)
+
+
+macro(msvc_llvm_config executable link_components)
+ foreach(c ${link_components})
+ message(STATUS ${c})
+ if( c STREQUAL "jit" )
+ message(STATUS "linking jit")
+ set_target_properties(${executable}
+ PROPERTIES
+ LINK_FLAGS "/INCLUDE:_X86TargetMachineModule")
+ endif( c STREQUAL "jit" )
+ endforeach(c)
+ target_link_libraries(${executable} ${llvm_libs})
+endmacro(msvc_llvm_config executable link_components)
+
+
+macro(nix_llvm_config executable link_components)
+ set(lc "")
+ foreach(c ${LLVM_LINK_COMPONENTS})
+ set(lc "${lc} ${c}")
+ endforeach(c)
+ if( NOT HAVE_LLVM_CONFIG )
+ target_link_libraries(${executable}
+ "`${LLVM_TOOLS_BINARY_DIR}/llvm-config --libs ${lc}`")
+ else( NOT HAVE_LLVM_CONFIG )
+ # tbi: Error handling.
+ if( NOT PERL_FOUND )
+ message(FATAL_ERROR "Perl required but not found!")
+ endif( NOT PERL_FOUND )
+ execute_process(
+ COMMAND sh -c "${PERL_EXECUTABLE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/llvm-config --libs ${lc}"
+ RESULT_VARIABLE rv
+ OUTPUT_VARIABLE libs
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(NOT rv EQUAL 0)
+ message(FATAL_ERROR "llvm-config failed for executable ${executable}")
+ endif(NOT rv EQUAL 0)
+ string(REPLACE " " ";" libs ${libs})
+ foreach(c ${libs})
+ if(c MATCHES ".*\\.o")
+ get_filename_component(fn ${c} NAME)
+ target_link_libraries(${executable}
+ ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${fn})
+ else(c MATCHES ".*\\.o")
+ string(REPLACE "-l" "" fn ${c})
+ target_link_libraries(${executable} ${fn})
+ endif(c MATCHES ".*\\.o")
+ endforeach(c)
+ endif( NOT HAVE_LLVM_CONFIG )
+endmacro(nix_llvm_config executable link_components)