mirror of
https://github.com/GerbilSoft/rom-properties.git
synced 2025-06-18 11:35:38 -04:00

It's only used by librpbase internally. This is technically an ABI break, even though these functions weren't used outside of librpbase, so bump the SOVERSION to 7.
803 lines
23 KiB
CMake
803 lines
23 KiB
CMake
# RomData subclasses and factory class.
|
|
PROJECT(romdata LANGUAGES CXX)
|
|
|
|
IF(ENABLE_NETWORKING AND NOT WIN32)
|
|
INCLUDE(CheckSymbolExists)
|
|
CHECK_SYMBOL_EXISTS(posix_spawn "spawn.h" HAVE_POSIX_SPAWN)
|
|
ENDIF(ENABLE_NETWORKING AND NOT WIN32)
|
|
|
|
# Sources.
|
|
SET(${PROJECT_NAME}_SRCS
|
|
RomDataFactory.cpp
|
|
|
|
Console/Atari7800.cpp
|
|
Console/CBMCart.cpp
|
|
Console/ColecoVision.cpp
|
|
Console/Dreamcast.cpp
|
|
Console/DreamcastSave.cpp
|
|
Console/GameCube.cpp
|
|
Console/GameCubeBNR.cpp
|
|
Console/GameCubeSave.cpp
|
|
Console/GameCubeRegions.cpp
|
|
Console/Intellivision.cpp
|
|
Console/iQuePlayer.cpp
|
|
Console/MegaDrive.cpp
|
|
Console/MegaDriveRegions.cpp
|
|
Console/N64.cpp
|
|
Console/NES.cpp
|
|
Console/PlayStationDisc.cpp
|
|
Console/PlayStationEXE.cpp
|
|
Console/PlayStationSave.cpp
|
|
Console/Sega8Bit.cpp
|
|
Console/SegaSaturn.cpp
|
|
Console/SNES.cpp
|
|
Console/SufamiTurbo.cpp
|
|
Console/WiiBNR.cpp
|
|
Console/WiiCommon.cpp
|
|
Console/WiiSave.cpp
|
|
Console/WiiTicket.cpp
|
|
Console/WiiTMD.cpp
|
|
Console/WiiU.cpp
|
|
Console/WiiUPackage.cpp
|
|
Console/WiiWAD.cpp
|
|
Console/WiiWAD_ops.cpp
|
|
Console/WiiWIBN.cpp
|
|
Console/Xbox_XBE.cpp
|
|
Console/Xbox360_STFS.cpp
|
|
Console/Xbox360_XDBF.cpp
|
|
Console/Xbox360_XEX.cpp
|
|
Console/XboxDisc.cpp
|
|
|
|
Handheld/DMG.cpp
|
|
Handheld/GameBoyAdvance.cpp
|
|
Handheld/GameCom.cpp
|
|
Handheld/J2ME.cpp
|
|
Handheld/Lynx.cpp
|
|
Handheld/NGPC.cpp
|
|
Handheld/Nintendo3DS.cpp
|
|
Handheld/Nintendo3DS_ops.cpp
|
|
Handheld/Nintendo3DSFirm.cpp
|
|
Handheld/Nintendo3DS_SMDH.cpp
|
|
Handheld/NintendoDS.cpp
|
|
Handheld/NintendoDS_ops.cpp
|
|
Handheld/NintendoDS_BNR.cpp
|
|
Handheld/PalmOS.cpp
|
|
Handheld/PokemonMini.cpp
|
|
Handheld/PSP.cpp
|
|
Handheld/VirtualBoy.cpp
|
|
Handheld/WonderSwan.cpp
|
|
Handheld/nds_crc.cpp
|
|
|
|
Audio/ADX.cpp
|
|
Audio/BCSTM.cpp
|
|
Audio/BRSTM.cpp
|
|
Audio/GBS.cpp
|
|
Audio/NSF.cpp
|
|
Audio/PSF.cpp
|
|
Audio/SAP.cpp
|
|
Audio/SNDH.cpp
|
|
Audio/SID.cpp
|
|
Audio/SPC.cpp
|
|
Audio/VGM.cpp
|
|
|
|
Media/CBMDOS.cpp
|
|
Media/ISO.cpp
|
|
Media/Wim.cpp
|
|
|
|
Other/Amiibo.cpp
|
|
Other/ELF.cpp
|
|
Other/EXE.cpp
|
|
Other/EXE_NE.cpp
|
|
Other/EXE_PE.cpp
|
|
Other/MachO.cpp
|
|
Other/NintendoBadge.cpp
|
|
Other/RpTextureWrapper.cpp
|
|
Other/Lua.cpp
|
|
|
|
data/AmiiboData.cpp
|
|
data/CBMData.cpp
|
|
data/DMGSpecialCases.cpp
|
|
data/ELFData.cpp
|
|
data/EXEData.cpp
|
|
data/EXENEEntries.cpp
|
|
data/MachOData.cpp
|
|
data/NESMappers.cpp
|
|
data/NintendoPublishers.cpp
|
|
data/Nintendo3DSFirmData.cpp
|
|
data/Nintendo3DSSysTitles.cpp
|
|
data/NintendoLanguage.cpp
|
|
data/SegaPublishers.cpp
|
|
data/WiiSystemMenuVersion.cpp
|
|
data/WiiUData.cpp
|
|
data/WonderSwanPublishers.cpp
|
|
data/XboxLanguage.cpp
|
|
data/XboxPublishers.cpp
|
|
data/Xbox360_STFS_ContentType.cpp
|
|
|
|
disc/Cdrom2352Reader.cpp
|
|
disc/CdiReader.cpp
|
|
disc/CIAReader.cpp
|
|
disc/CisoGcnReader.cpp
|
|
disc/CisoPspReader.cpp
|
|
disc/CisoPspDlopen.cpp
|
|
disc/DpfReader.cpp
|
|
disc/GcnFst.cpp
|
|
disc/GcnPartition.cpp
|
|
disc/GcnPartition_p.cpp
|
|
disc/GczReader.cpp
|
|
disc/GdiReader.cpp
|
|
disc/IResourceReader.cpp
|
|
disc/IsoPartition.cpp
|
|
disc/NASOSReader.cpp
|
|
disc/NCCHReader.cpp
|
|
disc/NEResourceReader.cpp
|
|
disc/PEResourceReader.cpp
|
|
disc/WbfsReader.cpp
|
|
disc/WiiPartition.cpp
|
|
disc/WiiUFst.cpp
|
|
disc/WiiUH3Reader.cpp
|
|
disc/WuxReader.cpp
|
|
disc/XDVDFSPartition.cpp
|
|
|
|
config/ImageTypesConfig.cpp
|
|
#config/TImageTypesConfig.cpp # NOT listed here due to template stuff.
|
|
#img/TCreateThumbnail.cpp # NOT listed here due to template stuff.
|
|
img/CacheManager.cpp
|
|
utils/SuperMagicDrive.cpp
|
|
)
|
|
# Headers.
|
|
SET(${PROJECT_NAME}_H
|
|
RomDataFactory.hpp
|
|
CopierFormats.h
|
|
iso_structs.h
|
|
nintendo_system_id.h
|
|
|
|
Console/Atari7800.hpp
|
|
Console/CBMCart.hpp
|
|
Console/ColecoVision.hpp
|
|
Console/Dreamcast.hpp
|
|
Console/DreamcastSave.hpp
|
|
Console/GameCube.hpp
|
|
Console/GameCubeBNR.hpp
|
|
Console/GameCubeSave.hpp
|
|
Console/GameCubeRegions.hpp
|
|
Console/Intellivision.hpp
|
|
Console/iQuePlayer.hpp
|
|
Console/MegaDrive.hpp
|
|
Console/MegaDriveRegions.hpp
|
|
Console/N64.hpp
|
|
Console/NES.hpp
|
|
Console/PlayStationDisc.hpp
|
|
Console/PlayStationEXE.cpp
|
|
Console/PlayStationSave.hpp
|
|
Console/Sega8Bit.hpp
|
|
Console/SegaSaturn.hpp
|
|
Console/SNES.hpp
|
|
Console/SufamiTurbo.hpp
|
|
Console/WiiBNR.hpp
|
|
Console/WiiCommon.hpp
|
|
Console/WiiTicket.hpp
|
|
Console/WiiTMD.hpp
|
|
Console/WiiSave.hpp
|
|
Console/WiiU.hpp
|
|
Console/WiiUPackage.hpp
|
|
Console/WiiUPackage_p.hpp
|
|
Console/WiiWAD.hpp
|
|
Console/WiiWAD_p.hpp
|
|
Console/WiiWIBN.hpp
|
|
Console/Xbox_XBE.hpp
|
|
Console/Xbox360_STFS.hpp
|
|
Console/Xbox360_XDBF.hpp
|
|
Console/Xbox360_XEX.hpp
|
|
Console/XboxDisc.hpp
|
|
|
|
Console/atari_7800_structs.h
|
|
Console/cv_structs.h
|
|
Console/cbm_cart_structs.h
|
|
Console/dc_structs.h
|
|
Console/gcn_structs.h
|
|
Console/gcn_banner.h
|
|
Console/gcn_card.h
|
|
Console/intv_structs.h
|
|
Console/ique_player_structs.h
|
|
Console/md_structs.h
|
|
Console/n64_structs.h
|
|
Console/nes_structs.h
|
|
Console/ps1_structs.h
|
|
Console/ps1_exe_structs.h
|
|
Console/ps2_structs.h
|
|
Console/saturn_structs.h
|
|
Console/sega8_structs.h
|
|
Console/snes_structs.h
|
|
Console/st_structs.h
|
|
Console/wii_structs.h
|
|
Console/wii_banner.h
|
|
Console/wii_wad.h
|
|
Console/wiiu_structs.h
|
|
Console/xbox_xbe_structs.h
|
|
Console/xbox360_common_structs.h
|
|
Console/xbox360_stfs_structs.h
|
|
Console/xbox360_xdbf_structs.h
|
|
Console/xbox360_xex_structs.h
|
|
|
|
Handheld/DMG.hpp
|
|
Handheld/GameBoyAdvance.hpp
|
|
Handheld/GameCom.hpp
|
|
Handheld/J2ME.hpp
|
|
Handheld/Lynx.hpp
|
|
Handheld/NGPC.hpp
|
|
Handheld/Nintendo3DS.hpp
|
|
Handheld/Nintendo3DS_p.hpp
|
|
Handheld/Nintendo3DSFirm.hpp
|
|
Handheld/Nintendo3DS_SMDH.hpp
|
|
Handheld/NintendoDS.hpp
|
|
Handheld/NintendoDS_p.hpp
|
|
Handheld/NintendoDS_BNR.hpp
|
|
Handheld/PalmOS.hpp
|
|
Handheld/PokemonMini.hpp
|
|
Handheld/PSP.hpp
|
|
Handheld/VirtualBoy.hpp
|
|
Handheld/WonderSwan.hpp
|
|
Handheld/nds_crc.hpp
|
|
|
|
Handheld/dmg_structs.h
|
|
Handheld/gba_structs.h
|
|
Handheld/gcom_structs.h
|
|
Handheld/n3ds_structs.h
|
|
Handheld/nds_structs.h
|
|
Handheld/ngpc_structs.h
|
|
Handheld/palmos_structs.h
|
|
Handheld/pkmnmini_structs.h
|
|
Handheld/lnx_structs.h
|
|
Handheld/vb_structs.h
|
|
Handheld/ws_structs.h
|
|
|
|
Audio/ADX.hpp
|
|
Audio/BCSTM.hpp
|
|
Audio/BRSTM.hpp
|
|
Audio/GBS.hpp
|
|
Audio/NSF.hpp
|
|
Audio/PSF.hpp
|
|
Audio/SAP.hpp
|
|
Audio/SNDH.hpp
|
|
Audio/SID.hpp
|
|
Audio/SPC.hpp
|
|
Audio/VGM.hpp
|
|
|
|
Audio/adx_structs.h
|
|
Audio/bcstm_structs.h
|
|
Audio/brstm_structs.h
|
|
Audio/gbs_structs.h
|
|
Audio/nsf_structs.h
|
|
Audio/psf_structs.h
|
|
Audio/sid_structs.h
|
|
Audio/spc_structs.h
|
|
Audio/vgm_structs.h
|
|
|
|
Media/CBMDOS.hpp
|
|
Media/ISO.hpp
|
|
Media/Wim.hpp
|
|
Media/Wim_p.hpp
|
|
|
|
Media/cbmdos_structs.h
|
|
Media/hsfs_structs.h
|
|
Media/wim_structs.h
|
|
|
|
Other/Amiibo.hpp
|
|
Other/ELF.hpp
|
|
Other/EXE.hpp
|
|
Other/EXE_p.hpp
|
|
Other/MachO.hpp
|
|
Other/NintendoBadge.hpp
|
|
Other/RpTextureWrapper.hpp
|
|
Other/Lua.hpp
|
|
|
|
Other/badge_structs.h
|
|
Other/elf_structs.h
|
|
Other/exe_le_structs.h
|
|
Other/exe_mz_structs.h
|
|
Other/exe_ne_structs.h
|
|
Other/exe_pe_structs.h
|
|
Other/exe_res_structs.h
|
|
Other/macho_structs.h
|
|
Other/nfp_structs.h
|
|
|
|
data/AmiiboData.hpp
|
|
data/CBMData.hpp
|
|
data/CBM_C64_Cartridge_Type_data.h
|
|
data/CBM_Plus4_Cartridge_Type_data.h
|
|
data/CBM_VIC20_Cartridge_Type_data.h
|
|
data/DMGSpecialCases.hpp
|
|
data/ELFData.hpp
|
|
data/ELFMachineTypes_data.h
|
|
data/ELF_OSABI_data.h
|
|
data/EXEData.hpp
|
|
data/EXELEMachineTypes_data.h
|
|
data/EXENEEntries.hpp
|
|
data/EXENEEntries_data.h
|
|
data/EXEPEMachineTypes_data.h
|
|
data/MachOData.hpp
|
|
data/NESMappers.hpp
|
|
data/NESMappers_data.h
|
|
data/Nintendo3DSFirmData.hpp
|
|
data/Nintendo3DSSysTitles.hpp
|
|
data/NintendoLanguage.hpp
|
|
data/NintendoPublishers.hpp
|
|
data/SegaPublishers.hpp
|
|
data/SegaPublishers_data.h
|
|
data/WiiSystemMenuVersion.hpp
|
|
data/WiiUData.hpp
|
|
data/WonderSwanPublishers.hpp
|
|
data/XboxLanguage.hpp
|
|
data/XboxPublishers.hpp
|
|
data/XboxPublishers_data.h
|
|
data/Xbox360_STFS_ContentType.hpp
|
|
|
|
disc/CdiReader.hpp
|
|
disc/Cdrom2352Reader.hpp
|
|
disc/CIAReader.hpp
|
|
disc/CisoGcnReader.hpp
|
|
disc/CisoPspReader.hpp
|
|
disc/CisoPspDlopen.hpp
|
|
disc/DpfReader.hpp
|
|
disc/GcnFst.hpp
|
|
disc/GcnPartition.hpp
|
|
disc/GcnPartition_p.hpp
|
|
disc/GczReader.hpp
|
|
disc/GdiReader.hpp
|
|
disc/IResourceReader.hpp
|
|
disc/IsoPartition.hpp
|
|
disc/MultiTrackSparseDiscReader.hpp
|
|
disc/NASOSReader.hpp
|
|
disc/NCCHReader.hpp
|
|
disc/NCCHReader_p.hpp
|
|
disc/NEResourceReader.hpp
|
|
disc/PEResourceReader.hpp
|
|
disc/WbfsReader.hpp
|
|
disc/WiiPartition.hpp
|
|
disc/WiiUFst.hpp
|
|
disc/WiiUH3Reader.hpp
|
|
disc/WuxReader.hpp
|
|
disc/XDVDFSPartition.cpp
|
|
|
|
disc/ciso_gcn.h
|
|
disc/ciso_psp_structs.h
|
|
disc/dpf_structs.h
|
|
disc/gcz_structs.h
|
|
disc/libwbfs.h
|
|
disc/nasos_gcn.h
|
|
disc/wux_structs.h
|
|
disc/xdvdfs_structs.h
|
|
|
|
config/ImageTypesConfig.hpp
|
|
config/TImageTypesConfig.hpp
|
|
img/TCreateThumbnail.hpp
|
|
img/CacheManager.hpp
|
|
utils/SuperMagicDrive.hpp
|
|
)
|
|
|
|
IF(ENABLE_XML)
|
|
SET(${PROJECT_NAME}_SRCS ${${PROJECT_NAME}_SRCS}
|
|
Console/WiiUPackage_xml.cpp
|
|
Media/Wim_xml.cpp
|
|
Other/EXE_manifest.cpp
|
|
)
|
|
IF(MSVC AND (NOT USE_INTERNAL_XML OR USE_INTERNAL_XML_DLL))
|
|
SET(${PROJECT_NAME}_SRCS ${${PROJECT_NAME}_SRCS} Other/EXE_delayload.cpp)
|
|
ENDIF(MSVC AND (NOT USE_INTERNAL_XML OR USE_INTERNAL_XML_DLL))
|
|
ENDIF(ENABLE_XML)
|
|
|
|
IF(ENABLE_DECRYPTION)
|
|
SET(${PROJECT_NAME}_CRYPTO_SRCS
|
|
crypto/CtrKeyScrambler.cpp
|
|
crypto/N3DSVerifyKeys.cpp
|
|
crypto/KeyStoreUI.cpp
|
|
|
|
Handheld/ndscrypt.cpp
|
|
)
|
|
SET(${PROJECT_NAME}_CRYPTO_H
|
|
crypto/CtrKeyScrambler.hpp
|
|
crypto/N3DSVerifyKeys.hpp
|
|
crypto/KeyStoreUI.hpp
|
|
|
|
Handheld/ndscrypt.hpp
|
|
)
|
|
ENDIF(ENABLE_DECRYPTION)
|
|
|
|
# Network-related sources
|
|
IF(ENABLE_NETWORKING)
|
|
IF(WIN32)
|
|
SET(${PROJECT_NAME}_NETWORKING_SRCS img/ExecRpDownload_win32.cpp)
|
|
ELSEIF(UNIX)
|
|
SET(${PROJECT_NAME}_NETWORKING_SRCS img/ExecRpDownload_posix.cpp)
|
|
ENDIF()
|
|
ENDIF(ENABLE_NETWORKING)
|
|
IF(NOT ${PROJECT_NAME}_NETWORKING_SRCS)
|
|
# Dummy implementation for unsupported systems, or if networking is disabled.
|
|
SET(${PROJECT_NAME}_NETWORKING_SRCS img/ExecRpDownload_dummy.cpp)
|
|
ENDIF(NOT ${PROJECT_NAME}_NETWORKING_SRCS)
|
|
|
|
# dlopen() notes
|
|
IF(NOT WIN32 AND NOT APPLE)
|
|
SET(${PROJECT_NAME}_DLOPEN_SRCS
|
|
dlopen-notes.c
|
|
)
|
|
ENDIF(NOT WIN32 AND NOT APPLE)
|
|
|
|
# Windows resource file (for RomData DLL builds only)
|
|
IF(WIN32 AND RP_LIBROMDATA_IS_DLL)
|
|
SET(${PROJECT_NAME}_RC res/resource.rc)
|
|
ENDIF(WIN32 AND RP_LIBROMDATA_IS_DLL)
|
|
|
|
# Optimized sources.
|
|
INCLUDE(CPUInstructionSetFlags)
|
|
IF(CPU_i386 OR CPU_amd64)
|
|
# MSVC does not support MMX intrinsics in 64-bit builds.
|
|
# Reference: https://docs.microsoft.com/en-us/cpp/cpp/m64?view=msvc-160
|
|
#
|
|
# amd64 CPUs support SSE2 as a minimum anyway, so there's
|
|
# no point in building MMX code for 64-bit.
|
|
IF(CPU_i386)
|
|
SET(${PROJECT_NAME}_MMX_SRCS utils/SuperMagicDrive_mmx.cpp)
|
|
ENDIF(CPU_i386)
|
|
SET(${PROJECT_NAME}_SSE2_SRCS
|
|
${${PROJECT_NAME}_SSE2_SRCS}
|
|
utils/SuperMagicDrive_sse2.cpp
|
|
)
|
|
|
|
IF(MMX_FLAG)
|
|
SET_SOURCE_FILES_PROPERTIES(utils/SuperMagicDrive_mmx.cpp
|
|
APPEND_STRING PROPERTIES COMPILE_FLAGS " ${MMX_FLAG} ")
|
|
ENDIF(MMX_FLAG)
|
|
IF(SSE2_FLAG)
|
|
SET_SOURCE_FILES_PROPERTIES(utils/SuperMagicDrive_sse2.cpp
|
|
APPEND_STRING PROPERTIES COMPILE_FLAGS " ${SSE2_FLAG} ")
|
|
ENDIF(SSE2_FLAG)
|
|
ENDIF()
|
|
|
|
# libromdata can be built as a shared library.
|
|
IF(RP_LIBROMDATA_IS_DLL)
|
|
SET(${PROJECT_NAME}_LINKAGE SHARED)
|
|
ADD_DEFINITIONS(-DRP_BUILDING_FOR_DLL=1)
|
|
# NOTE: Not using the project version here.
|
|
# This represents the ABI version.
|
|
SET(${PROJECT_NAME}_VERSION 7.0)
|
|
SET(${PROJECT_NAME}_SOVERSION 7)
|
|
IF(MSVC)
|
|
# Delay-load sources.
|
|
SET(${PROJECT_NAME}-DELAYLOAD_SRC ../libwin32common/DelayLoadHelper.c)
|
|
SET(${PROJECT_NAME}-DELAYLOAD_H ../libwin32common/DelayLoadHelper.h)
|
|
ENDIF(MSVC)
|
|
ELSE()
|
|
SET(${PROJECT_NAME}_LINKAGE STATIC)
|
|
ENDIF()
|
|
|
|
# Write the config.h file.
|
|
INCLUDE(DirInstallPaths)
|
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/config.lib${PROJECT_NAME}.h.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/config.lib${PROJECT_NAME}.h")
|
|
|
|
IF(WIN32)
|
|
# Create the manifest file.
|
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/res/${PROJECT_NAME}.dll.manifest.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/res/${PROJECT_NAME}.dll.manifest" @ONLY)
|
|
ENDIF(WIN32)
|
|
|
|
######################
|
|
# Build the library. #
|
|
######################
|
|
|
|
IF(WIN32)
|
|
# Delay-load extlibs.
|
|
INCLUDE(../libwin32common/DelayLoadHelper.cmake)
|
|
SET_DELAYLOAD_EXTLIB_FLAGS()
|
|
ENDIF(WIN32)
|
|
|
|
ADD_LIBRARY(${PROJECT_NAME} ${${PROJECT_NAME}_LINKAGE}
|
|
${${PROJECT_NAME}-DELAYLOAD_SRC} ${${PROJECT_NAME}-DELAYLOAD_H}
|
|
${${PROJECT_NAME}_SRCS} ${${PROJECT_NAME}_H}
|
|
${${PROJECT_NAME}_NETWORKING_SRCS}
|
|
${${PROJECT_NAME}_CRYPTO_SRCS} ${${PROJECT_NAME}_CRYPTO_H}
|
|
${${PROJECT_NAME}_DLOPEN_SRCS}
|
|
${${PROJECT_NAME}_MMX_SRCS}
|
|
${${PROJECT_NAME}_SSE2_SRCS}
|
|
${${PROJECT_NAME}_RC}
|
|
)
|
|
IF(ENABLE_PCH)
|
|
TARGET_PRECOMPILE_HEADERS(${PROJECT_NAME} PRIVATE
|
|
"${RP_CONFIG_LIBC_H}" "${RP_COMPILER_COMPAT_H}"
|
|
stdafx.h
|
|
)
|
|
ENDIF(ENABLE_PCH)
|
|
|
|
# Enable PIC.
|
|
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
|
|
|
IF(WIN32)
|
|
# Append the SOVERSION and "d" for debug.
|
|
SET(CMAKE_DEBUG_POSTFIX "d")
|
|
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "-${${PROJECT_NAME}_SOVERSION}d")
|
|
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RELEASE_POSTFIX "-${${PROJECT_NAME}_SOVERSION}")
|
|
ENDIF(WIN32)
|
|
|
|
INCLUDE(SetMSVCDebugPath)
|
|
SET_MSVC_DEBUG_PATH(${PROJECT_NAME})
|
|
|
|
# Include paths:
|
|
# - Public: Current source and binary directories.
|
|
# - Private: Parent source and binary directories,
|
|
# and top-level binary directory for git_version.h.
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}
|
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> # libromdata
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> # libromdata
|
|
PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..> # src
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..> # src
|
|
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}> # top-level
|
|
)
|
|
|
|
# Make sure git_version.h is created before compiling this target.
|
|
IF(TARGET git_version)
|
|
ADD_DEPENDENCIES(${PROJECT_NAME} git_version)
|
|
ENDIF(TARGET git_version)
|
|
|
|
# CMake-3.7.2 doesn't add include paths to windres.
|
|
IF(MINGW)
|
|
SET(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -I \"${CMAKE_CURRENT_SOURCE_DIR}/..\"")
|
|
SET(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -I \"${CMAKE_CURRENT_BINARY_DIR}/..\"")
|
|
SET(CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -I \"${CMAKE_CURRENT_BINARY_DIR}\"")
|
|
ENDIF(MINGW)
|
|
|
|
IF(${PROJECT_NAME}_LINKAGE STREQUAL SHARED)
|
|
# When linking as a shared library, all internal library components
|
|
# should be linked in as PRIVATE, and include directories added
|
|
# manually. Otherwise, the .a libraries get linked in to the
|
|
# UI frontend plugins.
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE rpbyteswap-dll rptexture-dll rpfile-dll rpbase-dll rptext-dll)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE rpthreads-dll cachecommon-dll)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE rpcpuid) # for CPU dispatch
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librpbyteswap>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librpbyteswap>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librptexture>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librptexture>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librpfile>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librpfile>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librpbase>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librpbase>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librptext>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librptext>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../librpthreads>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../librpthreads>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../libcachecommon>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libcachecommon>
|
|
)
|
|
IF(ENABLE_NLS)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE i18n-dll)
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../libi18n>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libi18n>
|
|
)
|
|
|
|
# Need to link to gettext directly, since UI frontends
|
|
# won't link to i18n due to DLL shenanigans.
|
|
INCLUDE(CheckGettext)
|
|
CHECK_GETTEXT()
|
|
IF(Intl_INCLUDE_DIR)
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE ${Intl_INCLUDE_DIR})
|
|
ENDIF(Intl_INCLUDE_DIR)
|
|
IF(Intl_LIBRARY)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC ${Intl_LIBRARY})
|
|
ENDIF(Intl_LIBRARY)
|
|
ENDIF(ENABLE_NLS)
|
|
IF(WIN32)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE win32common-dll)
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../libwin32common>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libwin32common>
|
|
)
|
|
ELSEIF(UNIX)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE unixcommon-dll)
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../libunixcommon>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../libunixcommon>
|
|
)
|
|
ENDIF()
|
|
ELSE()
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC rpbyteswap rptexture rpfile rpbase rptext)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC rpthreads cachecommon)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE rpcpuid) # for CPU dispatch
|
|
IF(ENABLE_NLS)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC i18n)
|
|
ENDIF(ENABLE_NLS)
|
|
IF(WIN32)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC win32common)
|
|
ELSEIF(UNIX)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PUBLIC unixcommon)
|
|
ENDIF()
|
|
ENDIF()
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE inih)
|
|
|
|
# libfmt
|
|
IF(Fmt_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${Fmt_LIBRARY})
|
|
ENDIF(Fmt_FOUND)
|
|
|
|
# Shared library stuff
|
|
TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} PRIVATE RP_BUILDING_LIBROMDATA=1)
|
|
IF(${PROJECT_NAME}_LINKAGE STREQUAL SHARED)
|
|
DO_SPLIT_DEBUG(${PROJECT_NAME})
|
|
SET_WINDOWS_SUBSYSTEM(${PROJECT_NAME} WIN32)
|
|
SET_WINDOWS_NO_MANIFEST(${PROJECT_NAME})
|
|
TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} PRIVATE RP_BUILDING_FOR_DLL=1)
|
|
|
|
# HACK: Needed to ensure that some object files aren't
|
|
# trimmed by the linker, since libromdata doesn't use
|
|
# any of these functions directly. (The UI frontends
|
|
# *do* use these functions.)
|
|
UNSET(SYM_PREFIX)
|
|
SET(SYMS_FORCE
|
|
RP_LibRpBase_AboutTabText_ForceLinkage
|
|
RP_LibRpBase_IconAnimHelper_ForceLinkage
|
|
RP_LibRpBase_RpImageLoader_ForceLinkage
|
|
RP_LibRpBase_TextOut_json_ForceLinkage
|
|
RP_LibRpBase_TextOut_text_ForceLinkage
|
|
RP_LibRpFile_RecursiveScan_ForceLinkage
|
|
RP_LibRpFile_XAttrReader_ForceLinkage
|
|
RP_LibRpFile_XAttrReader_impl_ForceLinkage
|
|
)
|
|
IF(WIN32)
|
|
SET(SYMS_FORCE ${SYMS_FORCE}
|
|
RP_LibRpTexture_GdiplusHelper_ForceLinkage
|
|
RP_LibWin32Common_propsys_xp_ForceLinkage
|
|
)
|
|
IF(CPU_i386)
|
|
SET(SYM_PREFIX "_")
|
|
ENDIF(CPU_i386)
|
|
ELSE(WIN32)
|
|
# FIXME: Getting a missing symbol error on MSVC ARM64EC builds if these
|
|
# are unconditionally added to SYMS_FORCE.
|
|
SET(SYMS_FORCE ${SYMS_FORCE}
|
|
ext2AttrCheckboxInfo # librpfile
|
|
xfsAttrCheckboxInfo # librpfile
|
|
)
|
|
ENDIF(WIN32)
|
|
IF(MSVC)
|
|
FOREACH(_sym ${SYMS_FORCE})
|
|
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /include:${SYM_PREFIX}${_sym}")
|
|
ENDFOREACH(_sym)
|
|
ELSE(MSVC)
|
|
FOREACH(_sym ${SYMS_FORCE})
|
|
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--undefined=${SYM_PREFIX}${_sym}")
|
|
ENDFOREACH(_sym)
|
|
ENDIF(MSVC)
|
|
UNSET(SYM_PREFIX)
|
|
ENDIF(${PROJECT_NAME}_LINKAGE STREQUAL SHARED)
|
|
# SOVERSION
|
|
IF(${PROJECT_NAME}_SOVERSION)
|
|
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
|
|
VERSION ${${PROJECT_NAME}_VERSION}
|
|
SOVERSION ${${PROJECT_NAME}_SOVERSION}
|
|
)
|
|
ENDIF(${PROJECT_NAME}_SOVERSION)
|
|
|
|
IF(WIN32)
|
|
# librpsecure: integrity_level.h
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE rpsecure)
|
|
|
|
# Windows SDK libraries
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE advapi32)
|
|
|
|
# Delay-load shell32.dll and ole32.dll to prevent a performance penalty due to gdi32.dll.
|
|
# Also delay-load user32.dll to prevent user object allocation when it's not necessary.
|
|
# Reference: https://randomascii.wordpress.com/2018/12/03/a-not-called-function-can-cause-a-5x-slowdown/
|
|
ADD_DELAYLOAD_FLAGS(${PROJECT_NAME} shell32.dll ole32.dll user32.dll)
|
|
IF(MSVC)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE delayimp)
|
|
ENDIF(MSVC)
|
|
ENDIF(WIN32)
|
|
|
|
# Other libraries.
|
|
# NOTE: Marking these as PUBLIC so the UI frontends can use them.
|
|
# NOTE: Nettle isn't used directly, but librpbase is PRIVATE if
|
|
# libromdata is built as a shared library.
|
|
IF(ZLIB_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${ZLIB_LIBRARIES})
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${ZLIB_INCLUDE_DIRS})
|
|
TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} PRIVATE ${ZLIB_DEFINITIONS})
|
|
|
|
# MiniZip (used by J2ME)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE minizip)
|
|
ELSE(ZLIB_FOUND)
|
|
MESSAGE(FATAL_ERROR "ZLIB_LIBRARIES has not been set by CheckZLIB.cmake.")
|
|
ENDIF(ZLIB_FOUND)
|
|
IF(PNG_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${PNG_LIBRARY})
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PUBLIC ${PNG_INCLUDE_DIRS})
|
|
TARGET_COMPILE_DEFINITIONS(${PROJECT_NAME} PRIVATE ${PNG_DEFINITIONS})
|
|
ENDIF(PNG_FOUND)
|
|
IF(JPEG_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${JPEG_LIBRARY})
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ${JPEG_INCLUDE_DIRS})
|
|
ENDIF(JPEG_FOUND)
|
|
IF(ENABLE_DECRYPTION AND NOT WIN32)
|
|
INCLUDE(CheckNettle2or3)
|
|
CHECK_NETTLE_2_OR_3()
|
|
IF(NETTLE_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${NETTLE_LIBRARY})
|
|
TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE ${NETTLE_INCLUDE_DIRS})
|
|
ENDIF(NETTLE_FOUND)
|
|
ENDIF(ENABLE_DECRYPTION AND NOT WIN32)
|
|
|
|
IF(ENABLE_XML AND pugixml_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${pugixml_LIBRARY})
|
|
ENDIF(ENABLE_XML AND pugixml_FOUND)
|
|
|
|
IF(ENABLE_UNICE68)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE unice68_lib)
|
|
ENDIF(ENABLE_UNICE68)
|
|
|
|
IF(ENABLE_LIBMSPACK)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE mspack)
|
|
ENDIF(ENABLE_LIBMSPACK)
|
|
|
|
IF(ENABLE_LZ4 AND LZ4_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${LZ4_LIBRARY})
|
|
ENDIF(ENABLE_LZ4 AND LZ4_FOUND)
|
|
IF(ENABLE_LZO AND LZO_FOUND)
|
|
TARGET_LINK_LIBRARIES(${PROJECT_NAME} PRIVATE ${LZO_LIBRARY})
|
|
ENDIF(ENABLE_LZO AND LZO_FOUND)
|
|
|
|
# Test suite.
|
|
IF(BUILD_TESTING)
|
|
ADD_SUBDIRECTORY(tests)
|
|
ENDIF(BUILD_TESTING)
|
|
|
|
######################################
|
|
# Install the library. (SHARED only) #
|
|
######################################
|
|
|
|
IF(${PROJECT_NAME}_LINKAGE STREQUAL SHARED)
|
|
IF(WIN32)
|
|
# NOTE: Don't install libraries.
|
|
# That installs the import library, which we don't
|
|
# want to distribute.
|
|
INSTALL(TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "${DIR_INSTALL_EXE}"
|
|
LIBRARY DESTINATION "${DIR_INSTALL_DLL}"
|
|
#ARCHIVE DESTINATION "${DIR_INSTALL_LIB}"
|
|
COMPONENT "dll"
|
|
)
|
|
ELSE(WIN32)
|
|
INSTALL(TARGETS ${PROJECT_NAME}
|
|
LIBRARY DESTINATION "${DIR_INSTALL_LIB}"
|
|
COMPONENT "lib"
|
|
)
|
|
ENDIF(WIN32)
|
|
|
|
# Check if a split debug file should be installed.
|
|
IF(INSTALL_DEBUG)
|
|
# FIXME: Generator expression $<TARGET_PROPERTY:${_target},PDB> didn't work with CPack-3.6.1.
|
|
GET_TARGET_PROPERTY(DEBUG_FILENAME ${PROJECT_NAME} PDB)
|
|
IF(WIN32)
|
|
# TODO: Test on MinGW.
|
|
# FIXME: Generator PDB expression doesn't have the debug postfix for some reason,
|
|
# so cpack fails in debug builds if we get the PDB property.
|
|
SET(PDB_FILENAME_D "$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}-${${PROJECT_NAME}_SOVERSION}d.pdb")
|
|
SET(PDB_FILENAME_R "$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}-${${PROJECT_NAME}_SOVERSION}.pdb")
|
|
INSTALL(FILES "${PDB_FILENAME_D}" "${PDB_FILENAME_R}"
|
|
DESTINATION "${DIR_INSTALL_DLL_DEBUG}"
|
|
COMPONENT "debug"
|
|
OPTIONAL
|
|
)
|
|
UNSET(PDB_FILENAME_D)
|
|
UNSET(PDB_FILENAME_R)
|
|
ELSE(WIN32)
|
|
INSTALL(FILES "${DEBUG_FILENAME}"
|
|
DESTINATION "${DIR_INSTALL_DLL_DEBUG}"
|
|
COMPONENT "debug"
|
|
)
|
|
ENDIF(WIN32)
|
|
UNSET(DEBUG_FILENAME)
|
|
ENDIF(INSTALL_DEBUG)
|
|
ENDIF(${PROJECT_NAME}_LINKAGE STREQUAL SHARED)
|