1*4882a593Smuzhiyunset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -fPIC") 2*4882a593Smuzhiyunset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -fPIC") 3*4882a593Smuzhiyunset(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -gdwarf -fexceptions -funwind-tables") 4*4882a593Smuzhiyunset(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") 5*4882a593Smuzhiyunset(CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG") 6*4882a593Smuzhiyunset(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -gdwarf -fexceptions -funwind-tables") 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunset(CMAKE_C_STANDARD 11) 9*4882a593Smuzhiyunset(CMAKE_CXX_STANDARD 11) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunset(CMAKE_C_EXTENSIONS ON) 12*4882a593Smuzhiyunset(CMAKE_CXX_EXTENSIONS ON) 13*4882a593Smuzhiyunset(CMAKE_CXX_STANDARD_REQUIRED ON) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunif (ARCH STREQUAL "arm") 16*4882a593Smuzhiyun add_compile_options( 17*4882a593Smuzhiyun -march=armv7-a 18*4882a593Smuzhiyun ) 19*4882a593Smuzhiyunendif() 20*4882a593Smuzhiyun 21*4882a593Smuzhiyunif (ARCH STREQUAL "aarch64") 22*4882a593Smuzhiyun add_compile_options( 23*4882a593Smuzhiyun -march=armv8-a 24*4882a593Smuzhiyun ) 25*4882a593Smuzhiyunendif() 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") 28*4882a593Smuzhiyun if (ARCH STREQUAL "arm") 29*4882a593Smuzhiyun set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -mthumb-interwork") 30*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -mthumb-interwork") 31*4882a593Smuzhiyun endif() 32*4882a593Smuzhiyun set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") 33*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") 34*4882a593Smuzhiyun execute_process( 35*4882a593Smuzhiyun COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) 36*4882a593Smuzhiyun if (NOT (GCC_VERSION VERSION_GREATER 8.3 OR GCC_VERSION VERSION_EQUAL 8.3)) 37*4882a593Smuzhiyun message(FATAL_ERROR "${PROJECT_NAME} requires g++ 8.3 or greater.") 38*4882a593Smuzhiyun endif () 39*4882a593Smuzhiyun set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") 40*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections") 41*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,-Map,librkaiq.map") 42*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/librkaiq.version") 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun # Flags that affects code size 45*4882a593Smuzhiyun #if (NOT ARCH STREQUAL "arm") 46*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_ASSERTIONS") 47*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fstack-protector-strong") 48*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fstack-clash-protection") 49*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fstack-protector-strong") 50*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fstack-clash-protection") 51*4882a593Smuzhiyun string(FIND ${CMAKE_CXX_FLAGS} "-D_FORTIFY_SOURCE=" RKAIQ_CXX_FLAGS) 52*4882a593Smuzhiyun if(RKAIQ_CXX_FLAGS LESS 0) 53*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2") 54*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -D_FORTIFY_SOURCE=2") 55*4882a593Smuzhiyun endif() 56*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro") 57*4882a593Smuzhiyun #endif (NOT ARCH STREQUAL "arm") 58*4882a593Smuzhiyunelseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 59*4882a593Smuzhiyun #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") 60*4882a593Smuzhiyun set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -fgnuc-version=8.3") 61*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fgnuc-version=8.3") 62*4882a593Smuzhiyun set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") 63*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections") 64*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fstack-protector-strong") 65*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fstack-protector-strong") 66*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,-Map,librkaiq.map") 67*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/librkaiq.version") 68*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state") 69*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--push-state -Wl,--as-needed -latomic -Wl,--pop-state") 70*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro") 71*4882a593Smuzhiyun set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld -Wl,--icf=all -Wl,--gdb-index") 72*4882a593Smuzhiyunelseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 73*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /stdlib=libc++") 74*4882a593Smuzhiyunelse () 75*4882a593Smuzhiyun message(FATAL_ERROR "Your C++ compiler does not support C++11.") 76*4882a593Smuzhiyunendif () 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun# Workaround Compile Errors 79*4882a593Smuzhiyunif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") 80*4882a593Smuzhiyun add_compile_options( 81*4882a593Smuzhiyun -fwrapv 82*4882a593Smuzhiyun -Wformat-security 83*4882a593Smuzhiyun ) 84*4882a593Smuzhiyun add_compile_options( 85*4882a593Smuzhiyun -Wno-psabi 86*4882a593Smuzhiyun -Wno-unused 87*4882a593Smuzhiyun -Wno-unused-result 88*4882a593Smuzhiyun ) 89*4882a593Smuzhiyun if (GCC_VERSION VERSION_GREATER 9 OR GCC_VERSION VERSION_EQUAL 9) 90*4882a593Smuzhiyun add_compile_options( 91*4882a593Smuzhiyun -Wno-address-of-packed-member 92*4882a593Smuzhiyun ) 93*4882a593Smuzhiyun endif() 94*4882a593Smuzhiyunelseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 95*4882a593Smuzhiyun add_definitions(-D__ARM_NEON) 96*4882a593Smuzhiyun add_compile_options( 97*4882a593Smuzhiyun -fwrapv 98*4882a593Smuzhiyun -Wformat-security 99*4882a593Smuzhiyun ) 100*4882a593Smuzhiyun add_compile_options( 101*4882a593Smuzhiyun -Wno-unused-private-field 102*4882a593Smuzhiyun -Wno-extern-c-compat 103*4882a593Smuzhiyun -Wno-c99-designator 104*4882a593Smuzhiyun -Wno-unused-function 105*4882a593Smuzhiyun -Wno-unused-variable 106*4882a593Smuzhiyun -Wno-address-of-packed-member 107*4882a593Smuzhiyun -Wno-unused-parameter 108*4882a593Smuzhiyun ) 109*4882a593Smuzhiyunelseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 110*4882a593Smuzhiyun add_definitions(-D_CRT_SECURE_NO_WARNINGS) 111*4882a593Smuzhiyunendif() 112*4882a593Smuzhiyun 113*4882a593Smuzhiyunif (RKAIQ_ENABLE_ASAN) 114*4882a593Smuzhiyun set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") 115*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") 116*4882a593Smuzhiyun set(CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") 117*4882a593Smuzhiyun set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer -fsanitize=address") 118*4882a593Smuzhiyun set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer -fsanitize=address") 119*4882a593Smuzhiyun set(CMAKE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_LINKER_FLAGS_RELWITHDEBINFO} -fno-omit-frame-pointer -fsanitize=address") 120*4882a593Smuzhiyunendif() 121*4882a593Smuzhiyun 122*4882a593Smuzhiyunfind_program(CCACHE_FOUND ccache) 123*4882a593Smuzhiyunif(CCACHE_FOUND) 124*4882a593Smuzhiyun set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) 125*4882a593Smuzhiyun set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) 126*4882a593Smuzhiyunendif(CCACHE_FOUND) 127