Browse Source

CMake: Handle compiler flags better

master
Jari Vetoniemi 10 years ago
parent
commit
ca2df2e221
3 changed files with 63 additions and 13 deletions
  1. +53
    -0
      CMake/GCCCompatibleCompilerOptions.cmake
  2. +9
    -12
      CMakeLists.txt
  3. +1
    -1
      README.md

+ 53
- 0
CMake/GCCCompatibleCompilerOptions.cmake View File

@ -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 ()

+ 9
- 12
CMakeLists.txt View File

@ -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

+ 1
- 1
README.md View File

@ -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

Loading…
Cancel
Save