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)
74 set(AUTOGEN_PY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim/${PLUGIN}.py)
76 file(READ
"${PLUGIN_MIM}" plugin_file_contents)
79 string(REGEX REPLACE
"/\\*[^*]*\\*+([^/*][^*]*\\*+)*/" "" plugin_file_contents
"${plugin_file_contents}")
82 string(REPLACE
"\n" ";" plugin_lines
"${plugin_file_contents}")
86 ${CMAKE_BINARY_DIR}/docs/plug/
87 ${CMAKE_BINARY_DIR}/include/mim/plug/${PLUGIN}
88 ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim/
96 COMMAND $<TARGET_FILE:${MIM_TARGET_NAMESPACE}mim> ${PLUGIN_MIM} -P
"${CMAKE_SOURCE_DIR}/src/mim/plug" -P
"${CMAKE_CURRENT_LIST_DIR}/.." --bootstrap
97 --output-h ${AUTOGEN_H}
98 --output-md ${PLUGIN_MD}
99 --output-py ${AUTOGEN_PY}
100 MAIN_DEPENDENCY ${PLUGIN_MIM}
101 DEPENDS ${MIM_TARGET_NAMESPACE}mim
102 COMMENT
"Bootstrapping MimIR plugin '${PLUGIN_MIM}'"
106 OUTPUT ${OUT_PLUGIN_MIM}
107 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PLUGIN_MIM} ${OUT_PLUGIN_MIM}
108 DEPENDS ${PLUGIN_MIM}
109 COMMENT
"Copy '${PLUGIN_MIM}' to '${OUT_PLUGIN_MIM}'"
112 add_custom_target(mim_internal_${PLUGIN}
120 if(PLUGIN IN_LIST MIM_PLUGIN_LIST)
121 message(FATAL_ERROR
"Mim plugin '${PLUGIN}' is already registered")
124 list(APPEND MIM_PLUGIN_LIST
"${PLUGIN}")
125 string(APPEND MIM_PLUGIN_LAYOUT
"<tab type=\"user\" url=\"@ref ${PLUGIN}\" title=\"${PLUGIN}\"/>")
128 set(MIM_PLUGIN_LIST
"${MIM_PLUGIN_LIST}" CACHE INTERNAL
"MIM_PLUGIN_LIST")
129 set(MIM_PLUGIN_LAYOUT
"${MIM_PLUGIN_LAYOUT}" CACHE INTERNAL
"MIM_PLUGIN_LAYOUT")
134 add_library(mim_${PLUGIN} MODULE)
135 add_dependencies(mim_${PLUGIN}
136 mim_internal_${PLUGIN}
140 target_sources(mim_${PLUGIN}
144 target_include_directories(mim_${PLUGIN}
146 $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>
148 if(EXISTS
"${CMAKE_CURRENT_LIST_DIR}/include")
149 target_include_directories(mim_${PLUGIN}
151 "${CMAKE_CURRENT_LIST_DIR}/include"
154 target_link_libraries(mim_${PLUGIN}
157 ${MIM_TARGET_NAMESPACE}libmim
159 set_target_properties(mim_${PLUGIN}
161 CXX_VISIBILITY_PRESET hidden
162 VISIBILITY_INLINES_HIDDEN 1
163 WINDOWS_EXPORT_ALL_SYMBOLS OFF
165 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim
171 if(${PARSED_INSTALL})
176 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
177 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
178 RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
179 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mim
182 FILES ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/mim/${PLUGIN}.mim
183 DESTINATION ${CMAKE_INSTALL_LIBDIR}/mim
187 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mim/plug/${PLUGIN}
189 if(EXISTS
"${CMAKE_CURRENT_LIST_DIR}/include")
191 DIRECTORY
"${CMAKE_CURRENT_LIST_DIR}/include/"
192 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}