Not to use iree_c_module to compile emitc static library

Using iree_c_module to compile emitc static library caused very long build time
for some models, e.g., barcode.

The root cause is still under investigation. This CL is a workaround to
not use iree_c_module and doesn't have this problem.

BUG: 245584726

Change-Id: If8fa0dcda3604201a085bf51c08c19468a4b19bb
diff --git a/cmake/springbok_static_module.cmake b/cmake/springbok_static_module.cmake
index 0853335..873c518 100644
--- a/cmake/springbok_static_module.cmake
+++ b/cmake/springbok_static_module.cmake
@@ -87,22 +87,42 @@
   list(APPEND _COMPILER_ARGS "-iree-llvm-link-embedded=false")
 
   if(_RULE_EMITC)
+    # TODO(b/245584726): iree_c_module causes long build time for some models
     set(_O_FILE_NAME "${_RULE_NAME}_c.o")
     set(_H_FILE_NAME "${_RULE_NAME}_emitc.h")
     set(_MODULE_NAME "${_RULE_NAME}_emitc")
-    iree_c_module(
-      NAME
-        ${_MODULE_NAME}
-      SRC
-        "${_MLIR_SRC}"
-      FLAGS
-        ${_COMPILER_ARGS}
-      H_FILE_OUTPUT
-        "${_H_FILE_NAME}"
-      STATIC_LIB_PATH
-        "${_O_FILE_NAME}"
-      NO_RUNTIME
+
+    get_filename_component(_MLIR_SRC "${_MLIR_SRC}" REALPATH)
+    list(APPEND _COMPILER_ARGS "-output-format=vm-c")
+    list(APPEND _COMPILER_ARGS "-iree-llvm-link-static")
+    list(APPEND _COMPILER_ARGS "-iree-llvm-static-library-output-path=${_O_FILE_NAME}")
+    list(APPEND _COMPILER_ARGS "${_MLIR_SRC}")
+    list(APPEND _COMPILER_ARGS "-o")
+    list(APPEND _COMPILER_ARGS "${_H_FILE_NAME}")
+
+    set(_OUTPUT_FILES "${_H_FILE_NAME}")
+    string(REPLACE ".o" ".h" _STATIC_HDR_PATH "${_O_FILE_NAME}")
+    list(APPEND _OUTPUT_FILES "${_O_FILE_NAME}" "${_STATIC_HDR_PATH}")
+
+    add_custom_command(
+      OUTPUT ${_OUTPUT_FILES}
+      COMMAND ${_COMPILER_TOOL} ${_COMPILER_ARGS}
+      DEPENDS ${_COMPILER_TOOL} ${_MLIR_SRC}
     )
+
+    set(_EMITC_LIB_NAME "${_PACKAGE_NAME}_${_MODULE_NAME}")
+    add_library(${_EMITC_LIB_NAME}
+      STATIC
+      ${_H_FILE_NAME}
+    )
+    target_compile_definitions(${_EMITC_LIB_NAME} PUBLIC EMITC_IMPLEMENTATION=\"${_H_FILE_NAME}\")
+    SET_TARGET_PROPERTIES(
+      ${_EMITC_LIB_NAME}
+      PROPERTIES
+        LINKER_LANGUAGE C
+    )
+    add_library(${_PACKAGE_NS}::${_MODULE_NAME} ALIAS ${_EMITC_LIB_NAME})
+
   else()  # bytecode module path
     # Generate the embed data with the bytecode module.
     set(_O_FILE_NAME "${_RULE_NAME}.o")