ClamAV is an open source (GPLv2) anti-virus toolkit.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
clamav/cmake/CheckStructPacking.cmake

72 lines
2.7 KiB

#
# Check for struct packing features
# This feature reworked from m4/reorganization/code_checks/compiler_attribs.m4
#
GET_FILENAME_COMPONENT(_selfdir_CheckStructPacking
"${CMAKE_CURRENT_LIST_FILE}" PATH)
# Check if __attribute__((packed)) is available
check_c_source_compiles(
"
#ifdef __GNUC__
struct { int i __attribute__((packed)); } s; int main(){return 0;}
#else
#error Only checking for packed attribute on gcc-like compilers
#endif
"
HAVE_ATTRIB_PACKED )
if(NOT HAVE_ATTRIB_PACKED)
# Check for packing via pragma (HAVE_PRAGMA_PACK)
try_run(
# Name of variable to store the run result (process exit status; number) in:
test_run_result
# Name of variable to store the compile result (TRUE or FALSE) in:
test_compile_result
# Binary directory:
${CMAKE_CURRENT_BINARY_DIR}
# Source file to be compiled:
${_selfdir_CheckStructPacking}/CheckStructPacking_PRAGMA_PACK.c
# Where to store the output produced during compilation:
COMPILE_OUTPUT_VARIABLE test_compile_output
# Where to store the output produced by running the compiled executable:
RUN_OUTPUT_VARIABLE test_run_output )
# Did compilation succeed and process return 0 (success)?
if("${test_compile_result}" AND ("${test_run_result}" EQUAL 0))
set(HAVE_PRAGMA_PACK 1)
endif()
if(NOT HAVE_PRAGMA_PACK)
# Check for packing via hppa/hp-uux pragma (HAVE_PRAGMA_PACK_HPPA)
try_run(
# Name of variable to store the run result (process exit status; number) in:
test_run_result
# Name of variable to store the compile result (TRUE or FALSE) in:
test_compile_result
# Binary directory:
${CMAKE_CURRENT_BINARY_DIR}
# Source file to be compiled:
${_selfdir_CheckStructPacking}/CheckStructPacking_PRAGMA_PACK_HPPA.c
# Where to store the output produced during compilation:
COMPILE_OUTPUT_VARIABLE test_compile_output
# Where to store the output produced by running the compiled executable:
RUN_OUTPUT_VARIABLE test_run_output )
# Did compilation succeed and process return 0 (success)?
if("${test_compile_result}" AND ("${test_run_result}" EQUAL 0))
set(HAVE_PRAGMA_PACK_HPPA 1)
endif()
endif()
endif()
# Check if struct __attribute__((aligned)) is available
check_c_source_compiles(
"
typedef int cl_aligned_int __attribute__((aligned)); int main(){return 0;}
"
HAVE_ATTRIB_ALIGNED )
if (NOT (HAVE_ATTRIB_PACKED OR HAVE_PRAGMA_PACK OR HAVE_PRAGMA_PACK_HPPA))
message(FATAL_ERROR "Failed to determine how to pack structs with this compiler!")
endif()