criu/scripts/feature-tests.mak
Adrian Reber cba1c94b60 build: detect drm_color_ctm_3x4 in system libdrm headers
The amdgpu plugin's local amdgpu_drm.h defines struct
drm_color_ctm_3x4 guarded by #ifndef HAVE_DRM_COLOR_CTM_3X4,
but HAVE_DRM_COLOR_CTM_3X4 was never defined by the build
system. On systems where libdrm headers already provide this
struct (e.g. Alpine with libdrm 2.4.131), clang rejects the
redefinition as a hard error, while gcc silently accepts
identical struct redefinitions as an extension.

Add a feature test that checks whether struct drm_color_ctm_3x4
is available in the system drm_mode.h and pass
-DHAVE_DRM_COLOR_CTM_3X4 when it is, so the local fallback
definition is skipped.

Assisted-by: Claude Code (claude-opus-4-6):2025-09-03
Signed-off-by: Adrian Reber <areber@redhat.com>
2026-06-09 14:57:41 -07:00

187 lines
2.9 KiB
Makefile

define FEATURE_TEST_TCP_REPAIR
#include <netinet/tcp.h>
int main(void)
{
struct tcp_repair_opt opts;
opts.opt_code = TCP_NO_QUEUE;
opts.opt_val = 0;
return opts.opt_val;
}
endef
define FEATURE_TEST_TCP_REPAIR_WINDOW
#include <netinet/tcp.h>
int main(void)
{
struct tcp_repair_window opts;
opts.snd_wl1 = 0;
return opts.snd_wl1;
}
endef
define FEATURE_TEST_LIBBSD_DEV
#include <bsd/string.h>
int main(void)
{
return 0;
}
endef
define FEATURE_TEST_PTRACE_PEEKSIGINFO
#include <sys/ptrace.h>
int main(void)
{
struct ptrace_peeksiginfo_args args = {};
return 0;
}
endef
define FEATURE_TEST_SETPROCTITLE_INIT
#include <bsd/unistd.h>
int main(int argc, char *argv[], char *envp[])
{
setproctitle_init(argc, argv, envp);
return 0;
}
endef
define FEATURE_TEST_X86_COMPAT
#define __ALIGN .align 4, 0x90
#define ENTRY(name) \
.globl name; \
.type name, @function; \
__ALIGN; \
name:
#define END(sym) \
.size sym, . - sym
#define __USER32_CS 0x23
#define __USER_CS 0x33
.text
ENTRY(call32_from_64)
/* Push return address and 64-bit segment descriptor */
sub \$$4, %rsp
movl \$$__USER_CS,(%rsp)
sub \$$4, %rsp
/* Using rip-relative addressing to get rid of R_X86_64_32S relocs */
leaq 2f(%rip),%r12
movl %r12d,(%rsp)
/* Switch into compatibility mode */
pushq \$$__USER32_CS
/* Using rip-relative addressing to get rid of R_X86_64_32S relocs */
leaq 1f(%rip), %r12
pushq %r12
lretq
1: .code32
/* Run function and switch back */
call *%esi
lret
2: .code64
/* Restore the stack */
mov (%rsp),%rsp
add \$$8, %rdi
END(call32_from_64)
ENTRY(main)
nop
END(main)
endef
define FEATURE_TEST_NFTABLES_LIB_API_0
#include <string.h>
#include <nftables/libnftables.h>
int main(int argc, char **argv)
{
return nft_run_cmd_from_buffer(nft_ctx_new(NFT_CTX_DEFAULT), \"cmd\", strlen(\"cmd\"));
}
endef
define FEATURE_TEST_NFTABLES_LIB_API_1
#include <nftables/libnftables.h>
int main(int argc, char **argv)
{
return nft_run_cmd_from_buffer(nft_ctx_new(NFT_CTX_DEFAULT), \"cmd\");
}
endef
define FEATURE_TEST_MEMFD_CREATE
#include <sys/mman.h>
#include <stddef.h>
int main(void)
{
return memfd_create(NULL, 0);
}
endef
define FEATURE_TEST_OPENAT2
#include <linux/openat2.h>
int main(void)
{
if (RESOLVE_NO_XDEV > 0)
return 0;
return 0;
}
endef
define FEATURE_TEST_DRM_COLOR_CTM_3X4
#include <drm_mode.h>
int main(void)
{
struct drm_color_ctm_3x4 ctm = {};
return (int)ctm.matrix[0];
}
endef
define FEATURE_TEST_NO_LIBC_RSEQ_DEFS
#ifdef __has_include
#if __has_include(\"sys/rseq.h\")
#include <sys/rseq.h>
#endif
#endif
enum rseq_cpu_id_state {
RSEQ_CPU_CRIU_TEST = -1,
};
int main(void)
{
return 0;
}
endef