After three iterations of community review, we believe that this new
CMAKE buld system should meet everyone's requirements.

Enhanced CMake Build System Commit 

* Supports Linux, Mac, Windows, and IntelĀ® Xeon Phi builds
* Supports building with gcc, icc, clang, and Visual Studio compilers
* Supports bulding "fat" libraries on OS/X with clang
* Details and documentation on how to use build system 
  are in Build_With_CMake.txt
* To use the old CMake build system (corresponds to 
  CMakeLists.txt.old), just rename CMakeLists.txt to
  CMakeLists.txt.other and rename CMakeLists.txt.old to
  CMakeLists.txt

llvm-svn: 214850
diff --git a/openmp/runtime/cmake/CommonFlags.cmake b/openmp/runtime/cmake/CommonFlags.cmake
new file mode 100644
index 0000000..301a3c4
--- /dev/null
+++ b/openmp/runtime/cmake/CommonFlags.cmake
@@ -0,0 +1,133 @@
+# This file holds the common flags independent of compiler
+# The flag types are: 
+#   1) Assembly flags          (append_asm_flags_common)
+#   2) C/C++ Compiler flags    (append_c_and_cxx_flags_common)
+#   3) Fortran Compiler flags  (append_fort_flags_common)
+#   4) Linker flags            (append_linker_flags_common)
+#   5) Archiver flags          (append_archiver_flags_common)
+
+# These append_* macros all append to the corresponding list variable holding the flags.
+macro(append_c_flags new_flag)
+    list(APPEND local_c_flags    "${new_flag}")
+endmacro()
+
+macro(append_cxx_flags new_flag)
+    list(APPEND local_cxx_flags  "${new_flag}")
+endmacro()
+
+macro(append_c_and_cxx_flags new_flag)
+    append_c_flags("${new_flag}")
+    append_cxx_flags("${new_flag}")
+endmacro()
+
+macro(append_asm_flags new_flag)
+    list(APPEND local_asm_flags  "${new_flag}")
+endmacro()
+
+macro(append_fort_flags new_flag)
+    list(APPEND local_fort_flags "${new_flag}")
+endmacro()
+
+# The difference between linker_flags and linker_flags_libs is linker_flags_libs
+# is put at the end of the linker command where linking libraries should be done.
+macro(append_linker_flags new_flag)
+    list(APPEND local_ld_flags   "${new_flag}")
+endmacro()
+
+macro(append_linker_flags_library new_flag)
+    list(APPEND local_ld_flags_libs "${new_flag}")
+endmacro()
+
+macro(append_archiver_flags new_flag)
+    list(APPEND local_ar_flags   "${new_flag}")
+endmacro()
+
+#########################################################
+# Global Assembly flags
+function(append_asm_flags_common input_asm_flags)
+    set(local_asm_flags)
+    set(${input_asm_flags} "${${input_asm_flags}}" "${local_asm_flags}" "${USER_ASM_FLAGS}" PARENT_SCOPE)
+endfunction()
+
+#########################################################
+# Global C/C++ Compiler flags
+function(append_c_and_cxx_flags_common input_c_flags input_cxx_flags)
+    set(local_c_flags)
+    set(local_cxx_flags)
+    set(${input_c_flags}   "${${input_c_flags}}"   "${local_c_flags}"   "${USER_C_FLAGS}"   PARENT_SCOPE)
+    set(${input_cxx_flags} "${${input_cxx_flags}}" "${local_cxx_flags}" "${USER_CXX_FLAGS}" PARENT_SCOPE)
+endfunction()
+
+#########################################################
+# Global Fortran Compiler flags (for creating .mod files)
+function(append_fort_flags_common input_fort_flags)
+    set(local_fort_flags)
+    set(${input_fort_flags} "${${input_fort_flags}}" "${local_fort_flags}" "${USER_F_FLAGS}" PARENT_SCOPE)
+endfunction()
+
+#########################################################
+# Linker flags
+function(append_linker_flags_common input_ld_flags input_ld_flags_libs)
+    set(local_ld_flags)
+    set(local_ld_flags_libs)
+
+    #################################
+    # Windows linker flags
+    if(${WINDOWS}) 
+
+    ##################
+    # MAC linker flags
+    elseif(${MAC})
+        if(${USE_PREDEFINED_LINKER_FLAGS})
+            append_linker_flags("-single_module")
+            append_linker_flags("-current_version ${version}.0")
+            append_linker_flags("-compatibility_version ${version}.0")
+        endif()
+    #####################################################################################
+    # Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) linker flags
+    elseif(${MIC})
+        if(${USE_PREDEFINED_LINKER_FLAGS})
+            append_linker_flags("-Wl,-x")
+            append_linker_flags("-Wl,--warn-shared-textrel") #  Warn if the linker adds a DT_TEXTREL to a shared object.
+            append_linker_flags("-Wl,--as-needed")
+            append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
+            if(NOT ${STUBS_LIBRARY})
+                append_linker_flags_library("-pthread") # link in pthread library
+                append_linker_flags_library("-ldl") # link in libdl (dynamic loader library)
+            endif()
+            if(${STATS_GATHERING})
+                append_linker_flags_library("-Wl,-lstdc++") # link in standard c++ library (stats-gathering needs it)
+            endif()
+        endif()
+    #########################
+    # Unix based linker flags
+    else()
+        # For now, always include --version-script flag on Unix systems.
+        append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
+        if(${USE_PREDEFINED_LINKER_FLAGS})
+            append_linker_flags("-Wl,-z,noexecstack") #  Marks the object as not requiring executable stack.
+            append_linker_flags("-Wl,--as-needed")    #  Only adds library dependencies as they are needed. (if libiomp5 actually uses a function from the library, then add it)
+            if(NOT ${STUBS_LIBRARY})
+                append_linker_flags("-Wl,--warn-shared-textrel") #  Warn if the linker adds a DT_TEXTREL to a shared object.
+                append_linker_flags("-Wl,-fini=__kmp_internal_end_fini") # When creating an ELF executable or shared object, call NAME when the 
+                                                                         # executable or shared object is unloaded, by setting DT_FINI to the 
+                                                                         # address of the function.  By default, the linker uses "_fini" as the function to call.
+                append_linker_flags_library("-pthread") # link pthread library
+                if(NOT ${FREEBSD})
+                    append_linker_flags_library("-Wl,-ldl") # link in libdl (dynamic loader library)
+                endif()
+            endif()
+        endif() # if(${USE_PREDEFINED_LINKER_FLAGS})
+    endif() # if(${OPERATING_SYSTEM}) ...
+
+    set(${input_ld_flags}      "${${input_ld_flags}}"      "${local_ld_flags}"      "${USER_LD_FLAGS}"     PARENT_SCOPE)
+    set(${input_ld_flags_libs} "${${input_ld_flags_libs}}" "${local_ld_flags_libs}" "${USER_LD_LIB_FLAGS}" PARENT_SCOPE)
+endfunction()
+
+#########################################################
+# Archiver Flags
+function(append_archiver_flags_common input_ar_flags)
+    set(local_ar_flags)
+    set(${input_ar_flags} "${${input_ar_flags}}" "${local_ar_flags}" PARENT_SCOPE)
+endfunction()
+