rom-properties/extlib/CMakeLists.txt
David Korth 3022868577 [pugixml] Disable functionality we don't need.
This reduces the size of pugixml.dll to within range of what
tinyxml-10.dll was in previous versions.

Size comparisons: (amd64 release build, with LTO, MSVC 2022 17.6.5)

tinyxml-10.dll in rom-properties 2.4.1: 105,472

pugixml.dll:
- With all enabled:     222,208
- Disable XPATH:        142,336
- + disable STL:        121,856
- + disable exceptions: 121,856

NOTE: Disabling exceptions doesn't seem to change the code size at all,
even if STL is left enabled.
2025-04-20 11:13:35 -04:00

449 lines
12 KiB
CMake
Vendored

PROJECT(extlib)
# Set common properties for extlib targets.
INCLUDE(SetMSVCDebugPath)
FUNCTION(SET_EXTLIB_PROPERTIES)
FOREACH(_target ${ARGV})
IF(TARGET ${_target})
# Exclude from ALL builds.
# NOTE: Cannot remove targets from all builds
# if they're being installed.
IF(SKIP_INSTALL_LIBRARIES OR SKIP_INSTALL_ALL)
# Nothing to do here.
ELSE()
# Exclude this target from ALL builds.
SET_TARGET_PROPERTIES(${_target} PROPERTIES EXCLUDE_FROM_ALL TRUE)
ENDIF()
# Enable PIC.
SET_TARGET_PROPERTIES(${_target} PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
ENDIF(TARGET ${_target})
ENDFOREACH(_target ${ARGV})
ENDFUNCTION(SET_EXTLIB_PROPERTIES)
FUNCTION(SET_EXTLIB_PROPERTIES_PIC_ONLY)
FOREACH(_target ${ARGV})
IF(TARGET ${_target})
# Exclude from ALL builds; enable PIC.
SET_TARGET_PROPERTIES(${_target} PROPERTIES
POSITION_INDEPENDENT_CODE TRUE
)
ENDIF(TARGET ${_target})
ENDFOREACH(_target ${ARGV})
ENDFUNCTION(SET_EXTLIB_PROPERTIES_PIC_ONLY)
# Don't install any of these libraries by default.
# zlib-ng and libpng will be installed if they're
# built as shared libraries.
SET(SKIP_INSTALL_BINARIES ON)
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_HEADERS ON)
SET(SKIP_INSTALL_FILES ON)
SET(SKIP_INSTALL_CONFIG_FILE ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
INCLUDE(DirInstallPaths)
SET(INSTALL_BIN_DIR "${DIR_INSTALL_DLL}")
SET(INSTALL_LIB_DIR "${DIR_INSTALL_LIB}")
IF(USE_INTERNAL_ZLIB)
# Use the internal copy of zlib-ng.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL OFF)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ENDIF()
# zlib-ng options
SET(WITH_GZFILEOP ON)
SET(ZLIB_COMPAT ON)
SET(ZLIB_ENABLE_TESTS OFF)
SET(ZLIBNG_ENABLE_TESTS OFF)
SET(WITH_GTEST OFF)
SET(WITH_FUZZERS OFF)
SET(WITH_BENCHMARKS OFF)
SET(WITH_BENCHMARK_APPS OFF)
SET(WITH_OPTIM ON)
SET(WITH_REDUCED_MEM OFF)
SET(WITH_NEW_STRATEGIES ON)
SET(WITH_NATIVE_INSTRUCTIONS OFF)
SET(WITH_RUNTIME_CPU_DETECTION ON)
SET(WITH_MAINTAINER_WARNINGS OFF)
SET(WITH_CODE_COVERAGE OFF)
SET(WITH_INFLATE_STRICT OFF)
SET(WITH_INFLATE_ALLOW_INVALID_DIST OFF)
# CPU-specific optimizations
SET(WITH_ACLE ON)
SET(WITH_NEON ON)
SET(WITH_ALTIVEC ON)
SET(WITH_POWER8 ON)
SET(WITH_POWER9 ON)
SET(WITH_RVV ON)
SET(WITH_DFLTCC_DEFLATE OFF)
SET(WITH_DFLTCC_INFLATE OFF)
SET(WITH_CRC32_VX ON)
SET(WITH_SSE2 ON)
SET(WITH_SSSE3 ON)
SET(WITH_SSE42 ON)
SET(WITH_PCLMULQDQ ON)
SET(WITH_AVX2 ON)
SET(WITH_AVX512 ON)
SET(WITH_AVX512VNNI ON)
SET(WITH_VPCLMULQDQ ON)
SET(INSTALL_UTILS OFF)
ADD_SUBDIRECTORY(zlib-ng)
# NOTE: Cannot remove targets from all builds
# if they're being installed.
#SET_EXTLIB_PROPERTIES(zlib)
SET_EXTLIB_PROPERTIES_PIC_ONLY(zlib)
SET_EXTLIB_PROPERTIES(zlibstatic)
ENDIF(USE_INTERNAL_ZLIB)
IF(USE_INTERNAL_PNG)
IF(USE_INTERNAL_ZLIB)
# Using internal ZLIB.
# Don't search for ZLIB using FIND_PACKAGE().
SET(PNG_BUILD_ZLIB ON)
ENDIF(USE_INTERNAL_ZLIB)
# Use the internal copy of libpng.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(PNG_SHARED ON)
SET(PNG_STATIC OFF)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL OFF)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
ELSE()
SET(PNG_SHARED OFF)
SET(PNG_STATIC ON)
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ENDIF()
SET(PNG_TESTS OFF)
SET(PNG_TOOLS OFF)
SET(PNG_DEBUG OFF)
SET(PNG_HARDWARE_OPTIMIZATIONS ON)
ADD_SUBDIRECTORY(libpng)
# NOTE: Cannot remove targets from all builds
# if they're being installed.
#SET_EXTLIB_PROPERTIES(png_shared)
SET_EXTLIB_PROPERTIES_PIC_ONLY(png_shared)
SET_EXTLIB_PROPERTIES(png_static)
ENDIF(USE_INTERNAL_PNG)
IF(USE_INTERNAL_ZSTD)
# Use the internal copy of zstd.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL OFF)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
SET(ZSTD_LIBRARY zstd)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
SET(ZSTD_LIBRARY zstdstatic)
ENDIF()
SET(ZSTD_LIBRARIES "${ZSTD_LIBRARY}")
ADD_SUBDIRECTORY(zstd)
# NOTE: Cannot remove targets from all builds
# if they're being installed.
#SET_EXTLIB_PROPERTIES(zstd)
SET_EXTLIB_PROPERTIES_PIC_ONLY(zstd)
SET_EXTLIB_PROPERTIES(zstdstatic)
ELSE(USE_INTERNAL_ZSTD)
SET(ZSTD_LIBRARY zstd)
ENDIF(USE_INTERNAL_ZSTD)
# minizip-ng
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
# NOTE: We're always using the internal copy of MiniZip-NG.
# TODO: Support a system-wide version on Linux?
# NOTE: MiniZip-NG uses SKIP_INSTALL_HDR instead of SKIP_INSTALL_HEADERS.
SET(USE_INTERNAL_MINIZIP TRUE PARENT_SCOPE)
SET(SKIP_INSTALL_HDR ON)
IF(WIN32)
SET(USE_INTERNAL_MINIZIP_DLL TRUE PARENT_SCOPE)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL OFF)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
ELSE()
UNSET(USE_INTERNAL_MINIZIP_DLL PARENT_SCOPE)
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ENDIF()
SET(MZ_COMPAT ON)
SET(MZ_ZLIB ON)
SET(MZ_BZIP2 OFF)
SET(MZ_LZMA OFF)
SET(MZ_ZSTD OFF) # FIXME: Need to ensure zstd.dll is loaded before using MiniZip
SET(MZ_FETCH_LIBS OFF)
SET(MZ_FORCE_FETCH_LIBS OFF)
SET(MZ_PKCRYPT OFF)
SET(MZ_WZAES OFF)
SET(MZ_LIBCOMP OFF)
SET(MZ_LIBBSD OFF)
SET(MZ_OPENSSL OFF)
SET(MZ_BRG OFF)
SET(MZ_ICONV OFF)
SET(MZ_SIGNING OFF)
SET(MZ_COMPRESS_ONLY OFF)
SET(MZ_DECOMPRESS_ONLY OFF)
SET(MZ_BUILD_TESTS ON) # Allow manually building test executables.
SET(MZ_BUILD_UNIT_TESTS OFF)
SET(MZ_BUILD_FUZZ_TESTS OFF)
SET(MZ_CODE_COVERAGE OFF)
SET(MZ_FILE32_API OFF)
ADD_SUBDIRECTORY(minizip-ng)
SET_EXTLIB_PROPERTIES(minizip)
SET_EXTLIB_PROPERTIES(minigzip_cli)
SET_EXTLIB_PROPERTIES(minizip_cli)
IF(WIN32)
SET(ZEXPORT "-DZEXPORT=__declspec(dllexport)")
ENDIF(WIN32)
TARGET_COMPILE_DEFINITIONS(minizip PUBLIC -DMZ_COMPAT_VERSION=120 ${ZEXPORT} -DSTRICTZIPUNZIP=1 -DSTRICTZIP=1 -DSTRICTUNZIP=1)
UNSET(USE_COMPAT)
UNSET(COMPRESS_ONLY)
UNSET(DECOMPRESS_ONLY)
# inih
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ADD_SUBDIRECTORY(inih)
SET_EXTLIB_PROPERTIES(inih)
# PugiXML
IF(USE_INTERNAL_XML)
# Use the internal copy of PugiXML.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
# TODO: Build a dylib for Mac OS X.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL OFF)
SET(BUILD_STATIC_LIBS OFF)
SET(BUILD_SHARED_LIBS ON)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_STATIC_LIBS ON)
SET(BUILD_SHARED_LIBS OFF)
ENDIF()
SET(PUGIXML_USE_VERSIONED_LIBDIR OFF)
SET(PUGIXML_USE_POSTFIX ON)
SET(PUGIXML_STATIC_CRT OFF)
SET(PUGIXML_BUILD_TESTS OFF)
SET(PUGIXML_WCHAR_MODE OFF)
SET(PUGIXML_COMPACT OFF)
SET(PUGIXML_INSTALL ON)
# Disable functionality we don't need.
SET(PUGIXML_NO_XPATH ON)
SET(PUGIXML_NO_STL ON)
SET(PUGIXML_NO_EXCEPTIONS ON)
# Build PugiXML.
ADD_SUBDIRECTORY(pugixml)
SET_EXTLIB_PROPERTIES(pugixml-shared)
SET_EXTLIB_PROPERTIES(pugixml-static)
ENDIF(USE_INTERNAL_XML)
# UnICE68 for Atari ST SNDH files.
IF(ENABLE_UNICE68)
SET(BUILD_UNICE68_CLI ON) # only builds if unice68_exe is explicitly built
SET(BUILD_STATIC_LIBS ON)
SET(BUILD_SHARED_LIBS OFF)
ADD_SUBDIRECTORY(unice68)
SET_EXTLIB_PROPERTIES(unice68_lib)
SET_EXTLIB_PROPERTIES(unice68_exe)
ENDIF(ENABLE_UNICE68)
# libmspack-xenia for LZX-compressed Xbox 360 executables.
IF(ENABLE_LIBMSPACK)
SET(BUILD_STATIC_LIBS ON)
SET(BUILD_SHARED_LIBS OFF)
ADD_SUBDIRECTORY(libmspack-xenia)
SET_EXTLIB_PROPERTIES(mspack)
ENDIF(ENABLE_LIBMSPACK)
# PowerVR texture decompression.
IF(ENABLE_PVRTC)
SET(BUILD_STATIC_LIBS ON)
SET(BUILD_SHARED_LIBS OFF)
ADD_SUBDIRECTORY(PowerVR)
SET_EXTLIB_PROPERTIES(pvrtc)
ENDIF(ENABLE_PVRTC)
IF(USE_INTERNAL_LZ4)
# Use the internal copy of LZ4.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ENDIF()
SET(LZ4_BUNDLED_MODE ON)
ADD_SUBDIRECTORY(lz4/build/cmake)
SET_EXTLIB_PROPERTIES(lz4_shared)
SET_EXTLIB_PROPERTIES(lz4_static)
# lz4 programs that we don't need.
SET_EXTLIB_PROPERTIES(lz4cli lz4c)
ENDIF(USE_INTERNAL_LZ4)
IF(USE_INTERNAL_LZO)
# Use the internal copy of LZO. (actually MiniLZO)
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
ENDIF()
ADD_SUBDIRECTORY(minilzo)
SET_EXTLIB_PROPERTIES(minilzo)
ENDIF(USE_INTERNAL_LZO)
# rapidjson
SET(RAPIDJSON_BUILD_DOC OFF)
SET(RAPIDJSON_BUILD_EXAMPLES OFF)
SET(RAPIDJSON_BUILD_TESTS OFF)
SET(RAPIDJSON_BUILD_THIRDPARTY_GTEST OFF)
SET(RAPIDJSON_BUILD_CXX11 ON)
SET(RAPIDJSON_BUILD_ASAN OFF)
SET(RAPIDJSON_BUILD_UBSAN OFF)
SET(RAPIDJSON_HAS_STDSTRING ON)
ADD_SUBDIRECTORY(rapidjson)
SET(RAPIDJSON_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/include" PARENT_SCOPE)
# Google Test
IF(BUILD_TESTING)
# Reference: http://stackoverflow.com/questions/12540970/how-to-make-gtest-build-mdd-instead-of-mtd-by-default-using-cmake
SET(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll")
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
# Use shared libraries on Windows.
IF(WIN32)
SET(BUILD_STATIC_LIBS OFF)
SET(BUILD_SHARED_LIBS ON)
ELSE(WIN32)
SET(BUILD_STATIC_LIBS ON)
SET(BUILD_SHARED_LIBS OFF)
ENDIF(WIN32)
ADD_SUBDIRECTORY(googletest)
INCLUDE(SetMSVCDebugPath)
SET_EXTLIB_PROPERTIES(
gtest gtest_main gtest_no_exception gtest_main_no_exception
gtest_main_no_rtti gtest_dll gtest_main_use_own_tuple
gmock gmock_main gmock_main_no_exception
gmock_main_no_rtti gmock_main_use_own_tuple
)
IF(WIN32)
# GTest is a DLL, so we need to set this.
TARGET_COMPILE_DEFINITIONS(gtest INTERFACE GTEST_LINKED_AS_SHARED_LIBRARY=1)
#TARGET_COMPILE_DEFINITIONS(gtest_main INTERFACE GTEST_LINKED_AS_SHARED_LIBRARY=1)
ENDIF(WIN32)
ENDIF(BUILD_TESTING)
# Basis Universal ASTC decoder
IF(ENABLE_ASTC)
ADD_SUBDIRECTORY(basisu_astc)
SET_EXTLIB_PROPERTIES(basisu_astc)
ENDIF(ENABLE_ASTC)
# uniwidth (subset of gnulib) (needed for wcwidth())
# wcwidth() requires _XOPEN_SOURCE.
SET(OLD_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_XOPEN_SOURCE)
CHECK_SYMBOL_EXISTS(wcwidth "wchar.h" HAVE_WCWIDTH)
SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_CMAKE_REQUIRED_DEFINITIONS})
UNSET(OLD_CMAKE_REQUIRED_DEFINITIONS)
IF(NOT HAVE_WCWIDTH)
ADD_SUBDIRECTORY(uniwidth)
SET_EXTLIB_PROPERTIES(uniwidth)
ENDIF(NOT HAVE_WCWIDTH)
# MicroTAR (for libromdata tests)
ADD_SUBDIRECTORY(microtar)
SET_EXTLIB_PROPERTIES(microtar)
IF(USE_INTERNAL_FMT)
# Use the internal copy of fmt.
# On Windows, this will build DLLs.
# On other systems, this will be statically-linked.
IF(WIN32)
SET(SKIP_INSTALL_LIBRARIES OFF)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS ON)
SET(BUILD_STATIC_LIBS OFF)
SET(FMT_INSTALL ON)
ELSE()
SET(SKIP_INSTALL_LIBRARIES ON)
SET(SKIP_INSTALL_ALL ON)
SET(BUILD_SHARED_LIBS OFF)
SET(BUILD_STATIC_LIBS ON)
SET(FMT_INSTALL OFF)
ENDIF()
SET(FMT_PEDANTIC OFF)
SET(FMT_WERROR OFF)
SET(FMT_DOC OFF)
SET(FMT_TEST OFF)
SET(FMT_CUDA_TEST OFF)
SET(FMT_OS ON)
SET(FMT_MODULE OFF)
SET(FMT_SYSTEM_HEADERS OFF)
SET(FMT_UNICODE ON)
ADD_SUBDIRECTORY(fmt)
SET_EXTLIB_PROPERTIES(fmt)
#SET_EXTLIB_PROPERTIES(fmt-header-only)
ENDIF(USE_INTERNAL_FMT)