diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index c1e2dcbb..3e67e05a 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -115,7 +115,7 @@ steps: set -xue export CMAKE_BUILD_PARALLEL_LEVEL="$(${NPROC_COMMAND:-nproc})" echo "${CMAKE_BUILD_PARALLEL_LEVEL}" - cmake_args=(-G"${CMAKE_GENERATOR:-Ninja}") + cmake_args=(-G"${CMAKE_GENERATOR:-Ninja}" -DUSE_WERROR=ON) if [ -n "${TOOLCHAIN_FILE:-}" ]; then cmake_args+=(-DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN_FILE}") fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ca66e60..e67ee3df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,11 @@ option(USE_LTO "Enable link-time optimization" OFF) # Enabling fast math makes generated images less likely to be reproducible. # See https://github.com/DaemonEngine/crunch/issues/29 option(USE_FAST_MATH "Enable fast math (generated images are less likely to be reproducible)" OFF) +# Enabling -Werror makes every warnings fatal. +option(USE_WERROR "Tell the compiler to make the build fail when warnings are present" OFF) +# Ignoring known warning from third-party vendored libs makes possible to reduce the scope of +# -Werror on crunch. +option(IGNORE_VENDORED_WARNING "Ignore known warning from vendored lib (not our fault!)" ON) if (BUILD_STATIC_LIBCRN) option(INSTALL_STATIC_LIBCRN "Install static libraries" OFF) @@ -97,6 +102,10 @@ if (MSVC) # Enable MSVC parallel compilation. set_c_cxx_flag("/MP") + if (USE_WERROR) + try_c_cxx_flag(WARNINGS "/WX") + endif() + # MSVC doesn't implement strict aliasing so there is nothing else to do. # CMake already sets the /O2 flag on Release and RelWithDebInfo build and /O[1-2] already sets the /Oy flag. @@ -121,6 +130,10 @@ if (MSVC) set_linker_flag("/LTCG" MINSIZEREL) endif() else() + if (USE_WERROR) + try_c_cxx_flag(WARNINGS "-Werror") + endif() + # As written in crnlib.h and stb_image.h, strict aliasing should always be disabled. set_c_cxx_flag("-fno-strict-aliasing") diff --git a/crnlib/CMakeLists.txt b/crnlib/CMakeLists.txt index 4d797361..bca42d04 100644 --- a/crnlib/CMakeLists.txt +++ b/crnlib/CMakeLists.txt @@ -2,6 +2,8 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../inc ) +add_subdirectory(lzma) + # Defines the source code for the library set(CRNLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crn_arealist.cpp @@ -147,102 +149,12 @@ set(CRNLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../inc/crn_decomp.h ${CMAKE_CURRENT_SOURCE_DIR}/../inc/crnlib.h ${CMAKE_CURRENT_SOURCE_DIR}/../inc/dds_defs.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zAlloc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zAlloc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zArcIn.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zBuf2.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zBuf.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zBuf.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zCrc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zCrc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zCrcOpt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zDec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zFile.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zFile.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7z.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zStream.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zTypes.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zVersion.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/7zWindows.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Aes.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Aes.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/AesOpt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Alloc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Alloc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bcj2.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bcj2Enc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bcj2.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bra86.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bra.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Bra.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/BraIA64.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Compiler.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/CpuArch.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/CpuArch.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Delta.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Delta.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/DllSecur.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/DllSecur.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFind.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFind.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFindMt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFindMt.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFindOpt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzHash.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2Dec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2Dec.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2DecMt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2DecMt.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2Enc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma2Enc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma86Dec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma86Enc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Lzma86.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaDec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaDec.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaEnc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaEnc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaLib.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzmaLib.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/MtCoder.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/MtCoder.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/MtDec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/MtDec.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Ppmd7.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Ppmd7Dec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Ppmd7Enc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Ppmd7.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Ppmd.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Precomp.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/RotateDefs.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Sha256.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Sha256.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Sha256Opt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Sort.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Sort.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/SwapBytes.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/SwapBytes.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Threads.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Threads.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Xz.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzCrc64.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzCrc64.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzCrc64Opt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzDec.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzEnc.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzEnc.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Xz.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/XzIn.c ) if(WIN32) set(CRNLIB_THREAD_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crn_threading_win32.cpp ${CMAKE_CURRENT_SOURCE_DIR}/crn_threading_win32.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFindMt.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/LzFindMt.h - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Threads.c - ${CMAKE_CURRENT_SOURCE_DIR}/lzma/Threads.h ) else() set(CRNLIB_THREAD_SRCS @@ -265,7 +177,9 @@ else() set(CRUNCH_OTHER_LIBRARY_SUFFIX -shared) endif() -add_library(${CRUNCH_LIBRARY_NAME} ${CRUNCH_DEFAULT_LIBRARY_TYPE} $) +set(CRUNCH_TARGET_OBJECTS $ $) + +add_library(${CRUNCH_LIBRARY_NAME} ${CRUNCH_DEFAULT_LIBRARY_TYPE} ${CRUNCH_TARGET_OBJECTS}) set_property(TARGET ${CRUNCH_LIBRARY_NAME} PROPERTY POSITION_INDEPENDENT_CODE 1) if (BUILD_SHARED_LIBS OR (BUILD_STATIC_LIBCRN AND INSTALL_STATIC_LIBCRN)) @@ -275,7 +189,7 @@ endif() if ((BUILD_SHARED_LIBS AND BUILD_STATIC_LIBCRN) OR (NOT BUILD_SHARED_LIBS AND BUILD_SHARED_LIBCRN)) set(CRUNCH_OTHER_LIBRARY_NAME ${CRUNCH_LIBRARY_NAME}${CRUNCH_OTHER_LIBRARY_SUFFIX}) - add_library(${CRUNCH_OTHER_LIBRARY_NAME} ${CRUNCH_OTHER_LIBRARY_TYPE} $) + add_library(${CRUNCH_OTHER_LIBRARY_NAME} ${CRUNCH_OTHER_LIBRARY_TYPE} ${CRUNCH_TARGET_OBJECTS}) set_property(TARGET ${CRUNCH_OTHER_LIBRARY_NAME} PROPERTY POSITION_INDEPENDENT_CODE 1) if(NOT WIN32) diff --git a/crnlib/crn_core.h b/crnlib/crn_core.h index c1f31b03..4d3f9fde 100644 --- a/crnlib/crn_core.h +++ b/crnlib/crn_core.h @@ -21,7 +21,9 @@ // Otherwise, we disable exceptions for a small speed boost. #define _HAS_EXCEPTIONS 0 #endif +#ifndef NOMINMAX #define NOMINMAX +#endif #define CRNLIB_USE_WIN32_API 1 diff --git a/crnlib/lzma/CMakeLists.txt b/crnlib/lzma/CMakeLists.txt new file mode 100644 index 00000000..40c279df --- /dev/null +++ b/crnlib/lzma/CMakeLists.txt @@ -0,0 +1,115 @@ +set(LZMA_LIBRARY_NAME "lzma") + +# Defines the source code for the library. +set(LZMALIB_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/7zAlloc.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zAlloc.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zArcIn.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zBuf2.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zBuf.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zBuf.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zCrc.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zCrc.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zCrcOpt.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zDec.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zFile.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zFile.h + ${CMAKE_CURRENT_SOURCE_DIR}/7z.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zStream.c + ${CMAKE_CURRENT_SOURCE_DIR}/7zTypes.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zVersion.h + ${CMAKE_CURRENT_SOURCE_DIR}/7zWindows.h + ${CMAKE_CURRENT_SOURCE_DIR}/Aes.c + ${CMAKE_CURRENT_SOURCE_DIR}/Aes.h + ${CMAKE_CURRENT_SOURCE_DIR}/AesOpt.c + ${CMAKE_CURRENT_SOURCE_DIR}/Alloc.c + ${CMAKE_CURRENT_SOURCE_DIR}/Alloc.h + ${CMAKE_CURRENT_SOURCE_DIR}/Bcj2.c + ${CMAKE_CURRENT_SOURCE_DIR}/Bcj2Enc.c + ${CMAKE_CURRENT_SOURCE_DIR}/Bcj2.h + ${CMAKE_CURRENT_SOURCE_DIR}/Bra86.c + ${CMAKE_CURRENT_SOURCE_DIR}/Bra.c + ${CMAKE_CURRENT_SOURCE_DIR}/Bra.h + ${CMAKE_CURRENT_SOURCE_DIR}/BraIA64.c + ${CMAKE_CURRENT_SOURCE_DIR}/Compiler.h + ${CMAKE_CURRENT_SOURCE_DIR}/CpuArch.c + ${CMAKE_CURRENT_SOURCE_DIR}/CpuArch.h + ${CMAKE_CURRENT_SOURCE_DIR}/Delta.c + ${CMAKE_CURRENT_SOURCE_DIR}/Delta.h + ${CMAKE_CURRENT_SOURCE_DIR}/DllSecur.c + ${CMAKE_CURRENT_SOURCE_DIR}/DllSecur.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzFind.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzFind.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzFindMt.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzFindMt.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzFindOpt.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzHash.h + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2Dec.c + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2Dec.h + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2DecMt.c + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2DecMt.h + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2Enc.c + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma2Enc.h + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma86Dec.c + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma86Enc.c + ${CMAKE_CURRENT_SOURCE_DIR}/Lzma86.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaDec.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaDec.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaEnc.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaEnc.h + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaLib.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzmaLib.h + ${CMAKE_CURRENT_SOURCE_DIR}/MtCoder.c + ${CMAKE_CURRENT_SOURCE_DIR}/MtCoder.h + ${CMAKE_CURRENT_SOURCE_DIR}/MtDec.c + ${CMAKE_CURRENT_SOURCE_DIR}/MtDec.h + ${CMAKE_CURRENT_SOURCE_DIR}/Ppmd7.c + ${CMAKE_CURRENT_SOURCE_DIR}/Ppmd7Dec.c + ${CMAKE_CURRENT_SOURCE_DIR}/Ppmd7Enc.c + ${CMAKE_CURRENT_SOURCE_DIR}/Ppmd7.h + ${CMAKE_CURRENT_SOURCE_DIR}/Ppmd.h + ${CMAKE_CURRENT_SOURCE_DIR}/Precomp.h + ${CMAKE_CURRENT_SOURCE_DIR}/RotateDefs.h + ${CMAKE_CURRENT_SOURCE_DIR}/Sha256.c + ${CMAKE_CURRENT_SOURCE_DIR}/Sha256.h + ${CMAKE_CURRENT_SOURCE_DIR}/Sha256Opt.c + ${CMAKE_CURRENT_SOURCE_DIR}/Sort.c + ${CMAKE_CURRENT_SOURCE_DIR}/Sort.h + ${CMAKE_CURRENT_SOURCE_DIR}/SwapBytes.c + ${CMAKE_CURRENT_SOURCE_DIR}/SwapBytes.h + ${CMAKE_CURRENT_SOURCE_DIR}/Threads.c + ${CMAKE_CURRENT_SOURCE_DIR}/Threads.h + ${CMAKE_CURRENT_SOURCE_DIR}/Xz.c + ${CMAKE_CURRENT_SOURCE_DIR}/XzCrc64.c + ${CMAKE_CURRENT_SOURCE_DIR}/XzCrc64.h + ${CMAKE_CURRENT_SOURCE_DIR}/XzCrc64Opt.c + ${CMAKE_CURRENT_SOURCE_DIR}/XzDec.c + ${CMAKE_CURRENT_SOURCE_DIR}/XzEnc.c + ${CMAKE_CURRENT_SOURCE_DIR}/XzEnc.h + ${CMAKE_CURRENT_SOURCE_DIR}/Xz.h + ${CMAKE_CURRENT_SOURCE_DIR}/XzIn.c +) + +if (WIN32) + set(LZMALIB_THREAD_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/LzFindMt.c + ${CMAKE_CURRENT_SOURCE_DIR}/LzFindMt.h + ${CMAKE_CURRENT_SOURCE_DIR}/Threads.c + ${CMAKE_CURRENT_SOURCE_DIR}/Threads.h + ) +else() + set(LZMALIB_THREAD_SRCS) +endif() + +# Build the library as an object. +set(LZMA_OBJECT_NAME ${LZMA_LIBRARY_NAME}-obj) +set(LZMA_OBJECT_NAME ${LZMA_OBJECT_NAME} PARENT_SCOPE) +add_library(${LZMA_OBJECT_NAME} OBJECT ${LZMALIB_SRCS} ${LZMALIB_THREAD_SRCS}) +set_property(TARGET ${LZMA_OBJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE 1) + +if (IGNORE_VENDORED_WARNING) + test_c_cxx_flag(WNO_STRINGOP_OVERFLOW "-Wno-stringop-overflow") + if (FLAG_WNO_STRINGOP_OVERFLOW) + target_compile_options(${LZMA_OBJECT_NAME} PRIVATE "-Wno-stringop-overflow") + endif() +endif() diff --git a/example1/example1.cpp b/example1/example1.cpp index ac5b3036..b37f00e0 100644 --- a/example1/example1.cpp +++ b/example1/example1.cpp @@ -37,7 +37,9 @@ #if defined(_WIN32) // windows.h is only needed here for GetSystemInfo(). #define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX #define NOMINMAX +#endif #include "windows.h" #elif defined(__FreeBSD__) || defined(__APPLE__) #include diff --git a/inc/crn_decomp.h b/inc/crn_decomp.h index 1abb5558..fa812f81 100644 --- a/inc/crn_decomp.h +++ b/inc/crn_decomp.h @@ -44,7 +44,7 @@ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif -#ifndef +#ifndef NOMINMAX #define NOMINMAX #endif #include "windows.h" // only for IsDebuggerPresent(), DebugBreak(), and OutputDebugStringA()