diff --git a/CMake/DolphinLibraryTools.cmake b/CMake/DolphinLibraryTools.cmake new file mode 100644 index 0000000000..f1681306cb --- /dev/null +++ b/CMake/DolphinLibraryTools.cmake @@ -0,0 +1,20 @@ +# like add_library(new ALIAS old) but avoids add_library cannot create ALIAS target "new" because target "old" is imported but not globally visible. on older cmake +# This can be replaced with a direct alias call once our minimum is cmake 3.18 +function(dolphin_alias_library new old) + string(REPLACE "::" "" library_no_namespace ${old}) + if (NOT TARGET _alias_${library_no_namespace}) + add_library(_alias_${library_no_namespace} INTERFACE) + target_link_libraries(_alias_${library_no_namespace} INTERFACE ${old}) + endif() + add_library(${new} ALIAS _alias_${library_no_namespace}) +endfunction() + +# Makes an imported target if it doesn't exist. Useful for when find scripts from older versions of cmake don't make the targets you need +function(dolphin_make_imported_target_if_missing target lib) + if(${lib}_FOUND AND NOT TARGET ${target}) + add_library(_${lib} INTERFACE) + target_link_libraries(_${lib} INTERFACE "${${lib}_LIBRARIES}") + target_include_directories(_${lib} INTERFACE "${${lib}_INCLUDE_DIRS}") + add_library(${target} ALIAS _${lib}) + endif() +endfunction() diff --git a/CMakeLists.txt b/CMakeLists.txt index 42bd91ea37..0dc09a3bb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,6 +127,7 @@ include(CheckCCompilerFlag) include(CheckVendoringApproved) include(DolphinCompileDefinitions) include(DolphinDisableWarningsMSVC) +include(DolphinLibraryTools) include(RemoveCompileFlag) # Enable folders for IDE @@ -751,30 +752,23 @@ endif() # macOS ships with liblzma.dylib but no headers, so check for the headers too find_package(LibLZMA) -check_include_file(lzma.h HAVE_LZMA_H) -if(LIBLZMA_FOUND AND HAVE_LZMA_H) +if(LIBLZMA_FOUND) + # Imported target added in CMake 3.14 + dolphin_make_imported_target_if_missing(LibLZMA::LibLZMA LIBLZMA) message(STATUS "Using shared lzma") else() check_vendoring_approved(lzma) - if(LIBLZMA_FOUND AND NOT HAVE_LZMA_H) - message(STATUS "Shared lzma found but lacks headers, falling back to the static library") - else() - message(STATUS "Shared lzma not found, falling back to the static library") - endif() + message(STATUS "Shared lzma not found, falling back to the static library") add_subdirectory(Externals/liblzma) endif() -pkg_check_modules(ZSTD QUIET libzstd>=1.4.0) -check_include_file(zstd.h HAVE_ZSTD_H) -if(ZSTD_FOUND AND HAVE_ZSTD_H) +pkg_check_modules(ZSTD QUIET libzstd>=1.4.0 IMPORTED_TARGET) +if(ZSTD_FOUND) message(STATUS "Using shared zstd version: " ${ZSTD_VERSION}) + dolphin_alias_library(zstd::zstd PkgConfig::ZSTD) else() check_vendoring_approved(zstd) - if(ZSTD_FOUND AND NOT HAVE_ZSTD_H) - message(STATUS "Shared zstd found but lacks headers, falling back to the static library") - else() - message(STATUS "Shared zstd not found, falling back to the static library") - endif() + message(STATUS "Shared zstd not found, falling back to the static library") add_subdirectory(Externals/zstd) endif() diff --git a/Source/Core/DiscIO/CMakeLists.txt b/Source/Core/DiscIO/CMakeLists.txt index 157696cefe..b688d7a4d5 100644 --- a/Source/Core/DiscIO/CMakeLists.txt +++ b/Source/Core/DiscIO/CMakeLists.txt @@ -68,8 +68,8 @@ target_link_libraries(discio PUBLIC core BZip2::BZip2 - lzma - zstd + LibLZMA::LibLZMA + zstd::zstd PRIVATE fmt::fmt