autoconf: split into subdirectories; redirect calls in debug builds
[m6w6/ext-psi] / m4 / psi / psi_macro.m4
diff --git a/m4/psi/psi_macro.m4 b/m4/psi/psi_macro.m4
new file mode 100644 (file)
index 0000000..b3ee988
--- /dev/null
@@ -0,0 +1,44 @@
+# psi_add_macro(macro)
+# Add a pre-defined macro function to $PSI_MACROS.
+psi_add_macro() {
+       cat >>$PSI_MACROS <<EOF
+$1
+EOF
+}
+
+dnl PSI_MACRO(macro, decl args, action-if-true)
+AC_DEFUN(PSI_MACRO, [
+       AC_CHECK_DECL(PSI_VAR_NAME($1)$2, [
+               $3
+               macro_type="PSI_VAR_TYPE($1)"
+               macro_name="PSI_VAR_NAME($1)"
+               m4_case([$2],
+                       [(void)], [
+                               macro_decl="(void)"
+                               macro_call="()"
+                       ],
+                       [()], [
+                               macro_decl="()"
+                               macro_call="()"
+                       ],
+                       [], [
+                               macro_decl="()"
+                               macro_call=""
+                       ],
+                       [
+                               macro_decl="$2"
+                               macro_call="(m4_map_args_sep([PSI_VAR_NAME(], [)], [, ], m4_bregexp($2, [(\(.*\))], [\1])))"
+                       ]
+               )
+               ifelse(PSI_VAR_TYPE($1), [void], [
+                       macro_body="$macro_name$macro_call;"
+               ], [
+                       macro_body="return $macro_name$macro_call;"
+               ])
+               psi_add_macro "$macro_type _psi_redir_$macro_name$macro_decl { $macro_body }"
+               PSI_REDIR($macro_name, _psi_redir_$macro_name)
+       ], [], PSI_INCLUDES)
+])
+
+dnl PSI_EXTVAR(type var)
+AC_DEFUN(PSI_EXTVAR, [PSI_MACRO($1)])