Initial support for the CMake build system.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56419 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
new file mode 100755
index 0000000..c3641ea
--- /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 0000000..b985b3e
--- /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 0000000..5f16c0a
--- /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 0000000..940c388
--- /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 0000000..0320ae3
--- /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 0000000..f87d16c
--- /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)