# zstd: Fast compression library.
PROJECT(zstd VERSION 1.5.5 LANGUAGES C ASM)

# rom-properties: Enable multithreading.
SET(ZSTD_MULTITHREAD ON)

ADD_DEFINITIONS(-DXXH_NAMESPACE=ZSTD_)

# Always build with high optimizations.
IF(MSVC)
	# Remove some CFLAGS for MSVC builds:
	# - /Ob0: Conflicts with /Ob2.
	# - /Od: Conflicts with /O2.
	# - /RTC1: Conflicts with /O2.
	STRING(REPLACE "/Ob0" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
	STRING(REPLACE "/Od" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
	STRING(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
	SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Ob2 /O2")
	SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ob2 /O2")

	# Append 'd' to the DLL filename for debug builds.
	SET(CMAKE_DEBUG_POSTFIX "d")
ELSE(MSVC)
	SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O3")
	SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")
ENDIF(MSVC)

FILE(GLOB ZSTDCOMMON_FILES common/*.c)
FILE(GLOB ZSTDCOMP_FILES compress/*.c)
FILE(GLOB ZSTDDECOMP_FILES decompress/*.c decompress/*.S)
FILE(GLOB ZDICT_FILES dictBuilder/*.c)
FILE(GLOB ZDEPR_FILES deprecated/*.c)

SET(ZSTD_FILES ${ZSTDCOMMON_FILES})

# Modules
SET(ZSTD_LIB_COMPRESSION ON)
SET(ZSTD_LIB_DECOMPRESSION ON)
SET(ZSTD_LIB_DICTBUILDER OFF)
SET(ZSTD_LIB_DEPRECATED OFF)

# Enable zstd multithreading on pthread systems.
FIND_PACKAGE(Threads)
IF(CMAKE_USE_PTHREADS_INIT)
	SET(ZSTD_MULTITHREAD ON)
ENDIF(CMAKE_USE_PTHREADS_INIT)

# Legacy support
SET(ZSTD_LEGACY_SUPPORT 0)
SET(ZSTD_LEGACY_MULTITHREADED_API OFF)

# Build size optimizations
SET(HUF_FORCE_DECOMPRESS_X1 OFF)
SET(HUF_FORCE_DECOMPRESS_X2 OFF)
SET(ZSTD_FORCE_DECOMPRESS_SHORT OFF)
SET(ZSTD_FORCE_DECOMPRESS_LONG OFF)
SET(ZSTD_NO_INLINE OFF)
SET(ZSTD_STRIP_ERROR_STRINGS OFF)

IF(NOT ZSTD_LIB_COMPRESSION)
	SET(ZSTD_LIB_DICTBUILDER OFF)
	SET(ZSTD_LIB_DEPRECATED OFF)
ENDIF(NOT ZSTD_LIB_COMPRESSION)

IF(NOT ZSTD_LIB_DECOMPRESSION)
	SET(ZSTD_LEGACY_SUPPORT OFF)
	SET(ZSTD_LIB_DEPRECATED OFF)
ENDIF(NOT ZSTD_LIB_DECOMPRESSION)

IF(ZSTD_LIB_COMPRESSION)
	SET(ZSTD_FILES ${ZSTD_FILES} ${ZSTDCOMP_FILES})
ENDIF(ZSTD_LIB_COMPRESSION)

IF(ZSTD_LIB_DECOMPRESSION)
	SET(ZSTD_FILES ${ZSTD_FILES} ${ZSTDDECOMP_FILES})
ENDIF(ZSTD_LIB_DECOMPRESSION)

IF(ZSTD_LIB_DEPRECATED)
	SET(ZSTD_FILES ${ZSTD_FILES} ${ZDEPR_FILES})
ENDIF(ZSTD_LIB_DEPRECATED)

IF(ZSTD_LIB_DICTBUILDER)
	SET(ZSTD_FILES ${ZSTD_FILES} ${ZDICT_FILES})
ENDIF(ZSTD_LIB_DICTBUILDER)

IF(HUF_FORCE_DECOMPRESS_X1)
	ADD_DEFINITIONS(-DHUF_FORCE_DECOMPRESS_X1)
ENDIF(HUF_FORCE_DECOMPRESS_X1)

IF(HUF_FORCE_DECOMPRESS_X2)
	ADD_DEFINITIONS(-DHUF_FORCE_DECOMPRESS_X2)
ENDIF(HUF_FORCE_DECOMPRESS_X2)

IF(ZSTD_FORCE_DECOMPRESS_SHORT)
	ADD_DEFINITIONS(-DZSTD_FORCE_DECOMPRESS_SHORT)
ENDIF(ZSTD_FORCE_DECOMPRESS_SHORT)

IF(ZSTD_FORCE_DECOMPRESS_LONG)
	ADD_DEFINITIONS(-DZSTD_FORCE_DECOMPRESS_LONG)
ENDIF(ZSTD_FORCE_DECOMPRESS_LONG)

IF(ZSTD_NO_INLINE)
	ADD_DEFINITIONS(-DZSTD_NO_INLINE)
ENDIF(ZSTD_NO_INLINE)

IF(ZSTD_STRIP_ERROR_STRINGS)
	ADD_DEFINITIONS(-DZSTD_STRIP_ERROR_STRINGS)
ENDIF(ZSTD_STRIP_ERROR_STRINGS)

IF(ZSTD_LEGACY_MULTITHREADED_API)
	ADD_DEFINITIONS(-DZSTD_LEGACY_MULTITHREADED_API)
ENDIF(ZSTD_LEGACY_MULTITHREADED_API)

# FIXME: Legacy support.
IF(ZSTD_LEGACY_SUPPORT)
#ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
#	ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
#endif
ENDIF(ZSTD_LEGACY_SUPPORT)
ADD_DEFINITIONS(-DZSTD_LEGACY_SUPPORT=${ZSTD_LEGACY_SUPPORT})

IF(WIN32)
	# Add the Win32 resource file.
	SET(ZSTD_FILES ${ZSTD_FILES} windres/libzstd-dll.rc)
ENDIF(WIN32)

IF(BUILD_SHARED_LIBS)
	ADD_LIBRARY(zstd SHARED ${ZSTD_FILES})
	TARGET_COMPILE_DEFINITIONS(zstd
		PRIVATE -DZSTD_DLL_EXPORT
		INTERFACE -DZSTD_DLL_IMPORT
		)
	TARGET_INCLUDE_DIRECTORIES(zstd
		PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
		)
	DO_SPLIT_DEBUG(zstd)
	SET_WINDOWS_SUBSYSTEM(zstd WIN32)
ENDIF(BUILD_SHARED_LIBS)

IF(BUILD_STATIC_LIBS)
	ADD_LIBRARY(zstdstatic STATIC ${ZSTD_FILES})
	TARGET_INCLUDE_DIRECTORIES(zstdstatic
		PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
		)
	DO_SPLIT_DEBUG(zstdstatic)
ENDIF(BUILD_STATIC_LIBS)

IF(ZSTD_MULTITHREAD AND CMAKE_THREAD_LIBS_INIT)
	IF(BUILD_SHARED_LIBS)
		TARGET_LINK_LIBRARIES(zstd PRIVATE ${CMAKE_THREAD_LIBS_INIT})
	ENDIF(BUILD_SHARED_LIBS)
	IF(BUILD_STATIC_LIBS)
		TARGET_LINK_LIBRARIES(zstdstatic PRIVATE ${CMAKE_THREAD_LIBS_INIT})
	ENDIF(BUILD_STATIC_LIBS)
ENDIF(ZSTD_MULTITHREAD AND CMAKE_THREAD_LIBS_INIT)

# Install DLLs.
IF(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
	INSTALL(TARGETS zstd
		RUNTIME DESTINATION "${INSTALL_BIN_DIR}" )
		#ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
		#LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
		#BUNDLE DESTINATION "${INSTALL_BIN_DIR}" )
	IF(INSTALL_DEBUG)
		# FIXME: Generator expression $<TARGET_PROPERTY:${_target},PDB> didn't work with CPack-3.6.1.
		INCLUDE(DirInstallPaths)
		GET_TARGET_PROPERTY(DEBUG_FILENAME zstd 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:zstd>/zstd${CMAKE_DEBUG_POSTFIX}.pdb")
			SET(PDB_FILENAME_R "$<TARGET_FILE_DIR:zstd>/zstd${CMAKE_RELEASE_POSTFIX}.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(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)

# Unix: Add -fpic/-fPIC in order to use this static library in plugins.
IF(UNIX AND NOT APPLE)
	SET(CMAKE_C_FLAGS	"${CMAKE_C_FLAGS} -fpic -fPIC")
	SET(CMAKE_CXX_FLAGS	"${CMAKE_CXX_FLAGS} -fpic -fPIC")
ENDIF(UNIX AND NOT APPLE)

# Clang: zstd uses __declspec() regardless of compiler or OS.
IF(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang")
	SET(CMAKE_C_FLAGS	"${CMAKE_C_FLAGS} -fdeclspec")
	SET(CMAKE_CXX_FLAGS	"${CMAKE_CXX_FLAGS} -fdeclspec")
ENDIF(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang")
