autoconf:在本机编译的情况下执行 AC_RUN_IFELSE,否则执行 AC_COMPILE_IFELSE

autoconf: do AC_RUN_IFELSE in сase of native compilation, otherwise AC_COMPILE_IFELSE

从rsync修改了configrue.ac:

if test x"$host_cpu" = x"x86_64"; then
    if test x"$host_cpu" = x"$build_cpu"; then
        AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
#include <immintrin.h>
/* some long C++ code here */
]], [[if (test_ssse3(42) != 42 || test_sse2(42) != 42 || test_avx2(42) != 42) exit(1);]])],[CXX_OK=yes],[CXX_OK=no])
    else
        AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include <stdio.h>
#include <immintrin.h>
/* the same C++ code again */
]]),[CXX_OK=yes],[CXX_OK=no])
    fi
fi

如何改进?有没有办法避免重复 C++ 代码?

Is there a way to avoid duplicating C++ code?

当然可以。毕竟,Autoconf 从根本上说是一种宏语言。您可以定义和(重新)使用扩展到该代码的宏,而不是复制代码。 AC_DEFUN()m4_define() 都可以,但前者对于我认为您想要的东西来说有点矫枉过正。所以,

m4_define([_EDO1_LONG_CODE], [[
// long C++ code ...
]])

您在使用它时需要注意引用。您正在使用 double-quoting 来确保程序源不受宏扩展的影响,但在您实际 想要 宏扩展的地方,您需要将引用级别降低一级,像这样:

if test x"$host_cpu" = x"x86_64"; then
    if test x"$host_cpu" = x"$build_cpu"; then
        AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
#include <immintrin.h>
]_EDO1_LONG_CODE], [[if (test_ssse3(42) != 42 || test_sse2(42) != 42 || test_avx2(42) != 42) exit(1);]])],[CXX_OK=yes],[CXX_OK=no])
    else
        AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include <stdio.h>
#include <immintrin.h>
]_EDO1_LONG_CODE]),[CXX_OK=yes],[CXX_OK=no])
    fi
fi