From ca2df2e22153e422d67586898e098d167964dc16 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Tue, 25 Aug 2015 02:14:57 +0300 Subject: [PATCH] CMake: Handle compiler flags better --- CMake/GCCCompatibleCompilerOptions.cmake | 53 ++++++++++++++++++++++++ CMakeLists.txt | 21 ++++------ README.md | 2 +- 3 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 CMake/GCCCompatibleCompilerOptions.cmake diff --git a/CMake/GCCCompatibleCompilerOptions.cmake b/CMake/GCCCompatibleCompilerOptions.cmake new file mode 100644 index 0000000..830bee0 --- /dev/null +++ b/CMake/GCCCompatibleCompilerOptions.cmake @@ -0,0 +1,53 @@ +include(CheckCCompilerFlag) + +# Add list of compiler warnings +# Every warning gets checked with check_c_compiler_flags +function(add_compiler_warnings) + foreach (flag ${ARGN}) + check_c_compiler_flag(${flag} ok) + if (ok) + add_compile_options(${flag}) + endif () + endforeach () +endfunction () + +# Create new ${EXE,MODULE,SHARED}_LINKER_FLAGS build type for list of linker flags +# Every linker flag gets checked with check_c_compiler_flag +function(create_custom_linker_flags name) + foreach (flag ${ARGN}) + check_c_compiler_flag(-Wl,${flag} ok) + if (ok) + if (ldflags) + set(ldflags "${ldflags},${flag}") + else () + set(ldflags "-Wl,${flag}") + endif () + endif () + endforeach () + + string(TOUPPER ${name} upper) + set(CMAKE_EXE_LINKER_FLAGS_${upper} "${ldflags}" CACHE STRING "${name} exe linker flags" FORCE) + set(CMAKE_MODULE_LINKER_FLAGS_${upper} "${ldflags}" CACHE STRING "${name} module linker flags" FORCE) + set(CMAKE_SHARED_LINKER_FLAGS_${upper} "${ldflags}" CACHE STRING "${name} shared linker flags" FORCE) + mark_as_advanced(CMAKE_EXE_LINKER_FLAGS_${upper} CMAKE_SHARED_LINKER_FLAGS_${upper} CMAKE_MODULE_LINKER_FLAGS_${upper}) +endfunction () + +# Create new {C,CXX}_FLAGS build type for list of compiler flags +# Every compiler flag gets checked with check_c_compiler_flag +function(create_custom_compiler_flags name) + foreach (flag ${ARGN}) + check_c_compiler_flag(${flag} ok) + if (ok) + if (cflags) + set(cflags "${cflags} ${flag}") + else () + set(cflags "${flag}") + endif () + endif () + endforeach () + + string(TOUPPER ${name} upper) + set(CMAKE_C_FLAGS_${upper} "${cflags}" CACHE STRING "${name} C flags" FORCE) + set(CMAKE_CXX_FLAGS_${upper} "${cflags}" CACHE STRING "${name} CXX flags" FORCE) + mark_as_advanced(CMAKE_CXX_FLAGS_${upper} CMAKE_C_FLAGS_${upper}) +endfunction () diff --git a/CMakeLists.txt b/CMakeLists.txt index 86e23f2..fd84a75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,20 +33,17 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") +# Compiler options if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - set(ldflags -Wl,-O1,--no-undefined,--sort-common,--as-needed,-z,relro,-z,now) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ldflags}") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${ldflags}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ldflags}") - - if ("${CMAKE_C_FLAGS}" STREQUAL "") - add_definitions(-O2) - add_definitions(-fstack-protector-strong -fstack-check -flto) + include(GCCCompatibleCompilerOptions) + add_compiler_warnings(-Wall -Wextra -Wno-variadic-macros -Wno-long-long -Wformat=2 -Winit-self -Wfloat-equal -Wcast-align -Wpointer-arith -Wmissing-prototypes -Wsuggest-attribute=pure -Wsuggest-attribute=const) + create_custom_linker_flags(Upstream -O1 --sort-common --as-needed -z,relro -z,now) + check_c_compiler_flag(-fstack-protector-strong ok) + if (ok) + create_custom_compiler_flags(Upstream -g -O2 -fstack-protector-strong --param ssp-buffer-size=4 -fstack-check -flto) + else () + create_custom_compiler_flags(Upstream -g -O2 -fstack-protector-all --param ssp-buffer-size=4 -fstack-check -flto) endif () - - add_definitions( - -Wall -Wextra -Wno-variadic-macros -Wno-long-long -Wformat=2 -Winit-self -Wfloat-equal - -Wcast-align -Wpointer-arith -Wmissing-prototypes -Wsuggest-attribute=pure -Wsuggest-attribute=const) endif () # -std=c99 -fpic -fpie -D_DEFAULT_SOURCE diff --git a/README.md b/README.md index 8b36a6c..1dc56ef 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## Building mkdir target && cd target # - create build target directory - cmake -DCMAKE_INSTALL_PREFIX=build .. # - run CMake, set install directory + cmake -DCMAKE_BUILD_TYPE=Upstream .. # - run CMake make # - compile ## License