Rollup of fixes for MSVC and CMake build.
With these changes iree-translate can build with Clang and MSVC through CMake!
There's still some cleanup required for ALWAYSLINK in the CMake rules however this is enough to at least verify we can build and start setting up CI.

Progress on issue #6.

PiperOrigin-RevId: 272693901
diff --git a/build_tools/cmake/external_cc_library.cmake b/build_tools/cmake/external_cc_library.cmake
index 3d60bc2..74adf07 100644
--- a/build_tools/cmake/external_cc_library.cmake
+++ b/build_tools/cmake/external_cc_library.cmake
@@ -31,14 +31,16 @@
 # DEFINES: List of public defines
 # INCLUDES: Include directories to add to dependencies
 # LINKOPTS: List of link options
-# PUBLIC: Add this so that this library will be exported under iree::
-# Also in IDE, target will appear in IREE folder while non PUBLIC will be in IREE/internal.
-# TESTONLY: When added, this target will only be built if user passes -DIREE_BUILD_TESTS=ON to CMake.
+# PUBLIC: Add this so that this library will be exported under ${PACKAGE}::
+# Also in IDE, target will appear in ${PACKAGE} folder while non PUBLIC will be
+# in ${PACKAGE}/internal.
+# TESTONLY: When added, this target will only be built if user passes
+#    -DIREE_BUILD_TESTS=ON to CMake.
 #
 # Note:
-# By default, external_cc_library will always create a library named ${PACKAGE}_${NAME},
-# and alias target ${PACKAGE}::${NAME}. The ${PACKAGE}:: form should always be used.
-# This is to reduce namespace pollution.
+# By default, external_cc_library will always create a library named
+# ${PACKAGE}_${NAME}, and alias target ${PACKAGE}::${NAME}. The ${PACKAGE}::
+# form should always be used. This is to reduce namespace pollution.
 #
 # external_cc_library(
 #   PACKAGE
@@ -76,71 +78,71 @@
 #
 # TODO: Implement "ALWAYSLINK"
 function(external_cc_library)
