3if(NOT DEFINED MIM_PLUGIN_LIST)
4 set(MIM_PLUGIN_LIST
"" CACHE INTERNAL
"MIM_PLUGIN_LIST")
6if(NOT DEFINED MIM_PLUGIN_LAYOUT)
7 set(MIM_PLUGIN_LAYOUT
"" CACHE INTERNAL
"MIM_PLUGIN_LAYOUT")
10if(NOT MIM_TARGET_NAMESPACE)
11 set(MIM_TARGET_NAMESPACE
"")
50function(add_mim_plugin)
53 if(NOT PLUGIN MATCHES
"^[A-Za-z0-9_]+$")
54 message(FATAL_ERROR
"Mim plugin names may only contain letters, digits, and underscores")
57 string(LENGTH
"${PLUGIN}" PLUGIN_LENGTH)
58 if(PLUGIN_LENGTH GREATER 8)
59 message(FATAL_ERROR
"Mim plugin '${PLUGIN}' exceeds the maximum supported length of 8 characters")
62 cmake_parse_arguments(
70 set(PLUGIN_MIM ${CMAKE_CURRENT_LIST_DIR}/${PLUGIN}.mim)
71 set(OUT_PLUGIN_MIM ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim/${PLUGIN}.mim)
72 set(PLUGIN_MD ${CMAKE_BINARY_DIR}/docs/plug/${PLUGIN}.md)
73 set(AUTOGEN_H ${CMAKE_BINARY_DIR}/include/mim/plug/${PLUGIN}/autogen.h)
75 file(READ
"${PLUGIN_MIM}" plugin_file_contents)
78 string(REGEX REPLACE
"/\\*[^*]*\\*+([^/*][^*]*\\*+)*/" "" plugin_file_contents
"${plugin_file_contents}")
81 string(REPLACE
"\n" ";" plugin_lines
"${plugin_file_contents}")
85 ${CMAKE_BINARY_DIR}/docs/plug/
86 ${CMAKE_BINARY_DIR}/include/mim/plug/${PLUGIN}
93 COMMAND $<TARGET_FILE:${MIM_TARGET_NAMESPACE}mim> ${PLUGIN_MIM} -P
"${CMAKE_CURRENT_LIST_DIR}/.." --bootstrap
94 --output-h ${AUTOGEN_H}
95 --output-md ${PLUGIN_MD}
96 MAIN_DEPENDENCY ${PLUGIN_MIM}
97 DEPENDS ${MIM_TARGET_NAMESPACE}mim
98 COMMENT
"Bootstrapping MimIR plugin '${PLUGIN_MIM}'"
102 OUTPUT ${OUT_PLUGIN_MIM}
103 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PLUGIN_MIM} ${OUT_PLUGIN_MIM}
104 DEPENDS ${PLUGIN_MIM}
105 COMMENT
"Copy '${PLUGIN_MIM}' to '${OUT_PLUGIN_MIM}'"
108 add_custom_target(mim_internal_${PLUGIN}
115 if(PLUGIN IN_LIST MIM_PLUGIN_LIST)
116 message(FATAL_ERROR
"Mim plugin '${PLUGIN}' is already registered")
119 list(APPEND MIM_PLUGIN_LIST
"${PLUGIN}")
120 string(APPEND MIM_PLUGIN_LAYOUT
"<tab type=\"user\" url=\"@ref ${PLUGIN}\" title=\"${PLUGIN}\"/>")
123 set(MIM_PLUGIN_LIST
"${MIM_PLUGIN_LIST}" CACHE INTERNAL
"MIM_PLUGIN_LIST")
124 set(MIM_PLUGIN_LAYOUT
"${MIM_PLUGIN_LAYOUT}" CACHE INTERNAL
"MIM_PLUGIN_LAYOUT")
129 add_library(mim_${PLUGIN} MODULE)
130 add_dependencies(mim_${PLUGIN}
131 mim_internal_${PLUGIN}
135 target_sources(mim_${PLUGIN}
139 target_include_directories(mim_${PLUGIN}
141 $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>
143 if(EXISTS
"${CMAKE_CURRENT_LIST_DIR}/include")
144 target_include_directories(mim_${PLUGIN}
146 "${CMAKE_CURRENT_LIST_DIR}/include"
149 target_link_libraries(mim_${PLUGIN}
152 ${MIM_TARGET_NAMESPACE}libmim
154 set_target_properties(mim_${PLUGIN}
156 CXX_VISIBILITY_PRESET hidden
157 VISIBILITY_INLINES_HIDDEN 1
158 WINDOWS_EXPORT_ALL_SYMBOLS OFF
160 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim
166 if(${PARSED_INSTALL})
171 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
172 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
173 RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
174 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mim
177 FILES ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim/${PLUGIN}.mim
178 DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
182 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mim/plug/${PLUGIN}
184 if(EXISTS
"${CMAKE_CURRENT_LIST_DIR}/include")
186 DIRECTORY
"${CMAKE_CURRENT_LIST_DIR}/include/"
187 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}