diff --git a/CMakeLists.txt b/CMakeLists.txt index a8db1e9..6c5c258 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,13 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." TRUE) +if(APPLE) + set(UseLibCxxDefault TRUE) +else() + set(UseLibCxxDefault FALSE) +endif() +option(UseLibCxx "Compile using libc++" UseLibCxxDefault) + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if(DEFINED ENV{MSYSTEM_PREFIX}) set(CMAKE_INSTALL_PREFIX "$ENV{MSYSTEM_PREFIX}" CACHE PATH "Default install prefix" FORCE) @@ -29,12 +36,18 @@ function(add_compile_options_safe FLAG) endif(CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS}) endfunction() +if(UseLibCxx AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + message(FATAL_ERROR "You can only use libc++ with clang" ) +endif() + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (${FORCE_COLORED_OUTPUT}) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-fcolor-diagnostics -fansi-escape-codes) + add_link_options(-fcolor-diagnostics -fansi-escape-codes) + elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU") add_compile_options(-fdiagnostics-color=always) - else() - add_compile_options(-fcolor-diagnostics) + add_link_options(-fdiagnostics-color=always) endif() endif() if (WARNINGS_ARE_ERRORS) @@ -45,127 +58,132 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options_safe(-Og) add_compile_options_safe(-g3) endif() - add_compile_options("-Wall") - add_compile_options("-Wextra") - add_compile_options("-pedantic") - add_compile_options("-Wc++14-compat") - add_compile_options("-Wc++17-compat") - add_compile_options_safe("-Wc++20-compat") - add_compile_options_safe("-Wc++14-compat-pedantic") - add_compile_options_safe("-Wc++17-compat-pedantic") - add_compile_options_safe("-Wc++20-compat-pedantic") - add_compile_options_safe("-Walloc-zero") - add_compile_options("-Walloca") - add_compile_options_safe("-Wanalyzer-too-complex") - add_compile_options_safe("-Warith-conversion") - add_compile_options_safe("-Warray-bounds-pointer-arithmetic") - add_compile_options_safe("-Wassign-enum") - add_compile_options_safe("-Wbad-function-cast") - add_compile_options_safe("-Wbitwise-op-parentheses") - add_compile_options_safe("-Wbraced-scalar-init") - add_compile_options_safe("-Wbridge-cast") - add_compile_options("-Wcast-align") - add_compile_options_safe("-Wcast-align=strict") - add_compile_options("-Wcast-qual") - add_compile_options_safe("-Wchar-subscripts") - add_compile_options_safe("-Wcomma") - add_compile_options_safe("-Wcomma-subscript") - add_compile_options_safe("-Wcomment") - add_compile_options_safe("-Wconditionally-supported") - add_compile_options_safe("-Wcovered-switch-default") - add_compile_options("-Wctor-dtor-privacy") - add_compile_options("-Wdate-time") - add_compile_options_safe("-Wdeprecated-copy") - add_compile_options_safe("-Wdeprecated-copy-dtor") - add_compile_options_safe("-Wdeprecated-dynamic-exception-spec") - add_compile_options("-Wdisabled-optimization") - add_compile_options("-Wdouble-promotion") - add_compile_options_safe("-Wduplicated-branches") - add_compile_options_safe("-Wduplicated-cond") - add_compile_options_safe("-Wempty-init-stmt") - add_compile_options("-Wextra-semi") - add_compile_options_safe("-Wfor-loop-analysis") - add_compile_options("-Wformat-nonliteral") - add_compile_options("-Wformat-security") - add_compile_options_safe("-Wformat-signedness") - add_compile_options("-Wformat-y2k") - add_compile_options_safe("-Wfour-char-constants") - add_compile_options_safe("-Wgcc-compat") - add_compile_options_safe("-Wheader-hygiene") - add_compile_options_safe("-Widiomatic-parentheses") - add_compile_options_safe("-Wint-in-bool-context") - add_compile_options("-Winvalid-pch") - add_compile_options_safe("-Wlogical-op") - add_compile_options_safe("-Wlogical-op-parentheses") - add_compile_options_safe("-Wmany-braces-around-scalar-init") - add_compile_options_safe("-Wmisleading-indentation") - add_compile_options_safe("-Wmismatched-tags") - # add_compile_options("-Wmissing-braces") - add_compile_options("-Wmissing-include-dirs") - add_compile_options_safe("-Wmove") - add_compile_options("-Wmultichar") - add_compile_options_safe("-Wnoexcept") - add_compile_options("-Wnon-virtual-dtor") - add_compile_options("-Wnull-dereference") - add_compile_options("-Wold-style-cast") - add_compile_options_safe("-Wover-aligned") - add_compile_options("-Woverloaded-virtual") - add_compile_options("-Wpacked") - add_compile_options("-Wredundant-decls") - add_compile_options_safe("-Wredundant-tags") - add_compile_options("-Wregister") - add_compile_options_safe("-Wshadow=compatible-local") - add_compile_options_safe("-Wshadow=local") - add_compile_options_safe("-Wshadow-field") - add_compile_options_safe("-Wshadow-field-in-constructor") - add_compile_options_safe("-Wshadow-field-in-constructor-modified") - add_compile_options_safe("-Wshadow-ivar") - add_compile_options_safe("-Wshadow-uncaptured-local") - # add_compile_options("-Wsign-promo") - add_compile_options("-Wstack-protector") - add_compile_options_safe("-Wstrict-null-sentinel") - add_compile_options_safe("-Wstring-conversion") - add_compile_options_safe("-Wstring-plus-char") - add_compile_options_safe("-Wsuggest-attribute=cold") - add_compile_options_safe("-Wsuggest-attribute=const") - add_compile_options_safe("-Wsuggest-attribute=format") - add_compile_options_safe("-Wsuggest-attribute=malloc") - add_compile_options_safe("-Wsuggest-attribute=noreturn") - add_compile_options_safe("-Wsuggest-attribute=pure") - add_compile_options_safe("-Wsuggest-final-methods") - add_compile_options_safe("-Wsuggest-final-types") - add_compile_options_safe("-Wsuggest-destructor-override") - add_compile_options_safe("-Wsuggest-override") - # add_compile_options("-Wswitch-default") - add_compile_options("-Wswitch-enum") - add_compile_options("-Wsynth") - add_compile_options_safe("-Wtrampolines") - add_compile_options("-Wundef") - add_compile_options_safe("-Wunused-label") - add_compile_options_safe("-Wunused-lambda-capture") - add_compile_options_safe("-Wunused-local-typedef") - add_compile_options("-Wunused-macros") - add_compile_options_safe("-Wuseless-cast") - add_compile_options_safe("-Wvector-conversion") - add_compile_options_safe("-Wvector-operation-performance") - add_compile_options_safe("-Wvirtual-inheritance") - add_compile_options_safe("-Wvolatile") - add_compile_options("-Wzero-as-null-pointer-constant") - add_compile_options_safe("-Warray-bounds=2") - add_compile_options_safe("-Wattribute-alias=2") - add_compile_options_safe("-Wcatch-value=3") - add_compile_options_safe("-Wformat-overflow=2") - add_compile_options_safe("-Wformat-truncation=2") - add_compile_options_safe("-Wformat=2") - add_compile_options("-Wimplicit-fallthrough") - add_compile_options_safe("-Wimplicit-fallthrough=3") - add_compile_options_safe("-Wplacement-new=2") - add_compile_options_safe("-Wshift-overflow=2") - add_compile_options_safe("-Wstrict-aliasing=3") - add_compile_options("-Wstrict-overflow=2") - add_compile_options_safe("-Wstringop-overflow=4") - add_compile_options("-Wunused-const-variable") - add_compile_options_safe("-Wunused-const-variable=1") + if(UseLibCxx) + add_compile_options(-stdlib=libc++) + add_link_options(-stdlib=libc++ -lc++) + # add_link_options("-lc++abi") + endif() + add_compile_options(-Wall) + add_compile_options(-Wextra) + add_compile_options(-pedantic) + add_compile_options(-Wc++14-compat) + add_compile_options(-Wc++17-compat) + add_compile_options_safe(-Wc++20-compat) + add_compile_options_safe(-Wc++14-compat-pedantic) + add_compile_options_safe(-Wc++17-compat-pedantic) + add_compile_options_safe(-Wc++20-compat-pedantic) + add_compile_options_safe(-Walloc-zero) + add_compile_options(-Walloca) + add_compile_options_safe(-Wanalyzer-too-complex) + add_compile_options_safe(-Warith-conversion) + add_compile_options_safe(-Warray-bounds-pointer-arithmetic) + add_compile_options_safe(-Wassign-enum) + add_compile_options_safe(-Wbad-function-cast) + add_compile_options_safe(-Wbitwise-op-parentheses) + add_compile_options_safe(-Wbraced-scalar-init) + add_compile_options_safe(-Wbridge-cast) + add_compile_options(-Wcast-align) + add_compile_options_safe(-Wcast-align=strict) + add_compile_options(-Wcast-qual) + add_compile_options_safe(-Wchar-subscripts) + add_compile_options_safe(-Wcomma) + add_compile_options_safe(-Wcomma-subscript) + add_compile_options_safe(-Wcomment) + add_compile_options_safe(-Wconditionally-supported) + add_compile_options_safe(-Wcovered-switch-default) + add_compile_options(-Wctor-dtor-privacy) + add_compile_options(-Wdate-time) + add_compile_options_safe(-Wdeprecated-copy) + add_compile_options_safe(-Wdeprecated-copy-dtor) + add_compile_options_safe(-Wdeprecated-dynamic-exception-spec) + add_compile_options(-Wdisabled-optimization) + add_compile_options(-Wdouble-promotion) + add_compile_options_safe(-Wduplicated-branches) + add_compile_options_safe(-Wduplicated-cond) + add_compile_options_safe(-Wempty-init-stmt) + add_compile_options(-Wextra-semi) + add_compile_options_safe(-Wfor-loop-analysis) + add_compile_options(-Wformat-nonliteral) + add_compile_options(-Wformat-security) + add_compile_options_safe(-Wformat-signedness) + add_compile_options(-Wformat-y2k) + add_compile_options_safe(-Wfour-char-constants) + add_compile_options_safe(-Wgcc-compat) + add_compile_options_safe(-Wheader-hygiene) + add_compile_options_safe(-Widiomatic-parentheses) + add_compile_options_safe(-Wint-in-bool-context) + add_compile_options(-Winvalid-pch) + add_compile_options_safe(-Wlogical-op) + add_compile_options_safe(-Wlogical-op-parentheses) + add_compile_options_safe(-Wmany-braces-around-scalar-init) + add_compile_options_safe(-Wmisleading-indentation) + add_compile_options_safe(-Wmismatched-tags) + # add_compile_options(-Wmissing-braces) + add_compile_options(-Wmissing-include-dirs) + add_compile_options_safe(-Wmove) + add_compile_options(-Wmultichar) + add_compile_options_safe(-Wnoexcept) + add_compile_options(-Wnon-virtual-dtor) + add_compile_options(-Wnull-dereference) + add_compile_options(-Wold-style-cast) + add_compile_options_safe(-Wover-aligned) + add_compile_options(-Woverloaded-virtual) + add_compile_options(-Wpacked) + add_compile_options(-Wredundant-decls) + add_compile_options_safe(-Wredundant-tags) + add_compile_options(-Wregister) + add_compile_options_safe(-Wshadow=compatible-local) + add_compile_options_safe(-Wshadow=local) + add_compile_options_safe(-Wshadow-field) + add_compile_options_safe(-Wshadow-field-in-constructor) + add_compile_options_safe(-Wshadow-field-in-constructor-modified) + add_compile_options_safe(-Wshadow-ivar) + add_compile_options_safe(-Wshadow-uncaptured-local) + # add_compile_options(-Wsign-promo) + add_compile_options(-Wstack-protector) + add_compile_options_safe(-Wstrict-null-sentinel) + add_compile_options_safe(-Wstring-conversion) + add_compile_options_safe(-Wstring-plus-char) + add_compile_options_safe(-Wsuggest-attribute=cold) + add_compile_options_safe(-Wsuggest-attribute=const) + add_compile_options_safe(-Wsuggest-attribute=format) + add_compile_options_safe(-Wsuggest-attribute=malloc) + add_compile_options_safe(-Wsuggest-attribute=noreturn) + add_compile_options_safe(-Wsuggest-attribute=pure) + add_compile_options_safe(-Wsuggest-final-methods) + add_compile_options_safe(-Wsuggest-final-types) + add_compile_options_safe(-Wsuggest-destructor-override) + add_compile_options_safe(-Wsuggest-override) + # add_compile_options(-Wswitch-default) + add_compile_options(-Wswitch-enum) + add_compile_options(-Wsynth) + add_compile_options_safe(-Wtrampolines) + add_compile_options(-Wundef) + add_compile_options_safe(-Wunused-label) + add_compile_options_safe(-Wunused-lambda-capture) + add_compile_options_safe(-Wunused-local-typedef) + add_compile_options(-Wunused-macros) + add_compile_options_safe(-Wuseless-cast) + add_compile_options_safe(-Wvector-conversion) + add_compile_options_safe(-Wvector-operation-performance) + add_compile_options_safe(-Wvirtual-inheritance) + add_compile_options_safe(-Wvolatile) + add_compile_options(-Wzero-as-null-pointer-constant) + add_compile_options_safe(-Warray-bounds=2) + add_compile_options_safe(-Wattribute-alias=2) + add_compile_options_safe(-Wcatch-value=3) + add_compile_options_safe(-Wformat-overflow=2) + add_compile_options_safe(-Wformat-truncation=2) + add_compile_options_safe(-Wformat=2) + add_compile_options(-Wimplicit-fallthrough) + add_compile_options_safe(-Wimplicit-fallthrough=3) + add_compile_options_safe(-Wplacement-new=2) + add_compile_options_safe(-Wshift-overflow=2) + add_compile_options_safe(-Wstrict-aliasing=3) + add_compile_options(-Wstrict-overflow=2) + add_compile_options_safe(-Wstringop-overflow=4) + add_compile_options(-Wunused-const-variable) + add_compile_options_safe(-Wunused-const-variable=1) elseif (MSVC) if (WARNINGS_ARE_ERRORS) add_compile_options("/WX")