-  cmake_parse_arguments(EXTERNAL_CC_LIB
+  cmake_parse_arguments(_RULE
     "PUBLIC;TESTONLY"
     "PACKAGE;NAME;ROOT"
     "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS;INCLUDES"
     ${ARGN}
   )
 
-  if(NOT EXTERNAL_CC_LIB_TESTONLY OR IREE_BUILD_TESTS)
+  if(NOT _RULE_TESTONLY OR IREE_BUILD_TESTS)
     # Prefix the library with the package name.
-    string(REPLACE "::" "_" _PACKAGE_NAME ${EXTERNAL_CC_LIB_PACKAGE})
-    set(_NAME "${_PACKAGE_NAME}_${EXTERNAL_CC_LIB_NAME}")
+    string(REPLACE "::" "_" _PACKAGE_NAME ${_RULE_PACKAGE})
+    set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
 
     # Prefix paths with the root.
-    list(TRANSFORM EXTERNAL_CC_LIB_HDRS PREPEND ${EXTERNAL_CC_LIB_ROOT})
-    list(TRANSFORM EXTERNAL_CC_LIB_SRCS PREPEND ${EXTERNAL_CC_LIB_ROOT})
+    list(TRANSFORM _RULE_HDRS PREPEND ${_RULE_ROOT})
+    list(TRANSFORM _RULE_SRCS PREPEND ${_RULE_ROOT})
 
     # Check if this is a header-only library.
     # Note that as of February 2019, many popular OS's (for example, Ubuntu
     # 16.04 LTS) only come with cmake 3.5 by default.  For this reason, we can't
     # use list(FILTER...)
-    set(_CC_SRCS "${EXTERNAL_CC_LIB_SRCS}")
+    set(_CC_SRCS "${_RULE_SRCS}")
     foreach(src_file IN LISTS _CC_SRCS)
       if(${src_file} MATCHES ".*\\.(h|inc)")
         list(REMOVE_ITEM _CC_SRCS "${src_file}")
       endif()
     endforeach()
     if("${_CC_SRCS}" STREQUAL "")
-      set(EXTERNAL_CC_LIB_IS_INTERFACE 1)
+      set(_RULE_IS_INTERFACE 1)
     else()
-      set(EXTERNAL_CC_LIB_IS_INTERFACE 0)
+      set(_RULE_IS_INTERFACE 0)
     endif()
 
-    if(NOT EXTERNAL_CC_LIB_IS_INTERFACE)
+    if(NOT _RULE_IS_INTERFACE)
       add_library(${_NAME} STATIC "")
       target_sources(${_NAME}
         PRIVATE
-          ${EXTERNAL_CC_LIB_SRCS}
-          ${EXTERNAL_CC_LIB_HDRS}
+          ${_RULE_SRCS}
+          ${_RULE_HDRS}
       )
       target_include_directories(${_NAME}
         PUBLIC
           "$<BUILD_INTERFACE:${IREE_COMMON_INCLUDE_DIRS}>"
-          "$<BUILD_INTERFACE:${EXTERNAL_CC_LIB_INCLUDES}>"
+          "$<BUILD_INTERFACE:${_RULE_INCLUDES}>"
       )
       target_compile_options(${_NAME}
         PRIVATE
-          ${EXTERNAL_CC_LIB_COPTS}
+          ${_RULE_COPTS}
           ${IREE_DEFAULT_COPTS}
       )
       target_link_libraries(${_NAME}
         PUBLIC
-          ${EXTERNAL_CC_LIB_DEPS}
+          ${_RULE_DEPS}
         PRIVATE
-          ${EXTERNAL_CC_LIB_LINKOPTS}
+          ${_RULE_LINKOPTS}
           ${IREE_DEFAULT_LINKOPTS}
       )
       target_compile_definitions(${_NAME}
         PUBLIC
-          ${EXTERNAL_CC_LIB_DEFINES}
+          ${_RULE_DEFINES}
       )
 
       # Add all external targets to a a folder in the IDE for organization.
-      if(EXTERNAL_CC_LIB_PUBLIC)
+      if(_RULE_PUBLIC)
         set_property(TARGET ${_NAME} PROPERTY FOLDER third_party)
-      elseif(EXTERNAL_CC_LIB_TESTONLY)
+      elseif(_RULE_TESTONLY)
         set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/test)
       else()
         set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/internal)
@@ -155,28 +157,28 @@
       target_include_directories(${_NAME}
         INTERFACE
           "$<BUILD_INTERFACE:${IREE_COMMON_INCLUDE_DIRS}>"
-          "$<BUILD_INTERFACE:${EXTERNAL_CC_LIB_INCLUDES}>"
+          "$<BUILD_INTERFACE:${_RULE_INCLUDES}>"
       )
       target_compile_options(${_NAME}
         INTERFACE
-          ${EXTERNAL_CC_LIB_COPTS}
+          ${_RULE_COPTS}
           ${IREE_DEFAULT_COPTS}
       )
       target_link_libraries(${_NAME}
         INTERFACE
-          ${EXTERNAL_CC_LIB_DEPS}
-          ${EXTERNAL_CC_LIB_LINKOPTS}
+          ${_RULE_DEPS}
+          ${_RULE_LINKOPTS}
           ${IREE_DEFAULT_LINKOPTS}
       )
       target_compile_definitions(${_NAME}
         INTERFACE
-          ${EXTERNAL_CC_LIB_DEFINES}
+          ${_RULE_DEFINES}
       )
     endif()
 
-    add_library(${EXTERNAL_CC_LIB_PACKAGE}::${EXTERNAL_CC_LIB_NAME} ALIAS ${_NAME})
-    if(${EXTERNAL_CC_LIB_PACKAGE} STREQUAL ${EXTERNAL_CC_LIB_NAME})
-      add_library(${EXTERNAL_CC_LIB_PACKAGE} ALIAS ${_NAME})
+    add_library(${_RULE_PACKAGE}::${_RULE_NAME} ALIAS ${_NAME})
+    if(${_RULE_PACKAGE} STREQUAL ${_RULE_NAME})
+      add_library(${_RULE_PACKAGE} ALIAS ${_NAME})
     endif()
   endif()
 endfunction()