cmake_minimum_required(VERSION 3.14)
project(memcpy C ASM)
set(THIRDPARTY_SAFE_FLAGS "" CACHE STRING
"extra safe cflags from outer project")
set(MEMCPY_C_FLAGS "${THIRDPARTY_SAFE_FLAGS}" CACHE STRING
"extra cflags for memcpy")
separate_arguments(MEMCPY_C_FLAGS_LIST NATIVE_COMMAND "${MEMCPY_C_FLAGS}")
set(MEMCPY_ARCH "" CACHE STRING
"arch under string/: aarch64 | arm | x86_64 …")
if(NOT MEMCPY_ARCH)
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _proc)
if(_proc MATCHES "aarch64|arm64")
set(MEMCPY_ARCH "aarch64")
elseif(_proc MATCHES "x86_64|amd64")
set(MEMCPY_ARCH "x86_64")
elseif(_proc MATCHES "^arm")
set(MEMCPY_ARCH "arm")
else()
set(MEMCPY_ARCH "aarch64")
endif()
endif()
set(_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/string/string/${MEMCPY_ARCH}")
file(GLOB_RECURSE MEMCPY_SRCS CONFIGURE_DEPENDS
"${_SRC_DIR}/*.c"
"${_SRC_DIR}/*.S" "${_SRC_DIR}/*.s")
if(NOT MEMCPY_SRCS)
message(FATAL_ERROR "[memcpy] no sources under ${_SRC_DIR}")
endif()
add_library(memcpy SHARED ${MEMCPY_SRCS})
set_target_properties(memcpy PROPERTIES LINKER_LANGUAGE C)
if(NOT DEFINED MEMCPY_GLIBC_VERSION)
if(MEMCPY_ARCH STREQUAL "x86_64")
set(MEMCPY_GLIBC_VERSION "GLIBC_2.14")
else()
set(MEMCPY_GLIBC_VERSION "GLIBC_2.17")
endif()
endif()
message(STATUS "[memcpy] export memcpy as ${MEMCPY_GLIBC_VERSION}")
target_include_directories(memcpy
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib/string/include>"
"$<INSTALL_INTERFACE:include>"
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/lib/string/string/${MEMCPY_ARCH}"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/string/string")
target_compile_options(memcpy PRIVATE
${MEMCPY_C_FLAGS_LIST}
-std=c99 -fPIC)
target_link_options(memcpy PRIVATE -Wl,-z,now)
include(GNUInstallDirs)
install(TARGETS memcpy
EXPORT memcpyTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(_INC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib/string/string/include")
if(EXISTS "${_INC_DIR}")
install(DIRECTORY "${_INC_DIR}/"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h")
endif()
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/lib/string/cmake/memcpy-config.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/memcpy")
install(EXPORT memcpyTargets
NAMESPACE memcpy::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/memcpy"
FILE memcpyTargets.cmake)
export(EXPORT memcpyTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/memcpyTargets.cmake")
set(AOR_WRAP_SRC ${CMAKE_CURRENT_SOURCE_DIR}/lib/string/aor_memcpy_wrap.c)
add_library(aor_memcpy_wrap SHARED ${AOR_WRAP_SRC})
set_target_properties(aor_memcpy_wrap PROPERTIES
OUTPUT_NAME aor_memcpy_wrap
LINKER_LANGUAGE C
C_STANDARD 99)
target_link_libraries(aor_memcpy_wrap
PRIVATE memcpy -Wl,--exclude-libs,ALL)
target_compile_options(aor_memcpy_wrap PRIVATE
${MEMCPY_C_FLAGS_LIST}
-std=c99 -fPIC -O2 -Wall -Wextra)
target_link_options(aor_memcpy_wrap PRIVATE -Wl,-z,now)
install(TARGETS aor_memcpy_wrap
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/run-with-memcpy" "\
#!/bin/sh\n\
export LD_PRELOAD=libaor_memcpy_wrap.so\n\
exec \"$@\"\n")
file(CHMOD "${CMAKE_CURRENT_BINARY_DIR}/run-with-memcpy"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/run-with-memcpy"
DESTINATION bin)