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