diff --git a/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-Use-ASSIMP_LIB_INSTALL_DIR-to-search-library.patch b/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-Use-ASSIMP_LIB_INSTALL_DIR-to-search-library.patch new file mode 100644 index 000000000..34c5bfa85 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-Use-ASSIMP_LIB_INSTALL_DIR-to-search-library.patch @@ -0,0 +1,68 @@ +From 58f576d6f240b08957a402960cdf06c74201ac7b Mon Sep 17 00:00:00 2001 +From: Hongxu Jia +Date: Thu, 12 Dec 2019 22:16:15 -0800 +Subject: [PATCH] Use ASSIMP_LIB_INSTALL_DIR to search library + +Use ASSIMP_LIB_INSTALL_DIR rather than hardcoded /lib to search library + +Upstream-Status: Inappropriate [oe specific] + +Signed-off-by: Hongxu Jia + +--- + assimpTargets-release.cmake.in | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/assimpTargets-release.cmake.in b/assimpTargets-release.cmake.in +index f3db8f1..b8a066a 100644 +--- a/assimpTargets-release.cmake.in ++++ b/assimpTargets-release.cmake.in +@@ -42,11 +42,11 @@ if(MSVC) + # Import target "assimp::assimp" for configuration "Release" + set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(assimp::assimp PROPERTIES +- IMPORTED_IMPLIB_RELEASE "${_IMPORT_PREFIX}/lib/${importLibraryName}" ++ IMPORTED_IMPLIB_RELEASE "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${importLibraryName}" + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" + ) + list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) +- list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${importLibraryName}") ++ list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${importLibraryName}") + list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/bin/${sharedLibraryName}" ) + else() + set(staticLibraryName "assimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_STATIC_LIBRARY_SUFFIX@") +@@ -54,10 +54,10 @@ if(MSVC) + # Import target "assimp::assimp" for configuration "Release" + set_property(TARGET assimp::assimp APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(assimp::assimp PROPERTIES +- IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${staticLibraryName}" ++ IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${staticLibraryName}" + ) + list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) +- list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}") ++ list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${staticLibraryName}") + endif() + + else() +@@ -70,17 +70,17 @@ else() + endif() + set_target_properties(assimp::assimp PROPERTIES + IMPORTED_SONAME_RELEASE "${sharedLibraryName}" +- IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" ++ IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${sharedLibraryName}" + ) + list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) +- list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${sharedLibraryName}" ) ++ list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${sharedLibraryName}" ) + else() + set(staticLibraryName "libassimp${ASSIMP_LIBRARY_SUFFIX}@CMAKE_STATIC_LIBRARY_SUFFIX@") + set_target_properties(assimp::assimp PROPERTIES +- IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/${staticLibraryName}" ++ IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${staticLibraryName}" + ) + list(APPEND _IMPORT_CHECK_TARGETS assimp::assimp ) +- list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/lib/${staticLibraryName}" ) ++ list(APPEND _IMPORT_CHECK_FILES_FOR_assimp::assimp "${_IMPORT_PREFIX}/@ASSIMP_LIB_INSTALL_DIR@/${staticLibraryName}" ) + endif() + endif() + diff --git a/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-closes-https-github.com-assimp-assimp-issues-2733-up.patch b/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-closes-https-github.com-assimp-assimp-issues-2733-up.patch new file mode 100644 index 000000000..87a165871 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/assimp/0001-closes-https-github.com-assimp-assimp-issues-2733-up.patch @@ -0,0 +1,1664 @@ +From 7fc220b2350d78942fb3935cad0b1564418ebe8f Mon Sep 17 00:00:00 2001 +From: Kim Kulling +Date: Tue, 19 Nov 2019 20:30:40 +0100 +Subject: [PATCH] closes https://github.com/assimp/assimp/issues/2733: update + of zlip to fix gcc build for v9.2.0 32 bit + +Upstream-Status: Backport [https://github.com/assimp/assimp/commit/f78446b14aff46db2ef27d062a275b6a01fd68b1] +Signed-off-by: Alexander Kanavin +--- + contrib/zip/.gitignore | 2 + + contrib/zip/CMakeLists.txt | 83 +++++- + contrib/zip/README.md | 12 +- + contrib/zip/appveyor.yml | 2 +- + contrib/zip/src/miniz.h | 457 ++++++++++++++++++++++++++++---- + contrib/zip/src/zip.c | 62 +++-- + contrib/zip/src/zip.h | 457 ++++++++++++++++---------------- + contrib/zip/test/CMakeLists.txt | 27 +- + contrib/zip/test/test.c | 38 ++- + contrib/zip/test/test_miniz.c | 25 +- + 10 files changed, 821 insertions(+), 344 deletions(-) + +diff --git a/contrib/zip/.gitignore b/contrib/zip/.gitignore +index a7904a1e..49b2cb2f 100644 +--- a/contrib/zip/.gitignore ++++ b/contrib/zip/.gitignore +@@ -1,6 +1,7 @@ + /build/ + /test/build/ + /xcodeproj/ ++.vscode/ + + # Object files + *.o +@@ -54,3 +55,4 @@ zip.dir/ + test/test.exe.vcxproj.filters + test/test.exe.vcxproj + test/test.exe.dir/ ++ +diff --git a/contrib/zip/CMakeLists.txt b/contrib/zip/CMakeLists.txt +index b46dbb1d..77916d2e 100644 +--- a/contrib/zip/CMakeLists.txt ++++ b/contrib/zip/CMakeLists.txt +@@ -1,10 +1,14 @@ +-cmake_minimum_required(VERSION 2.8) +-project(zip) +-enable_language(C) ++cmake_minimum_required(VERSION 3.0) ++ ++project(zip ++ LANGUAGES C ++ VERSION "0.1.15") + set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) + ++option(CMAKE_DISABLE_TESTING "Disable test creation" OFF) ++ + if (MSVC) +- # Use secure functions by defaualt and suppress warnings about "deprecated" functions ++ # Use secure functions by default and suppress warnings about "deprecated" functions + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1") +@@ -12,28 +16,80 @@ elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR + "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR + "${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wall -Wextra -Werror -pedantic") ++ if(ENABLE_COVERAGE) ++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage") ++ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") ++ endif() + endif (MSVC) + + # zip + set(SRC src/miniz.h src/zip.h src/zip.c) + add_library(${PROJECT_NAME} ${SRC}) +-target_include_directories(${PROJECT_NAME} INTERFACE src) ++target_include_directories(${PROJECT_NAME} PUBLIC ++ $ ++ $ ++) + + # test + if (NOT CMAKE_DISABLE_TESTING) + enable_testing() + add_subdirectory(test) + find_package(Sanitizers) +- add_sanitizers(${PROJECT_NAME} test.exe) +- add_sanitizers(${PROJECT_NAME} test_miniz.exe) ++ add_sanitizers(${PROJECT_NAME} ${test_out} ${test_miniz_out}) + endif() + ++#### ++# Installation (https://github.com/forexample/package-example) { ++ ++set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") ++set(INCLUDE_INSTALL_DIR "include") ++ ++set(GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") ++ ++# Configuration ++set(VERSION_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake") ++set(PROJECT_CONFIG "${GENERATED_DIR}/${PROJECT_NAME}Config.cmake") ++set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") ++set(NAMESPACE "${PROJECT_NAME}::") ++ ++# Include module with fuction 'write_basic_package_version_file' ++include(CMakePackageConfigHelpers) ++ ++# Note: PROJECT_VERSION is used as a VERSION ++write_basic_package_version_file( ++ "${VERSION_CONFIG}" COMPATIBILITY SameMajorVersion ++) ++ ++# Use variables: ++# * TARGETS_EXPORT_NAME ++# * PROJECT_NAME ++configure_package_config_file( ++ "cmake/Config.cmake.in" ++ "${PROJECT_CONFIG}" ++ INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}" ++) ++ ++install( ++ FILES "${PROJECT_CONFIG}" "${VERSION_CONFIG}" ++ DESTINATION "${CONFIG_INSTALL_DIR}" ++) ++ ++install( ++ EXPORT "${TARGETS_EXPORT_NAME}" ++ NAMESPACE "${NAMESPACE}" ++ DESTINATION "${CONFIG_INSTALL_DIR}" ++) ++ ++# } ++ + install(TARGETS ${PROJECT_NAME} ++ EXPORT ${TARGETS_EXPORT_NAME} + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib +- COMPONENT library) +-install(FILES ${PROJECT_SOURCE_DIR}/src/zip.h DESTINATION include) ++ INCLUDES DESTINATION ${INCLUDE_INSTALL_DIR} ++) ++install(FILES ${PROJECT_SOURCE_DIR}/src/zip.h DESTINATION ${INCLUDE_INSTALL_DIR}/zip) + + # uninstall target (https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake) + if(NOT TARGET uninstall) +@@ -45,3 +101,12 @@ if(NOT TARGET uninstall) + add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake) + endif() ++ ++find_package(Doxygen) ++if(DOXYGEN_FOUND) ++ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) ++ add_custom_target(doc ++ ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile ++ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ++ COMMENT "Generating API documentation with Doxygen" VERBATIM) ++endif() +diff --git a/contrib/zip/README.md b/contrib/zip/README.md +index d5fb8cd2..14eb9a34 100644 +--- a/contrib/zip/README.md ++++ b/contrib/zip/README.md +@@ -71,7 +71,7 @@ int arg = 2; + zip_extract("foo.zip", "/tmp", on_extract_entry, &arg); + ``` + +-* Extract a zip entry into memory. ++* Extract a zip entry into memory. + ```c + void *buf = NULL; + size_t bufsize; +@@ -89,7 +89,7 @@ zip_close(zip); + free(buf); + ``` + +-* Extract a zip entry into memory (no internal allocation). ++* Extract a zip entry into memory (no internal allocation). + ```c + unsigned char *buf; + size_t bufsize; +@@ -110,7 +110,7 @@ zip_close(zip); + free(buf); + ``` + +-* Extract a zip entry into memory using callback. ++* Extract a zip entry into memory using callback. + ```c + struct buffer_t { + char *data; +@@ -144,7 +144,7 @@ free(buf.data); + ``` + + +-* Extract a zip entry into a file. ++* Extract a zip entry into a file. + ```c + struct zip_t *zip = zip_open("foo.zip", 0, 'r'); + { +@@ -157,7 +157,7 @@ struct zip_t *zip = zip_open("foo.zip", 0, 'r'); + zip_close(zip); + ``` + +-* List of all zip entries ++* List of all zip entries + ```c + struct zip_t *zip = zip_open("foo.zip", 0, 'r'); + int i, n = zip_total_entries(zip); +@@ -174,7 +174,7 @@ for (i = 0; i < n; ++i) { + zip_close(zip); + ``` + +-## Bindings ++# Bindings + Compile zip library as a dynamic library. + ```shell + $ mkdir build +diff --git a/contrib/zip/appveyor.yml b/contrib/zip/appveyor.yml +index 0be6373c..ea17f5de 100644 +--- a/contrib/zip/appveyor.yml ++++ b/contrib/zip/appveyor.yml +@@ -1,4 +1,4 @@ +-version: zip-0.1.9.{build} ++version: zip-0.1.15.{build} + build_script: + - cmd: >- + cd c:\projects\zip +diff --git a/contrib/zip/src/miniz.h b/contrib/zip/src/miniz.h +index 2c27a94d..c4fcfb83 100644 +--- a/contrib/zip/src/miniz.h ++++ b/contrib/zip/src/miniz.h +@@ -221,6 +221,7 @@ + #ifndef MINIZ_HEADER_INCLUDED + #define MINIZ_HEADER_INCLUDED + ++#include + #include + + // Defines to completely disable specific portions of miniz.c: +@@ -284,7 +285,8 @@ + /* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES only if not set */ + #if !defined(MINIZ_USE_UNALIGNED_LOADS_AND_STORES) + #if MINIZ_X86_OR_X64_CPU +-/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. */ ++/* Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient ++ * integer loads and stores from unaligned addresses. */ + #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 + #define MINIZ_UNALIGNED_USE_MEMCPY + #else +@@ -354,6 +356,44 @@ enum { + MZ_FIXED = 4 + }; + ++/* miniz error codes. Be sure to update mz_zip_get_error_string() if you add or ++ * modify this enum. */ ++typedef enum { ++ MZ_ZIP_NO_ERROR = 0, ++ MZ_ZIP_UNDEFINED_ERROR, ++ MZ_ZIP_TOO_MANY_FILES, ++ MZ_ZIP_FILE_TOO_LARGE, ++ MZ_ZIP_UNSUPPORTED_METHOD, ++ MZ_ZIP_UNSUPPORTED_ENCRYPTION, ++ MZ_ZIP_UNSUPPORTED_FEATURE, ++ MZ_ZIP_FAILED_FINDING_CENTRAL_DIR, ++ MZ_ZIP_NOT_AN_ARCHIVE, ++ MZ_ZIP_INVALID_HEADER_OR_CORRUPTED, ++ MZ_ZIP_UNSUPPORTED_MULTIDISK, ++ MZ_ZIP_DECOMPRESSION_FAILED, ++ MZ_ZIP_COMPRESSION_FAILED, ++ MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE, ++ MZ_ZIP_CRC_CHECK_FAILED, ++ MZ_ZIP_UNSUPPORTED_CDIR_SIZE, ++ MZ_ZIP_ALLOC_FAILED, ++ MZ_ZIP_FILE_OPEN_FAILED, ++ MZ_ZIP_FILE_CREATE_FAILED, ++ MZ_ZIP_FILE_WRITE_FAILED, ++ MZ_ZIP_FILE_READ_FAILED, ++ MZ_ZIP_FILE_CLOSE_FAILED, ++ MZ_ZIP_FILE_SEEK_FAILED, ++ MZ_ZIP_FILE_STAT_FAILED, ++ MZ_ZIP_INVALID_PARAMETER, ++ MZ_ZIP_INVALID_FILENAME, ++ MZ_ZIP_BUF_TOO_SMALL, ++ MZ_ZIP_INTERNAL_ERROR, ++ MZ_ZIP_FILE_NOT_FOUND, ++ MZ_ZIP_ARCHIVE_TOO_LARGE, ++ MZ_ZIP_VALIDATION_FAILED, ++ MZ_ZIP_WRITE_CALLBACK_FAILED, ++ MZ_ZIP_TOTAL_ERRORS ++} mz_zip_error; ++ + // Method + #define MZ_DEFLATED 8 + +@@ -696,6 +736,7 @@ typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, + void *pBuf, size_t n); + typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, + const void *pBuf, size_t n); ++typedef mz_bool (*mz_file_needs_keepalive)(void *pOpaque); + + struct mz_zip_internal_state_tag; + typedef struct mz_zip_internal_state_tag mz_zip_internal_state; +@@ -707,13 +748,27 @@ typedef enum { + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 + } mz_zip_mode; + +-typedef struct mz_zip_archive_tag { ++typedef enum { ++ MZ_ZIP_TYPE_INVALID = 0, ++ MZ_ZIP_TYPE_USER, ++ MZ_ZIP_TYPE_MEMORY, ++ MZ_ZIP_TYPE_HEAP, ++ MZ_ZIP_TYPE_FILE, ++ MZ_ZIP_TYPE_CFILE, ++ MZ_ZIP_TOTAL_TYPES ++} mz_zip_type; ++ ++typedef struct { + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; +- mz_uint m_total_files; ++ ++ /* We only support up to UINT32_MAX files in zip64 mode. */ ++ mz_uint32 m_total_files; + mz_zip_mode m_zip_mode; ++ mz_zip_type m_zip_type; ++ mz_zip_error m_last_error; + +- mz_uint m_file_offset_alignment; ++ mz_uint64 m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; +@@ -722,6 +777,7 @@ typedef struct mz_zip_archive_tag { + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; ++ mz_file_needs_keepalive m_pNeeds_keepalive; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; +@@ -1263,6 +1319,9 @@ mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, + int strategy); + #endif // #ifndef MINIZ_NO_ZLIB_APIS + ++#define MZ_UINT16_MAX (0xFFFFU) ++#define MZ_UINT32_MAX (0xFFFFFFFFU) ++ + #ifdef __cplusplus + } + #endif +@@ -1311,6 +1370,11 @@ typedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1]; + ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) + #endif + ++#define MZ_READ_LE64(p) \ ++ (((mz_uint64)MZ_READ_LE32(p)) | \ ++ (((mz_uint64)MZ_READ_LE32((const mz_uint8 *)(p) + sizeof(mz_uint32))) \ ++ << 32U)) ++ + #ifdef _MSC_VER + #define MZ_FORCEINLINE __forceinline + #elif defined(__GNUC__) +@@ -4160,6 +4224,17 @@ enum { + MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, ++ ++ /* ZIP64 archive identifier and record sizes */ ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06064b50, ++ MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG = 0x07064b50, ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE = 56, ++ MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE = 20, ++ MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID = 0x0001, ++ MZ_ZIP_DATA_DESCRIPTOR_ID = 0x08074b50, ++ MZ_ZIP_DATA_DESCRIPTER_SIZE64 = 24, ++ MZ_ZIP_DATA_DESCRIPTER_SIZE32 = 16, ++ + // Central directory header record offsets + MZ_ZIP_CDH_SIG_OFS = 0, + MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, +@@ -4199,6 +4274,31 @@ enum { + MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, + MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, + MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, ++ ++ /* ZIP64 End of central directory locator offsets */ ++ MZ_ZIP64_ECDL_SIG_OFS = 0, /* 4 bytes */ ++ MZ_ZIP64_ECDL_NUM_DISK_CDIR_OFS = 4, /* 4 bytes */ ++ MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS = 8, /* 8 bytes */ ++ MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS = 16, /* 4 bytes */ ++ ++ /* ZIP64 End of central directory header offsets */ ++ MZ_ZIP64_ECDH_SIG_OFS = 0, /* 4 bytes */ ++ MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS = 4, /* 8 bytes */ ++ MZ_ZIP64_ECDH_VERSION_MADE_BY_OFS = 12, /* 2 bytes */ ++ MZ_ZIP64_ECDH_VERSION_NEEDED_OFS = 14, /* 2 bytes */ ++ MZ_ZIP64_ECDH_NUM_THIS_DISK_OFS = 16, /* 4 bytes */ ++ MZ_ZIP64_ECDH_NUM_DISK_CDIR_OFS = 20, /* 4 bytes */ ++ MZ_ZIP64_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 24, /* 8 bytes */ ++ MZ_ZIP64_ECDH_CDIR_TOTAL_ENTRIES_OFS = 32, /* 8 bytes */ ++ MZ_ZIP64_ECDH_CDIR_SIZE_OFS = 40, /* 8 bytes */ ++ MZ_ZIP64_ECDH_CDIR_OFS_OFS = 48, /* 8 bytes */ ++ MZ_ZIP_VERSION_MADE_BY_DOS_FILESYSTEM_ID = 0, ++ MZ_ZIP_DOS_DIR_ATTRIBUTE_BITFLAG = 0x10, ++ MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_IS_ENCRYPTED = 1, ++ MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_COMPRESSED_PATCH_FLAG = 32, ++ MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_USES_STRONG_ENCRYPTION = 64, ++ MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_LOCAL_DIR_IS_MASKED = 8192, ++ MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8 = 1 << 11 + }; + + typedef struct { +@@ -4211,7 +4311,24 @@ struct mz_zip_internal_state_tag { + mz_zip_array m_central_dir; + mz_zip_array m_central_dir_offsets; + mz_zip_array m_sorted_central_dir_offsets; ++ ++ /* The flags passed in when the archive is initially opened. */ ++ uint32_t m_init_flags; ++ ++ /* MZ_TRUE if the archive has a zip64 end of central directory headers, etc. ++ */ ++ mz_bool m_zip64; ++ ++ /* MZ_TRUE if we found zip64 extended info in the central directory (m_zip64 ++ * will also be slammed to true too, even if we didn't find a zip64 end of ++ * central dir header, etc.) */ ++ mz_bool m_zip64_has_extended_info_fields; ++ ++ /* These fields are used by the file, FILE, memory, and memory/heap read/write ++ * helpers. */ + MZ_FILE *m_pFile; ++ mz_uint64 m_file_archive_start_ofs; ++ + void *m_pMem; + size_t m_mem_size; + size_t m_mem_capacity; +@@ -4363,6 +4480,13 @@ static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, + #endif /* #ifndef MINIZ_NO_STDIO */ + #endif /* #ifndef MINIZ_NO_TIME */ + ++static MZ_FORCEINLINE mz_bool mz_zip_set_error(mz_zip_archive *pZip, ++ mz_zip_error err_num) { ++ if (pZip) ++ pZip->m_last_error = err_num; ++ return MZ_FALSE; ++} ++ + static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, + mz_uint32 flags) { + (void)flags; +@@ -4480,127 +4604,346 @@ mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) { + } + } + +-static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, +- mz_uint32 flags) { +- mz_uint cdir_size, num_this_disk, cdir_disk_index; +- mz_uint64 cdir_ofs; ++static mz_bool mz_zip_reader_locate_header_sig(mz_zip_archive *pZip, ++ mz_uint32 record_sig, ++ mz_uint32 record_size, ++ mz_int64 *pOfs) { + mz_int64 cur_file_ofs; +- const mz_uint8 *p; + mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; + mz_uint8 *pBuf = (mz_uint8 *)buf_u32; +- mz_bool sort_central_dir = +- ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); +- // Basic sanity checks - reject files which are too small, and check the first +- // 4 bytes of the file to make sure a local header is there. +- if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) ++ ++ /* Basic sanity checks - reject files which are too small */ ++ if (pZip->m_archive_size < record_size) + return MZ_FALSE; +- // Find the end of central directory record by scanning the file from the end +- // towards the beginning. ++ ++ /* Find the record by scanning the file from the end towards the beginning. */ + cur_file_ofs = + MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); + for (;;) { + int i, + n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); ++ + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) + return MZ_FALSE; +- for (i = n - 4; i >= 0; --i) +- if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) +- break; ++ ++ for (i = n - 4; i >= 0; --i) { ++ mz_uint s = MZ_READ_LE32(pBuf + i); ++ if (s == record_sig) { ++ if ((pZip->m_archive_size - (cur_file_ofs + i)) >= record_size) ++ break; ++ } ++ } ++ + if (i >= 0) { + cur_file_ofs += i; + break; + } ++ ++ /* Give up if we've searched the entire file, or we've gone back "too far" ++ * (~64kb) */ + if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= +- (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) ++ (MZ_UINT16_MAX + record_size))) + return MZ_FALSE; ++ + cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); + } +- // Read and verify the end of central directory record. ++ ++ *pOfs = cur_file_ofs; ++ return MZ_TRUE; ++} ++ ++static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, ++ mz_uint flags) { ++ mz_uint cdir_size = 0, cdir_entries_on_this_disk = 0, num_this_disk = 0, ++ cdir_disk_index = 0; ++ mz_uint64 cdir_ofs = 0; ++ mz_int64 cur_file_ofs = 0; ++ const mz_uint8 *p; ++ ++ mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; ++ mz_uint8 *pBuf = (mz_uint8 *)buf_u32; ++ mz_bool sort_central_dir = ++ ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); ++ mz_uint32 zip64_end_of_central_dir_locator_u32 ++ [(MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE + sizeof(mz_uint32) - 1) / ++ sizeof(mz_uint32)]; ++ mz_uint8 *pZip64_locator = (mz_uint8 *)zip64_end_of_central_dir_locator_u32; ++ ++ mz_uint32 zip64_end_of_central_dir_header_u32 ++ [(MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / ++ sizeof(mz_uint32)]; ++ mz_uint8 *pZip64_end_of_central_dir = ++ (mz_uint8 *)zip64_end_of_central_dir_header_u32; ++ ++ mz_uint64 zip64_end_of_central_dir_ofs = 0; ++ ++ /* Basic sanity checks - reject files which are too small, and check the first ++ * 4 bytes of the file to make sure a local header is there. */ ++ if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) ++ return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); ++ ++ if (!mz_zip_reader_locate_header_sig( ++ pZip, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG, ++ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE, &cur_file_ofs)) ++ return mz_zip_set_error(pZip, MZ_ZIP_FAILED_FINDING_CENTRAL_DIR); ++ ++ /* Read and verify the end of central directory record. */ + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) +- return MZ_FALSE; +- if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != +- MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || +- ((pZip->m_total_files = +- MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != +- MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); ++ ++ if (MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != ++ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) ++ return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); ++ ++ if (cur_file_ofs >= (MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE + ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE)) { ++ if (pZip->m_pRead(pZip->m_pIO_opaque, ++ cur_file_ofs - MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE, ++ pZip64_locator, ++ MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) == ++ MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIZE) { ++ if (MZ_READ_LE32(pZip64_locator + MZ_ZIP64_ECDL_SIG_OFS) == ++ MZ_ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIG) { ++ zip64_end_of_central_dir_ofs = MZ_READ_LE64( ++ pZip64_locator + MZ_ZIP64_ECDL_REL_OFS_TO_ZIP64_ECDR_OFS); ++ if (zip64_end_of_central_dir_ofs > ++ (pZip->m_archive_size - MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE)) ++ return mz_zip_set_error(pZip, MZ_ZIP_NOT_AN_ARCHIVE); ++ ++ if (pZip->m_pRead(pZip->m_pIO_opaque, zip64_end_of_central_dir_ofs, ++ pZip64_end_of_central_dir, ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) == ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE) { ++ if (MZ_READ_LE32(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_SIG_OFS) == ++ MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIG) { ++ pZip->m_pState->m_zip64 = MZ_TRUE; ++ } ++ } ++ } ++ } ++ } + ++ pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS); ++ cdir_entries_on_this_disk = ++ MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS); + num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); + cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); ++ cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS); ++ cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); ++ ++ if (pZip->m_pState->m_zip64) { ++ mz_uint32 zip64_total_num_of_disks = ++ MZ_READ_LE32(pZip64_locator + MZ_ZIP64_ECDL_TOTAL_NUMBER_OF_DISKS_OFS); ++ mz_uint64 zip64_cdir_total_entries = MZ_READ_LE64( ++ pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_TOTAL_ENTRIES_OFS); ++ mz_uint64 zip64_cdir_total_entries_on_this_disk = MZ_READ_LE64( ++ pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS); ++ mz_uint64 zip64_size_of_end_of_central_dir_record = MZ_READ_LE64( ++ pZip64_end_of_central_dir + MZ_ZIP64_ECDH_SIZE_OF_RECORD_OFS); ++ mz_uint64 zip64_size_of_central_directory = ++ MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_SIZE_OFS); ++ ++ if (zip64_size_of_end_of_central_dir_record < ++ (MZ_ZIP64_END_OF_CENTRAL_DIR_HEADER_SIZE - 12)) ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ ++ if (zip64_total_num_of_disks != 1U) ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); ++ ++ /* Check for miniz's practical limits */ ++ if (zip64_cdir_total_entries > MZ_UINT32_MAX) ++ return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); ++ ++ pZip->m_total_files = (mz_uint32)zip64_cdir_total_entries; ++ ++ if (zip64_cdir_total_entries_on_this_disk > MZ_UINT32_MAX) ++ return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); ++ ++ cdir_entries_on_this_disk = ++ (mz_uint32)zip64_cdir_total_entries_on_this_disk; ++ ++ /* Check for miniz's current practical limits (sorry, this should be enough ++ * for millions of files) */ ++ if (zip64_size_of_central_directory > MZ_UINT32_MAX) ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); ++ ++ cdir_size = (mz_uint32)zip64_size_of_central_directory; ++ ++ num_this_disk = MZ_READ_LE32(pZip64_end_of_central_dir + ++ MZ_ZIP64_ECDH_NUM_THIS_DISK_OFS); ++ ++ cdir_disk_index = MZ_READ_LE32(pZip64_end_of_central_dir + ++ MZ_ZIP64_ECDH_NUM_DISK_CDIR_OFS); ++ ++ cdir_ofs = ++ MZ_READ_LE64(pZip64_end_of_central_dir + MZ_ZIP64_ECDH_CDIR_OFS_OFS); ++ } ++ ++ if (pZip->m_total_files != cdir_entries_on_this_disk) ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); ++ + if (((num_this_disk | cdir_disk_index) != 0) && + ((num_this_disk != 1) || (cdir_disk_index != 1))) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); + +- if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < +- pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) +- return MZ_FALSE; ++ if (cdir_size < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); + +- cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); + if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); + + pZip->m_central_directory_file_ofs = cdir_ofs; + + if (pZip->m_total_files) { + mz_uint i, n; +- +- // Read the entire central directory into a heap block, and allocate another +- // heap block to hold the unsorted central dir file record offsets, and +- // another to hold the sorted indices. ++ /* Read the entire central directory into a heap block, and allocate another ++ * heap block to hold the unsorted central dir file record offsets, and ++ * possibly another to hold the sorted indices. */ + if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, + MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, + pZip->m_total_files, MZ_FALSE))) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); + + if (sort_central_dir) { + if (!mz_zip_array_resize(pZip, + &pZip->m_pState->m_sorted_central_dir_offsets, + pZip->m_total_files, MZ_FALSE)) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); + } + + if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, + pZip->m_pState->m_central_dir.m_p, + cdir_size) != cdir_size) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); + +- // Now create an index into the central directory file records, do some +- // basic sanity checking on each record, and check for zip64 entries (which +- // are not yet supported). ++ /* Now create an index into the central directory file records, do some ++ * basic sanity checking on each record */ + p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; + for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) { +- mz_uint total_header_size, comp_size, decomp_size, disk_index; ++ mz_uint total_header_size, disk_index, bit_flags, filename_size, ++ ext_data_size; ++ mz_uint64 comp_size, decomp_size, local_header_ofs; ++ + if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || + (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, + i) = + (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); ++ + if (sort_central_dir) + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, + mz_uint32, i) = i; ++ + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); +- if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && +- (decomp_size != comp_size)) || +- (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || +- (comp_size == 0xFFFFFFFF)) +- return MZ_FALSE; ++ local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); ++ filename_size = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); ++ ext_data_size = MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS); ++ ++ if ((!pZip->m_pState->m_zip64_has_extended_info_fields) && ++ (ext_data_size) && ++ (MZ_MAX(MZ_MAX(comp_size, decomp_size), local_header_ofs) == ++ MZ_UINT32_MAX)) { ++ /* Attempt to find zip64 extended information field in the entry's extra ++ * data */ ++ mz_uint32 extra_size_remaining = ext_data_size; ++ ++ if (extra_size_remaining) { ++ const mz_uint8 *pExtra_data; ++ void *buf = NULL; ++ ++ if (MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + ext_data_size > ++ n) { ++ buf = MZ_MALLOC(ext_data_size); ++ if (buf == NULL) ++ return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); ++ ++ if (pZip->m_pRead(pZip->m_pIO_opaque, ++ cdir_ofs + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + ++ filename_size, ++ buf, ext_data_size) != ext_data_size) { ++ MZ_FREE(buf); ++ return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); ++ } ++ ++ pExtra_data = (mz_uint8 *)buf; ++ } else { ++ pExtra_data = p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size; ++ } ++ ++ do { ++ mz_uint32 field_id; ++ mz_uint32 field_data_size; ++ ++ if (extra_size_remaining < (sizeof(mz_uint16) * 2)) { ++ MZ_FREE(buf); ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ } ++ ++ field_id = MZ_READ_LE16(pExtra_data); ++ field_data_size = MZ_READ_LE16(pExtra_data + sizeof(mz_uint16)); ++ ++ if ((field_data_size + sizeof(mz_uint16) * 2) > ++ extra_size_remaining) { ++ MZ_FREE(buf); ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ } ++ ++ if (field_id == MZ_ZIP64_EXTENDED_INFORMATION_FIELD_HEADER_ID) { ++ /* Ok, the archive didn't have any zip64 headers but it uses a ++ * zip64 extended information field so mark it as zip64 anyway ++ * (this can occur with infozip's zip util when it reads ++ * compresses files from stdin). */ ++ pZip->m_pState->m_zip64 = MZ_TRUE; ++ pZip->m_pState->m_zip64_has_extended_info_fields = MZ_TRUE; ++ break; ++ } ++ ++ pExtra_data += sizeof(mz_uint16) * 2 + field_data_size; ++ extra_size_remaining = ++ extra_size_remaining - sizeof(mz_uint16) * 2 - field_data_size; ++ } while (extra_size_remaining); ++ ++ MZ_FREE(buf); ++ } ++ } ++ ++ /* I've seen archives that aren't marked as zip64 that uses zip64 ext ++ * data, argh */ ++ if ((comp_size != MZ_UINT32_MAX) && (decomp_size != MZ_UINT32_MAX)) { ++ if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && ++ (decomp_size != comp_size)) || ++ (decomp_size && !comp_size)) ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ } ++ + disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); +- if ((disk_index != num_this_disk) && (disk_index != 1)) +- return MZ_FALSE; +- if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + +- MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) +- return MZ_FALSE; ++ if ((disk_index == MZ_UINT16_MAX) || ++ ((disk_index != num_this_disk) && (disk_index != 1))) ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_MULTIDISK); ++ ++ if (comp_size != MZ_UINT32_MAX) { ++ if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + ++ MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ } ++ ++ bit_flags = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); ++ if (bit_flags & MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_LOCAL_DIR_IS_MASKED) ++ return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_ENCRYPTION); ++ + if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > + n) +- return MZ_FALSE; ++ return mz_zip_set_error(pZip, MZ_ZIP_INVALID_HEADER_OR_CORRUPTED); ++ + n -= total_header_size; + p += total_header_size; + } +diff --git a/contrib/zip/src/zip.c b/contrib/zip/src/zip.c +index ff3a8fe1..1abcfd8f 100644 +--- a/contrib/zip/src/zip.c ++++ b/contrib/zip/src/zip.c +@@ -24,7 +24,6 @@ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) && \ + (P)[1] == ':') + #define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE(P) ? 2 : 0) +-#define ISSLASH(C) ((C) == '/' || (C) == '\\') + + #else + +@@ -48,7 +47,7 @@ int symlink(const char *target, const char *linkpath); // needed on Linux + #endif + + #ifndef ISSLASH +-#define ISSLASH(C) ((C) == '/') ++#define ISSLASH(C) ((C) == '/' || (C) == '\\') + #endif + + #define CLEANUP(ptr) \ +@@ -78,26 +77,34 @@ static const char *base_name(const char *name) { + return base; + } + +-static int mkpath(const char *path) { +- char const *p; ++static int mkpath(char *path) { ++ char *p; + char npath[MAX_PATH + 1]; + int len = 0; + int has_device = HAS_DEVICE(path); + + memset(npath, 0, MAX_PATH + 1); +- +-#ifdef _WIN32 +- // only on windows fix the path +- npath[0] = path[0]; +- npath[1] = path[1]; +- len = 2; +-#endif // _WIN32 +- ++ if (has_device) { ++ // only on windows ++ npath[0] = path[0]; ++ npath[1] = path[1]; ++ len = 2; ++ } + for (p = path + len; *p && len < MAX_PATH; p++) { + if (ISSLASH(*p) && ((!has_device && len > 0) || (has_device && len > 2))) { +- if (MKDIR(npath) == -1) +- if (errno != EEXIST) ++#if defined(_WIN32) || defined(__WIN32__) || defined(_MSC_VER) || \ ++ defined(__MINGW32__) ++#else ++ if ('\\' == *p) { ++ *p = '/'; ++ } ++#endif ++ ++ if (MKDIR(npath) == -1) { ++ if (errno != EEXIST) { + return -1; ++ } ++ } + } + npath[len++] = *p; + } +@@ -279,7 +286,14 @@ int zip_entry_open(struct zip_t *zip, const char *entryname) { + zip->entry.header_offset = zip->archive.m_archive_size; + memset(zip->entry.header, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE * sizeof(mz_uint8)); + zip->entry.method = 0; ++ ++ // UNIX or APPLE ++#if MZ_PLATFORM == 3 || MZ_PLATFORM == 19 ++ // regular file with rw-r--r-- persmissions ++ zip->entry.external_attr = (mz_uint32)(0100644) << 16; ++#else + zip->entry.external_attr = 0; ++#endif + + num_alignment_padding_bytes = + mz_zip_writer_compute_padding_needed_for_file_alignment(pzip); +@@ -660,7 +674,7 @@ ssize_t zip_entry_noallocread(struct zip_t *zip, void *buf, size_t bufsize) { + } + + if (!mz_zip_reader_extract_to_mem_no_alloc(pzip, (mz_uint)zip->entry.index, +- buf, bufsize, 0, NULL, 0)) { ++ buf, bufsize, 0, NULL, 0)) { + return -1; + } + +@@ -670,10 +684,7 @@ ssize_t zip_entry_noallocread(struct zip_t *zip, void *buf, size_t bufsize) { + int zip_entry_fread(struct zip_t *zip, const char *filename) { + mz_zip_archive *pzip = NULL; + mz_uint idx; +-#if defined(_MSC_VER) +-#else + mz_uint32 xattr = 0; +-#endif + mz_zip_archive_file_stat info; + + if (!zip) { +@@ -875,12 +886,19 @@ int zip_extract(const char *zipname, const char *dir, + goto out; + } + +- if ((((info.m_version_made_by >> 8) == 3) || ((info.m_version_made_by >> 8) == 19)) // if zip is produced on Unix or macOS (3 and 19 from section 4.4.2.2 of zip standard) +- && info.m_external_attr & (0x20 << 24)) { // and has sym link attribute (0x80 is file, 0x40 is directory) ++ if ((((info.m_version_made_by >> 8) == 3) || ++ ((info.m_version_made_by >> 8) == ++ 19)) // if zip is produced on Unix or macOS (3 and 19 from ++ // section 4.4.2.2 of zip standard) ++ && info.m_external_attr & ++ (0x20 << 24)) { // and has sym link attribute (0x80 is file, 0x40 ++ // is directory) + #if defined(_WIN32) || defined(__WIN32__) || defined(_MSC_VER) || \ + defined(__MINGW32__) +-#else +- if (info.m_uncomp_size > MAX_PATH || !mz_zip_reader_extract_to_mem_no_alloc(&zip_archive, i, symlink_to, MAX_PATH, 0, NULL, 0)) { ++#else ++ if (info.m_uncomp_size > MAX_PATH || ++ !mz_zip_reader_extract_to_mem_no_alloc(&zip_archive, i, symlink_to, ++ MAX_PATH, 0, NULL, 0)) { + goto out; + } + symlink_to[info.m_uncomp_size] = '\0'; +diff --git a/contrib/zip/src/zip.h b/contrib/zip/src/zip.h +index 5f39df50..a48d64d6 100644 +--- a/contrib/zip/src/zip.h ++++ b/contrib/zip/src/zip.h +@@ -20,241 +20,240 @@ extern "C" { + #endif + + #if !defined(_SSIZE_T_DEFINED) && !defined(_SSIZE_T_DEFINED_) && \ +- !defined(_SSIZE_T) && !defined(_SSIZE_T_) && !defined(__ssize_t_defined) +-#define _SSIZE_T ++ !defined(__DEFINED_ssize_t) && !defined(__ssize_t_defined) && \ ++ !defined(_SSIZE_T) && !defined(_SSIZE_T_) ++ + // 64-bit Windows is the only mainstream platform + // where sizeof(long) != sizeof(void*) + #ifdef _WIN64 +-typedef long long ssize_t; /* byte count or error */ ++typedef long long ssize_t; /* byte count or error */ + #else +-typedef long ssize_t; /* byte count or error */ ++typedef long ssize_t; /* byte count or error */ + #endif ++ ++#define _SSIZE_T_DEFINED ++#define _SSIZE_T_DEFINED_ ++#define __DEFINED_ssize_t ++#define __ssize_t_defined ++#define _SSIZE_T ++#define _SSIZE_T_ ++ + #endif + + #ifndef MAX_PATH + #define MAX_PATH 32767 /* # chars in a path name including NULL */ + #endif + ++/** ++ * @mainpage ++ * ++ * Documenation for @ref zip. ++ */ ++ ++/** ++ * @addtogroup zip ++ * @{ ++ */ ++ ++/** ++ * Default zip compression level. ++ */ ++ + #define ZIP_DEFAULT_COMPRESSION_LEVEL 6 + +-/* +- This data structure is used throughout the library to represent zip archive +- - forward declaration. +-*/ ++/** ++ * @struct zip_t ++ * ++ * This data structure is used throughout the library to represent zip archive - ++ * forward declaration. ++ */ + struct zip_t; + +-/* +- Opens zip archive with compression level using the given mode. +- +- Args: +- zipname: zip archive file name. +- level: compression level (0-9 are the standard zlib-style levels). +- mode: file access mode. +- 'r': opens a file for reading/extracting (the file must exists). +- 'w': creates an empty file for writing. +- 'a': appends to an existing archive. +- +- Returns: +- The zip archive handler or NULL on error +-*/ ++/** ++ * Opens zip archive with compression level using the given mode. ++ * ++ * @param zipname zip archive file name. ++ * @param level compression level (0-9 are the standard zlib-style levels). ++ * @param mode file access mode. ++ * - 'r': opens a file for reading/extracting (the file must exists). ++ * - 'w': creates an empty file for writing. ++ * - 'a': appends to an existing archive. ++ * ++ * @return the zip archive handler or NULL on error ++ */ + extern struct zip_t *zip_open(const char *zipname, int level, char mode); + +-/* +- Closes the zip archive, releases resources - always finalize. +- +- Args: +- zip: zip archive handler. +-*/ ++/** ++ * Closes the zip archive, releases resources - always finalize. ++ * ++ * @param zip zip archive handler. ++ */ + extern void zip_close(struct zip_t *zip); + +-/* +- Opens an entry by name in the zip archive. +- For zip archive opened in 'w' or 'a' mode the function will append +- a new entry. In readonly mode the function tries to locate the entry +- in global dictionary. +- +- Args: +- zip: zip archive handler. +- entryname: an entry name in local dictionary. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Opens an entry by name in the zip archive. ++ * ++ * For zip archive opened in 'w' or 'a' mode the function will append ++ * a new entry. In readonly mode the function tries to locate the entry ++ * in global dictionary. ++ * ++ * @param zip zip archive handler. ++ * @param entryname an entry name in local dictionary. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_open(struct zip_t *zip, const char *entryname); + +-/* +- Opens a new entry by index in the zip archive. +- This function is only valid if zip archive was opened in 'r' (readonly) mode. +- +- Args: +- zip: zip archive handler. +- index: index in local dictionary. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Opens a new entry by index in the zip archive. ++ * ++ * This function is only valid if zip archive was opened in 'r' (readonly) mode. ++ * ++ * @param zip zip archive handler. ++ * @param index index in local dictionary. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_openbyindex(struct zip_t *zip, int index); + +-/* +- Closes a zip entry, flushes buffer and releases resources. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Closes a zip entry, flushes buffer and releases resources. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_close(struct zip_t *zip); + +-/* +- Returns a local name of the current zip entry. +- The main difference between user's entry name and local entry name +- is optional relative path. +- Following .ZIP File Format Specification - the path stored MUST not contain +- a drive or device letter, or a leading slash. +- All slashes MUST be forward slashes '/' as opposed to backwards slashes '\' +- for compatibility with Amiga and UNIX file systems etc. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The pointer to the current zip entry name, or NULL on error. +-*/ ++/** ++ * Returns a local name of the current zip entry. ++ * ++ * The main difference between user's entry name and local entry name ++ * is optional relative path. ++ * Following .ZIP File Format Specification - the path stored MUST not contain ++ * a drive or device letter, or a leading slash. ++ * All slashes MUST be forward slashes '/' as opposed to backwards slashes '\' ++ * for compatibility with Amiga and UNIX file systems etc. ++ * ++ * @param zip: zip archive handler. ++ * ++ * @return the pointer to the current zip entry name, or NULL on error. ++ */ + extern const char *zip_entry_name(struct zip_t *zip); + +-/* +- Returns an index of the current zip entry. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The index on success, negative number (< 0) on error. +-*/ ++/** ++ * Returns an index of the current zip entry. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the index on success, negative number (< 0) on error. ++ */ + extern int zip_entry_index(struct zip_t *zip); + +-/* +- Determines if the current zip entry is a directory entry. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The return code - 1 (true), 0 (false), negative number (< 0) on error. +-*/ ++/** ++ * Determines if the current zip entry is a directory entry. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the return code - 1 (true), 0 (false), negative number (< 0) on ++ * error. ++ */ + extern int zip_entry_isdir(struct zip_t *zip); + +-/* +- Returns an uncompressed size of the current zip entry. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The uncompressed size in bytes. +-*/ ++/** ++ * Returns an uncompressed size of the current zip entry. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the uncompressed size in bytes. ++ */ + extern unsigned long long zip_entry_size(struct zip_t *zip); + +-/* +- Returns CRC-32 checksum of the current zip entry. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The CRC-32 checksum. +-*/ ++/** ++ * Returns CRC-32 checksum of the current zip entry. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the CRC-32 checksum. ++ */ + extern unsigned int zip_entry_crc32(struct zip_t *zip); + +-/* +- Compresses an input buffer for the current zip entry. +- +- Args: +- zip: zip archive handler. +- buf: input buffer. +- bufsize: input buffer size (in bytes). +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Compresses an input buffer for the current zip entry. ++ * ++ * @param zip zip archive handler. ++ * @param buf input buffer. ++ * @param bufsize input buffer size (in bytes). ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_write(struct zip_t *zip, const void *buf, size_t bufsize); + +-/* +- Compresses a file for the current zip entry. +- +- Args: +- zip: zip archive handler. +- filename: input file. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Compresses a file for the current zip entry. ++ * ++ * @param zip zip archive handler. ++ * @param filename input file. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_fwrite(struct zip_t *zip, const char *filename); + +-/* +- Extracts the current zip entry into output buffer. +- The function allocates sufficient memory for a output buffer. +- +- Args: +- zip: zip archive handler. +- buf: output buffer. +- bufsize: output buffer size (in bytes). +- +- Note: +- - remember to release memory allocated for a output buffer. +- - for large entries, please take a look at zip_entry_extract function. +- +- Returns: +- The return code - the number of bytes actually read on success. +- Otherwise a -1 on error. +-*/ ++/** ++ * Extracts the current zip entry into output buffer. ++ * ++ * The function allocates sufficient memory for a output buffer. ++ * ++ * @param zip zip archive handler. ++ * @param buf output buffer. ++ * @param bufsize output buffer size (in bytes). ++ * ++ * @note remember to release memory allocated for a output buffer. ++ * for large entries, please take a look at zip_entry_extract function. ++ * ++ * @return the return code - the number of bytes actually read on success. ++ * Otherwise a -1 on error. ++ */ + extern ssize_t zip_entry_read(struct zip_t *zip, void **buf, size_t *bufsize); + +-/* +- Extracts the current zip entry into a memory buffer using no memory +- allocation. +- +- Args: +- zip: zip archive handler. +- buf: preallocated output buffer. +- bufsize: output buffer size (in bytes). +- +- Note: +- - ensure supplied output buffer is large enough. +- - zip_entry_size function (returns uncompressed size for the current entry) +- can be handy to estimate how big buffer is needed. +- - for large entries, please take a look at zip_entry_extract function. +- +- Returns: +- The return code - the number of bytes actually read on success. +- Otherwise a -1 on error (e.g. bufsize is not large enough). +-*/ +-extern ssize_t zip_entry_noallocread(struct zip_t *zip, void *buf, size_t bufsize); +- +-/* +- Extracts the current zip entry into output file. +- +- Args: +- zip: zip archive handler. +- filename: output file. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Extracts the current zip entry into a memory buffer using no memory ++ * allocation. ++ * ++ * @param zip zip archive handler. ++ * @param buf preallocated output buffer. ++ * @param bufsize output buffer size (in bytes). ++ * ++ * @note ensure supplied output buffer is large enough. ++ * zip_entry_size function (returns uncompressed size for the current ++ * entry) can be handy to estimate how big buffer is needed. for large ++ * entries, please take a look at zip_entry_extract function. ++ * ++ * @return the return code - the number of bytes actually read on success. ++ * Otherwise a -1 on error (e.g. bufsize is not large enough). ++ */ ++extern ssize_t zip_entry_noallocread(struct zip_t *zip, void *buf, ++ size_t bufsize); ++ ++/** ++ * Extracts the current zip entry into output file. ++ * ++ * @param zip zip archive handler. ++ * @param filename output file. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_entry_fread(struct zip_t *zip, const char *filename); + +-/* +- Extracts the current zip entry using a callback function (on_extract). +- +- Args: +- zip: zip archive handler. +- on_extract: callback function. +- arg: opaque pointer (optional argument, +- which you can pass to the on_extract callback) +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. ++/** ++ * Extracts the current zip entry using a callback function (on_extract). ++ * ++ * @param zip zip archive handler. ++ * @param on_extract callback function. ++ * @param arg opaque pointer (optional argument, which you can pass to the ++ * on_extract callback) ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. + */ + extern int + zip_entry_extract(struct zip_t *zip, +@@ -262,53 +261,49 @@ zip_entry_extract(struct zip_t *zip, + const void *data, size_t size), + void *arg); + +-/* +- Returns the number of all entries (files and directories) in the zip archive. +- +- Args: +- zip: zip archive handler. +- +- Returns: +- The return code - the number of entries on success, +- negative number (< 0) on error. +-*/ ++/** ++ * Returns the number of all entries (files and directories) in the zip archive. ++ * ++ * @param zip zip archive handler. ++ * ++ * @return the return code - the number of entries on success, negative number ++ * (< 0) on error. ++ */ + extern int zip_total_entries(struct zip_t *zip); + +-/* +- Creates a new archive and puts files into a single zip archive. +- +- Args: +- zipname: zip archive file. +- filenames: input files. +- len: number of input files. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Creates a new archive and puts files into a single zip archive. ++ * ++ * @param zipname zip archive file. ++ * @param filenames input files. ++ * @param len: number of input files. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_create(const char *zipname, const char *filenames[], size_t len); + +-/* +- Extracts a zip archive file into directory. +- +- If on_extract_entry is not NULL, the callback will be called after +- successfully extracted each zip entry. +- Returning a negative value from the callback will cause abort and return an +- error. The last argument (void *arg) is optional, which you can use to pass +- data to the on_extract_entry callback. +- +- Args: +- zipname: zip archive file. +- dir: output directory. +- on_extract_entry: on extract callback. +- arg: opaque pointer. +- +- Returns: +- The return code - 0 on success, negative number (< 0) on error. +-*/ ++/** ++ * Extracts a zip archive file into directory. ++ * ++ * If on_extract_entry is not NULL, the callback will be called after ++ * successfully extracted each zip entry. ++ * Returning a negative value from the callback will cause abort and return an ++ * error. The last argument (void *arg) is optional, which you can use to pass ++ * data to the on_extract_entry callback. ++ * ++ * @param zipname zip archive file. ++ * @param dir output directory. ++ * @param on_extract_entry on extract callback. ++ * @param arg opaque pointer. ++ * ++ * @return the return code - 0 on success, negative number (< 0) on error. ++ */ + extern int zip_extract(const char *zipname, const char *dir, + int (*on_extract_entry)(const char *filename, void *arg), + void *arg); + ++/** @} */ ++ + #ifdef __cplusplus + } + #endif +diff --git a/contrib/zip/test/CMakeLists.txt b/contrib/zip/test/CMakeLists.txt +index 9b2a8db1..cc060b00 100644 +--- a/contrib/zip/test/CMakeLists.txt ++++ b/contrib/zip/test/CMakeLists.txt +@@ -1,19 +1,16 @@ + cmake_minimum_required(VERSION 2.8) + +-if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang") +- if(ENABLE_COVERAGE) +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g ") +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs") +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage") +- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") +- endif() +-endif () +- + # test +-include_directories(../src) +-add_executable(test.exe test.c ../src/zip.c) +-add_executable(test_miniz.exe test_miniz.c) ++set(test_out test.out) ++set(test_miniz_out test_miniz.out) ++ ++add_executable(${test_out} test.c) ++target_link_libraries(${test_out} zip) ++add_executable(${test_miniz_out} test_miniz.c) ++target_link_libraries(${test_miniz_out} zip) ++ ++add_test(NAME ${test_out} COMMAND ${test_out}) ++add_test(NAME ${test_miniz_out} COMMAND ${test_miniz_out}) + +-add_test(NAME test COMMAND test.exe) +-add_test(NAME test_miniz COMMAND test_miniz.exe) ++set(test_out ${test_out} PARENT_SCOPE) ++set(test_miniz_out ${test_miniz_out} PARENT_SCOPE) +diff --git a/contrib/zip/test/test.c b/contrib/zip/test/test.c +index 45443053..a9b2ddab 100644 +--- a/contrib/zip/test/test.c ++++ b/contrib/zip/test/test.c +@@ -29,6 +29,8 @@ + #define XFILE "7.txt\0" + #define XMODE 0100777 + ++#define UNIXMODE 0100644 ++ + #define UNUSED(x) (void)x + + static int total_entries = 0; +@@ -102,7 +104,8 @@ static void test_read(void) { + assert(0 == zip_entry_close(zip)); + free(buf); + buf = NULL; +- ++ bufsize = 0; ++ + assert(0 == zip_entry_open(zip, "test/test-2.txt")); + assert(strlen(TESTDATA2) == zip_entry_size(zip)); + assert(CRC32DATA2 == zip_entry_crc32(zip)); +@@ -131,7 +134,8 @@ static void test_read(void) { + assert(0 == zip_entry_close(zip)); + free(buf); + buf = NULL; +- ++ bufsize = 0; ++ + buftmp = strlen(TESTDATA1); + buf = calloc(buftmp, sizeof(char)); + assert(0 == zip_entry_open(zip, "test/test-1.txt")); +@@ -433,6 +437,35 @@ static void test_mtime(void) { + remove(ZIPNAME); + } + ++static void test_unix_permissions(void) { ++#if defined(_WIN64) || defined(_WIN32) || defined(__WIN32__) ++#else ++ // UNIX or APPLE ++ struct MZ_FILE_STAT_STRUCT file_stats; ++ ++ remove(ZIPNAME); ++ ++ struct zip_t *zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); ++ assert(zip != NULL); ++ ++ assert(0 == zip_entry_open(zip, RFILE)); ++ assert(0 == zip_entry_write(zip, TESTDATA1, strlen(TESTDATA1))); ++ assert(0 == zip_entry_close(zip)); ++ ++ zip_close(zip); ++ ++ remove(RFILE); ++ ++ assert(0 == zip_extract(ZIPNAME, ".", NULL, NULL)); ++ ++ assert(0 == MZ_FILE_STAT(RFILE, &file_stats)); ++ assert(UNIXMODE == file_stats.st_mode); ++ ++ remove(RFILE); ++ remove(ZIPNAME); ++#endif ++} ++ + int main(int argc, char *argv[]) { + UNUSED(argc); + UNUSED(argv); +@@ -453,6 +486,7 @@ int main(int argc, char *argv[]) { + test_write_permissions(); + test_exe_permissions(); + test_mtime(); ++ test_unix_permissions(); + + remove(ZIPNAME); + return 0; +diff --git a/contrib/zip/test/test_miniz.c b/contrib/zip/test/test_miniz.c +index ebc0564d..babcaecd 100644 +--- a/contrib/zip/test/test_miniz.c ++++ b/contrib/zip/test/test_miniz.c +@@ -23,16 +23,39 @@ int main(int argc, char *argv[]) { + uint step = 0; + int cmp_status; + uLong src_len = (uLong)strlen(s_pStr); +- uLong cmp_len = compressBound(src_len); + uLong uncomp_len = src_len; ++ uLong cmp_len; + uint8 *pCmp, *pUncomp; ++ size_t sz; + uint total_succeeded = 0; + (void)argc, (void)argv; + + printf("miniz.c version: %s\n", MZ_VERSION); + + do { ++ pCmp = (uint8 *)tdefl_compress_mem_to_heap(s_pStr, src_len, &cmp_len, 0); ++ if (!pCmp) { ++ printf("tdefl_compress_mem_to_heap failed\n"); ++ return EXIT_FAILURE; ++ } ++ if (src_len <= cmp_len) { ++ printf("tdefl_compress_mem_to_heap failed: from %u to %u bytes\n", ++ (mz_uint32)uncomp_len, (mz_uint32)cmp_len); ++ free(pCmp); ++ return EXIT_FAILURE; ++ } ++ ++ sz = tdefl_compress_mem_to_mem(pCmp, cmp_len, s_pStr, src_len, 0); ++ if (sz != cmp_len) { ++ printf("tdefl_compress_mem_to_mem failed: expected %u, got %u\n", ++ (mz_uint32)cmp_len, (mz_uint32)sz); ++ free(pCmp); ++ return EXIT_FAILURE; ++ } ++ + // Allocate buffers to hold compressed and uncompressed data. ++ free(pCmp); ++ cmp_len = compressBound(src_len); + pCmp = (mz_uint8 *)malloc((size_t)cmp_len); + pUncomp = (mz_uint8 *)malloc((size_t)src_len); + if ((!pCmp) || (!pUncomp)) { diff --git a/meta-digi-dey/recipes-graphics/vulkan/assimp_5.0.1.bb b/meta-digi-dey/recipes-graphics/vulkan/assimp_5.0.1.bb new file mode 100644 index 000000000..5a8c62e64 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/assimp_5.0.1.bb @@ -0,0 +1,23 @@ +DESCRIPTION = "Open Asset Import Library is a portable Open Source library to import \ + various well-known 3D model formats in a uniform manner." +HOMEPAGE = "http://www.assimp.org/" +SECTION = "devel" + +LICENSE = "BSD-3-Clause" +LIC_FILES_CHKSUM = "file://LICENSE;md5=2119edef0916b0bd511cb3c731076271" + +DEPENDS = "zlib" + +SRC_URI = "git://github.com/assimp/assimp.git;branch=assimp_5.0_release \ + file://0001-closes-https-github.com-assimp-assimp-issues-2733-up.patch \ + file://0001-Use-ASSIMP_LIB_INSTALL_DIR-to-search-library.patch \ + " +UPSTREAM_CHECK_GITTAGREGEX = "v(?P(\d+(\.\d+)+))" + +SRCREV = "8f0c6b04b2257a520aaab38421b2e090204b69df" + +S = "${WORKDIR}/git" + +inherit cmake + +EXTRA_OECMAKE = "-DASSIMP_BUILD_ASSIMP_TOOLS=OFF -DASSIMP_BUILD_TESTS=OFF -DASSIMP_LIB_INSTALL_DIR=${baselib}" diff --git a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-Avoid-GCC8-warning-in-text_handler.cpp.-2197.patch b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-Avoid-GCC8-warning-in-text_handler.cpp.-2197.patch new file mode 100644 index 000000000..7e7b84443 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-Avoid-GCC8-warning-in-text_handler.cpp.-2197.patch @@ -0,0 +1,36 @@ +From c512c6864080ff617afb422a3d04dd902809a6cf Mon Sep 17 00:00:00 2001 +From: Steven Perron +Date: Thu, 13 Dec 2018 15:03:28 -0500 +Subject: [PATCH] Avoid GCC8 warning in text_handler.cpp. (#2197) + +In the function `AssemblyContext::binaryEncodeString`, we want to copy +a nul terminated string to an instruction. When coping the string, we +did not copy the nul at the end of the source. It was added by setting +the entire last word to 0, which is mandated by the spir-v spec. This +is not a bug, but it does trigger a warning in GCC8 when doing a release +build. + +To avoid the warning, we will copy the nul character at the end of the +string too. + +Fixes #1541. +--- + source/text_handler.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/source/text_handler.cpp b/source/text_handler.cpp +index 5f6e8c4..c31f34a 100644 +--- a/source/text_handler.cpp ++++ b/source/text_handler.cpp +@@ -313,7 +313,7 @@ spv_result_t AssemblyContext::binaryEncodeString(const char* value, + pInst->words.back() = 0; + + char* dest = (char*)&pInst->words[oldWordCount]; +- strncpy(dest, value, length); ++ strncpy(dest, value, length + 1); + + return SPV_SUCCESS; + } +-- +2.7.4 + diff --git a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-tools-lesspipe-Allow-generic-shell.patch b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-tools-lesspipe-Allow-generic-shell.patch new file mode 100644 index 000000000..e9a45c24f --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0001-tools-lesspipe-Allow-generic-shell.patch @@ -0,0 +1,24 @@ +From 03127fd5a6eff5ae2ebea2e9c6c01fbf1a0a421a Mon Sep 17 00:00:00 2001 +From: Ankit Navik +Date: Tue, 25 Dec 2018 14:34:09 +0530 +Subject: [PATCH] tools/lesspipe: Allow generic shell + +Upstream-Status: Submitted [https://github.com/KhronosGroup/SPIRV-Tools/pull/2255] +Signed-off-by: Ankit Navik +--- + tools/lesspipe/spirv-lesspipe.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/lesspipe/spirv-lesspipe.sh b/tools/lesspipe/spirv-lesspipe.sh +index 81e3355..f955259 100644 +--- a/tools/lesspipe/spirv-lesspipe.sh ++++ b/tools/lesspipe/spirv-lesspipe.sh +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/usr/bin/env sh + # Copyright (c) 2016 The Khronos Group Inc. + + # Licensed under the Apache License, Version 2.0 (the "License"); +-- +2.7.4 + diff --git a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0002-spirv-lesspipe.sh-allow-using-generic-shells.patch b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0002-spirv-lesspipe.sh-allow-using-generic-shells.patch deleted file mode 100644 index 2918e4ef5..000000000 --- a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools/0002-spirv-lesspipe.sh-allow-using-generic-shells.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 93a770330aa21c91a9b7fce798b73d31cad8f16a Mon Sep 17 00:00:00 2001 -From: Awais Belal -Date: Tue, 25 Oct 2016 16:12:08 +0500 -Subject: [PATCH] spirv-lesspipe.sh: allow using generic shells - -The script is harmless for any type of shell and -shouldn't be tied with bash to allow catering -more possibilities. - -Signed-off-by: Awais Belal ---- - tools/lesspipe/spirv-lesspipe.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: git/tools/lesspipe/spirv-lesspipe.sh -=================================================================== ---- git.orig/tools/lesspipe/spirv-lesspipe.sh 2018-05-01 13:37:34.294579393 -0500 -+++ git/tools/lesspipe/spirv-lesspipe.sh 2018-05-01 13:38:35.000000000 -0500 -@@ -1,4 +1,4 @@ --#!/bin/bash -+#!/bin/sh - # Copyright (c) 2016 The Khronos Group Inc. - - # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools_git.bb b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools_git.bb index 8859b3400..9c1c69c5c 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/spirv-tools_git.bb +++ b/meta-digi-dey/recipes-graphics/vulkan/spirv-tools_git.bb @@ -1,32 +1,25 @@ -SUMMARY = "SPIR-V Tools" -DESCRIPTION = "SPIR-V is a binary intermediate language for representing \ - graphical-shader stages and compute kernels for multiple \ - Khronos APIs, such as OpenCL, OpenGL, and Vulkan." +SUMMARY = "The SPIR-V Tools project provides an API and commands for \ +processing SPIR-V modules" +DESCRIPTION = "The project includes an assembler, binary module parser, \ +disassembler, validator, and optimizer for SPIR-V." +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" SECTION = "graphics" -HOMEPAGE = "https://www.khronos.org/registry/spir-v" + +S = "${WORKDIR}/git" +DEST_DIR = "${S}/external" +SRC_URI = "git://github.com/KhronosGroup/SPIRV-Tools.git;name=spirv-tools \ + git://github.com/KhronosGroup/SPIRV-Headers.git;name=spirv-headers;destsuffix=${DEST_DIR}/spirv-headers \ +" +SRCREV_spirv-tools = "9b3cc3e05337358d0bd9fec1b7a51e3cbf55312b" +SRCREV_spirv-headers = "38cafab379e5d16137cb97a485b9385191039b92" inherit cmake python3native -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" - -S = "${WORKDIR}/git" -SPIRV_HEADERS_LOCATION = "${S}/external/spirv-headers" -HEADERS_VERSION = "unified1" - -SRCREV_spirv-tools = "9d699f6d4038f432c55310d5d0b4a6d507c1b686" -SRCREV_spirv-headers = "2434b89345a50c018c84f42a310b0fad4f3fd94f" -SRC_URI = "git://github.com/KhronosGroup/SPIRV-Tools;protocol=http;name=spirv-tools \ - git://github.com/KhronosGroup/SPIRV-Headers;name=spirv-headers;destsuffix=${SPIRV_HEADERS_LOCATION} \ - file://0002-spirv-lesspipe.sh-allow-using-generic-shells.patch" - do_install_append() { - if test -d ${SPIRV_HEADERS_LOCATION}/include/spirv/${HEADERS_VERSION}; then - install -d ${D}/${includedir}/SPIRV - install -m 0644 ${SPIRV_HEADERS_LOCATION}/include/spirv/${HEADERS_VERSION}/* ${D}/${includedir}/SPIRV - fi + install -d ${D}/${includedir}/SPIRV + install -m 0644 ${DEST_DIR}/spirv-headers/include/spirv/unified1/* ${D}/${includedir}/SPIRV } FILES_SOLIBSDEV = "" -FILES_${PN} += "${libdir}/libSPIRV*" -INSANE_SKIP_${PN} = "dev-so" +FILES_${PN} += "${libdir}/*.so" diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Don-t-build-demos-with-questionably-licensed-data.patch b/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Don-t-build-demos-with-questionably-licensed-data.patch deleted file mode 100644 index d32c8f280..000000000 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Don-t-build-demos-with-questionably-licensed-data.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 55770fb07c42fe410cf8d09f8f5976babc89b9ef Mon Sep 17 00:00:00 2001 -From: Jussi Kukkonen -Date: Tue, 4 Jul 2017 17:13:45 +0300 -Subject: [PATCH] Don't build demos with questionably licensed data - -Some of the models don't have open source compatible licenses: -don't build demos using those. Also don't build demos that need -resources that are not included. - -ssao: -scenerendering: - Sibenik model, no license found - -deferred: -deferredmultisampling: -deferredshadows: - armor model, CC-BY-3.0 - -vulkanscene: -imgui: -shadowmapping: - vulkanscene model, no license found - -indirectdraw: - plant model, no license found - -hdr: -pbribl: -pbrtexture: - Require external Vulkan Asset Pack - -Upstream-Status: Inappropriate [configuration] -Signed-off-by: Jussi Kukkonen ---- - CMakeLists.txt | 13 ------------- - 1 file changed, 13 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 4958fff..0f9d3e4 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -150,17 +150,11 @@ set(EXAMPLES - computeparticles - computeshader - debugmarker -- deferred -- deferredmultisampling -- deferredshadows - displacement - distancefieldfonts - dynamicuniformbuffer - gears - geometryshader -- hdr -- imgui -- indirectdraw - instancing - mesh - multisampling -@@ -170,20 +164,14 @@ set(EXAMPLES - parallaxmapping - particlefire - pbrbasic -- pbribl -- pbrtexture - pipelines - pushconstants - radialblur - raytracing -- scenerendering - screenshot -- shadowmapping -- shadowmappingomni - skeletalanimation - specializationconstants - sphericalenvmapping -- ssao - subpasses - terraintessellation - tessellation -@@ -196,7 +184,6 @@ set(EXAMPLES - texturesparseresidency - triangle - viewportarray -- vulkanscene - ) - - buildExamples() --- -2.13.2 - diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Fix-build-on-x86.patch b/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Fix-build-on-x86.patch deleted file mode 100644 index 681b3422d..000000000 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Fix-build-on-x86.patch +++ /dev/null @@ -1,41 +0,0 @@ -From b0495efb6c3ea3a530fcbaddac86da57ecce5a66 Mon Sep 17 00:00:00 2001 -From: Jussi Kukkonen -Date: Mon, 10 Jul 2017 13:11:12 +0300 -Subject: [PATCH] Fix build on x86 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -| func_common.inl:193:51: error: wrong number of template arguments -| (5, should be 6) struct compute_sign - -The fix is backported from the upstream glm project. - -Upstream-Status: Pending [https://github.com/SaschaWillems/Vulkan/issues/356] -Signed-off-by: Jussi Kukkonen ---- - external/glm/glm/detail/func_common.inl | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/external/glm/glm/detail/func_common.inl b/external/glm/glm/detail/func_common.inl -index cafaed5..2dd94e1 100644 ---- a/external/glm/glm/detail/func_common.inl -+++ b/external/glm/glm/detail/func_common.inl -@@ -190,12 +190,12 @@ namespace detail - - # if GLM_ARCH == GLM_ARCH_X86 - template class vecType, bool Aligned> -- struct compute_sign -+ struct compute_sign - { - GLM_FUNC_QUALIFIER static vecType call(vecType const & x) - { - T const Shift(static_cast(sizeof(T) * 8 - 1)); -- vecType const y(vecType::type, P>(-x) >> typename make_unsigned::type(Shift)); -+ vecType const y(vecType::type, P>(-x) >> typename make_unsigned::type(Shift)); - - return (x >> Shift) | y; - } --- -2.1.4 - diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Support-installing-demos-support-out-of-tree-builds.patch b/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Support-installing-demos-support-out-of-tree-builds.patch deleted file mode 100644 index 4addea3bf..000000000 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos/0001-Support-installing-demos-support-out-of-tree-builds.patch +++ /dev/null @@ -1,85 +0,0 @@ -From edca667684764cfcc0460e448e834fadf623a887 Mon Sep 17 00:00:00 2001 -From: Jussi Kukkonen -Date: Mon, 3 Jul 2017 14:49:18 +0300 -Subject: [PATCH] Support installing demos, support out-of-tree builds - -This is especially useful for cross-compile situation where testing -happens on target. - --DRESOURCE_INSTALL_DIR= decides where data is installed (and -where the binaries will load the data from): if it's left empty, -then nothing will be installed and binaries will load the data from -CMAKE_SOURCE_DIR. - -Binaries are now correctly built in CMAKE_BINARY_DIR. - -Upstream-Status: Submitted [https://github.com/SaschaWillems/Vulkan/pull/352] -Signed-off-by: Jussi Kukkonen ---- - CMakeLists.txt | 15 ++++++++++++++- - base/vulkanexamplebase.cpp | 2 +- - 2 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index b9886bc..4958fff 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -16,6 +16,8 @@ include_directories(base) - OPTION(USE_D2D_WSI "Build the project using Direct to Display swapchain" OFF) - OPTION(USE_WAYLAND_WSI "Build the project using Wayland swapchain" OFF) - -+set(RESOURCE_INSTALL_DIR "" CACHE PATH "Path to install resources to (leave empty for running uninstalled)") -+ - # Use FindVulkan module added with CMAKE 3.7 - if (NOT CMAKE_VERSION VERSION_LESS 3.7.0) - message(STATUS "Using module to find Vulkan") -@@ -108,6 +110,10 @@ function(buildExample EXAMPLE_NAME) - add_executable(${EXAMPLE_NAME} ${MAIN_CPP} ${SOURCE} ${SHADERS}) - target_link_libraries(${EXAMPLE_NAME} ${Vulkan_LIBRARY} ${ASSIMP_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - endif(WIN32) -+ -+ if(RESOURCE_INSTALL_DIR) -+ install(TARGETS ${EXAMPLE_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) -+ endif() - endfunction(buildExample) - - # Build all examples -@@ -117,6 +123,13 @@ function(buildExamples) - endforeach(EXAMPLE) - endfunction(buildExamples) - -+if(RESOURCE_INSTALL_DIR) -+ add_definitions(-DVK_EXAMPLE_DATA_DIR=\"${RESOURCE_INSTALL_DIR}/\") -+ install(DIRECTORY data/ DESTINATION ${RESOURCE_INSTALL_DIR}/) -+else() -+ add_definitions(-DVK_EXAMPLE_DATA_DIR=\"${CMAKE_SOURCE_DIR}/data/\") -+endif() -+ - # Compiler specific stuff - IF(MSVC) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") -@@ -128,7 +141,7 @@ ELSE(WIN32) - link_libraries(${XCB_LIBRARIES} ${Vulkan_LIBRARY}) - ENDIF(WIN32) - --set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/") -+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/") - - set(EXAMPLES - bloom -diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp -index 647368a..a0f28a5 100644 ---- a/base/vulkanexamplebase.cpp -+++ b/base/vulkanexamplebase.cpp -@@ -84,7 +84,7 @@ const std::string VulkanExampleBase::getAssetPath() - #if defined(__ANDROID__) - return ""; - #else -- return "./../data/"; -+ return VK_EXAMPLE_DATA_DIR; - #endif - } - #endif --- -2.13.2 - diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos_%.bbappend b/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos_%.bbappend index 11cd87903..a11dfbd09 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos_%.bbappend +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-demos_%.bbappend @@ -1,20 +1,3 @@ -# Copyright (C) 2020 Digi International - -# Use the sources in poky's sumo recipe -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=dcf473723faabf17baa9b5f2207599d0 \ - file://triangle/triangle.cpp;endline=12;md5=bccd1bf9cadd9e10086cf7872157e4fa" - -SRC_URI = "git://github.com/SaschaWillems/Vulkan.git \ - file://0001-Support-installing-demos-support-out-of-tree-builds.patch \ - file://0001-Don-t-build-demos-with-questionably-licensed-data.patch \ - file://0001-Fix-build-on-x86.patch \ -" -SRCREV = "18df00c7b4677b0889486e16977857aa987947e2" DEPENDS_remove = "vulkan" DEPENDS_append = " vulkan-headers vulkan-loader" - -# The vulkan-validationlayers package is necessary for the demos to work -RDEPENDS_${PN} = "vulkan-validationlayers" - diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.92.0.bb b/meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.121.bb similarity index 90% rename from meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.92.0.bb rename to meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.121.bb index 172526d59..225ff3939 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.92.0.bb +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-headers_1.1.121.bb @@ -5,9 +5,9 @@ HOMEPAGE = "https://www.khronos.org/vulkan/" LICENSE = "Apache-2.0" LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57" -SRC_URI = "git://github.com/KhronosGroup/Vulkan-Headers.git;branch=sdk-1.1.92 \ +SRC_URI = "git://github.com/KhronosGroup/Vulkan-Headers.git;branch=sdk-1.1.121 \ " -SRCREV = "114c3546e195819bd53a34b39f5194b2989a5b12" +SRCREV = "5671d014bc1792a116d374792f8a6cfba2e6f512" UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P\d+(\.\d+)+)" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.121.bb b/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.121.bb new file mode 100644 index 000000000..0f00f1e9b --- /dev/null +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.121.bb @@ -0,0 +1,32 @@ +SUMMARY = "3D graphics and compute API common loader" +DESCRIPTION = "Vulkan is a new generation graphics and compute API \ +that provides efficient access to modern GPUs. These packages \ +provide only the common vendor-agnostic library loader, headers and \ +the vulkaninfo utility." +HOMEPAGE = "https://www.khronos.org/vulkan/" +BUGTRACKER = "https://github.com/KhronosGroup/Vulkan-Loader" +SECTION = "libs" + +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7dbefed23242760aa3475ee42801c5ac" +SRC_URI = "git://github.com/KhronosGroup/Vulkan-Loader.git;branch=sdk-${PV}" +SRCREV = "a34eada3197b96e46bea3ad4b83bfa4b4396e2ea" + +S = "${WORKDIR}/git" + +REQUIRED_DISTRO_FEATURES = "vulkan" + +inherit cmake distro_features_check python3native lib_package +ANY_OF_DISTRO_FEATURES = "x11 wayland" + +DEPENDS += "vulkan-headers" + +EXTRA_OECMAKE = "-DBUILD_TESTS=OFF" + +# must choose x11 or wayland or both +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'wayland x11', d)}" + +PACKAGECONFIG[x11] = "-DBUILD_WSI_XLIB_SUPPORT=ON -DBUILD_WSI_XCB_SUPPORT=ON -DDEMOS_WSI_SELECTION=XCB, -DBUILD_WSI_XLIB_SUPPORT=OFF -DBUILD_WSI_XCB_SUPPORT=OFF -DDEMOS_WSI_SELECTION=WAYLAND, libxcb libx11 libxrandr" +PACKAGECONFIG[wayland] = "-DBUILD_WSI_WAYLAND_SUPPORT=ON, -DBUILD_WSI_WAYLAND_SUPPORT=OFF, wayland" + +UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P\d+(\.\d+)+)" diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_%.bbappend b/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.121.bbappend similarity index 100% rename from meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_%.bbappend rename to meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.121.bbappend diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.92.0.bb b/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.92.0.bb deleted file mode 100644 index 61789543e..000000000 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-loader_1.1.92.0.bb +++ /dev/null @@ -1,34 +0,0 @@ -SUMMARY = "Vulkan loader" -DESCRIPTION = "Vulkan loader is responsible for working with the various \ -layers as well as supporting multiple GPUs and their drivers.The loader is \ -critical to managing the proper dispatching of Vulkan functions to the appropriate \ -set of layers and ICDs." -HOMEPAGE = "https://www.khronos.org/vulkan/" -BUGTRACKER = "https://github.com/KhronosGroup/Vulkan-Loader" -SECTION = "libs" - -LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57\ - file://loader/loader.c;endline=25;md5=151b392f46568aaedb4ad22b246237ec" -SRC_URI = "git://github.com/KhronosGroup/Vulkan-Loader.git;branch=sdk-1.1.92 \ - " -SRCREV = "4cd7e44fc1ca6c4d8361720b43a3588ddf9fc4b6" -UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P\d+(\.\d+)+)" - -S = "${WORKDIR}/git" - -REQUIRED_DISTRO_FEATURES = "vulkan" - -inherit cmake python3native lib_package distro_features_check -ANY_OF_DISTRO_FEATURES = "x11 wayland" - -DEPENDS = "vulkan-headers" - -EXTRA_OECMAKE = "-DBUILD_TESTS=OFF" - -# must choose x11 or wayland or both -PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '' ,d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '' ,d)}" - -PACKAGECONFIG[x11] = "-DBUILD_WSI_XLIB_SUPPORT=ON -DBUILD_WSI_XCB_SUPPORT=ON -DDEMOS_WSI_SELECTION=XCB, -DBUILD_WSI_XLIB_SUPPORT=OFF -DBUILD_WSI_XCB_SUPPORT=OFF -DDEMOS_WSI_SELECTION=WAYLAND, libxcb libx11 libxrandr" -PACKAGECONFIG[wayland] = "-DBUILD_WSI_WAYLAND_SUPPORT=ON, -DBUILD_WSI_WAYLAND_SUPPORT=OFF, wayland" diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.92.bb b/meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.121.bb similarity index 95% rename from meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.92.bb rename to meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.121.bb index abfec91e7..2baa30b90 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.92.bb +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-tools_1.1.121.bb @@ -14,7 +14,7 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57" S = "${WORKDIR}/git" -SRCREV = "9bbdd552f0fd62741aa1f1e02ab3eafc45cf3c1e" +SRCREV = "ea8f6f0a3cdfc79bddf3566bf3f4b8350436695b" SRC_URI = "git://github.com/KhronosGroup/Vulkan-Tools.git;branch=sdk-${PV} \ " # must choose x11 or wayland or both diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/0001-CMakeLists.txt-Change-the-installation-path-of-JSON-.patch b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/0001-CMakeLists.txt-Change-the-installation-path-of-JSON-.patch index 9b06c3227..ce6fe91bf 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/0001-CMakeLists.txt-Change-the-installation-path-of-JSON-.patch +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/0001-CMakeLists.txt-Change-the-installation-path-of-JSON-.patch @@ -1,38 +1,39 @@ -From 23ed27a79b3c9afa3dcb2138abf89f466a308702 Mon Sep 17 00:00:00 2001 +From 1f2837e05ed090ec553a3fc4fccee5618cf26d12 Mon Sep 17 00:00:00 2001 From: Neena Busireddy -Date: Wed, 5 Dec 2018 13:33:10 -0600 +Date: Thu, 8 Aug 2019 11:27:01 -0500 Subject: [PATCH] CMakeLists.txt: Change the installation path of JSON files Also modify the library path in JSON files to /usr/lib/libVK*.so Upstream-Status: Inappropriate [configuration] + Signed-off-by: Neena Busireddy --- layers/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt -index 5fd5b44..c4a7810 100644 +index 5541816..579c8b8 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt -@@ -105,7 +105,7 @@ if(WIN32) - elseif(UNIX) # UNIX includes APPLE - foreach(TARGET_NAME ${TARGET_NAMES}) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${TARGET_NAME}.json -- DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/vulkan/explicit_layer.d) -+ DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/vulkan/explicit_layer.d) - endforeach() +@@ -98,7 +98,7 @@ if(BUILD_LAYERS) + elseif(UNIX) # UNIX includes APPLE + foreach(TARGET_NAME ${TARGET_NAMES}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/staging-json/${TARGET_NAME}.json +- DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/vulkan/explicit_layer.d) ++ DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/vulkan/explicit_layer.d) + endforeach() + endif() endif() - -@@ -236,7 +236,7 @@ if(UNIX) - -DVK_VERSION=1.1.${vk_header_version}) - # If this json file is not a metalayer, get the needed properties from that target - if(TARGET ${TARGET_NAME}) -- set(INSTALL_DEFINES ${INSTALL_DEFINES} -DRELATIVE_LAYER_BINARY="$") -+ set(INSTALL_DEFINES ${INSTALL_DEFINES} -DRELATIVE_LAYER_BINARY="${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/$") - endif() - add_custom_target(${TARGET_NAME}-staging-json ALL - COMMAND ${CMAKE_COMMAND} ${INSTALL_DEFINES} -P "${CMAKE_CURRENT_BINARY_DIR}/generator.cmake") +@@ -256,7 +256,7 @@ if(BUILD_LAYERS) + -DVK_VERSION=1.1.${vk_header_version}) + # If this json file is not a metalayer, get the needed properties from that target + if(TARGET ${TARGET_NAME}) +- set(INSTALL_DEFINES ${INSTALL_DEFINES} -DRELATIVE_LAYER_BINARY="$") ++ set(INSTALL_DEFINES ${INSTALL_DEFINES} -DRELATIVE_LAYER_BINARY="${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/$") + endif() + add_custom_target(${TARGET_NAME}-staging-json ALL + COMMAND ${CMAKE_COMMAND} ${INSTALL_DEFINES} -P "${CMAKE_CURRENT_BINARY_DIR}/generator.cmake") -- 2.7.4 diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/icd_VSI.json b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/icd_VSI.json index 4324c71a5..05a8b23a6 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/icd_VSI.json +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers/icd_VSI.json @@ -1,7 +1,7 @@ { "file_format_version": "1.0.0", "ICD": { - "library_path": "/usr/lib/vulkan/libvulkan_VSI.so", - "api_version": "1.0.30" + "library_path": "/usr/lib/libvulkan_VSI.so", + "api_version": "1.1.82" } } diff --git a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.92.0.bb b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.121.bb similarity index 91% rename from meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.92.0.bb rename to meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.121.bb index e61cdd9f0..296b73285 100644 --- a/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.92.0.bb +++ b/meta-digi-dey/recipes-graphics/vulkan/vulkan-validationlayers_1.1.121.bb @@ -7,10 +7,10 @@ BUGTRACKER = "https://github.com/KhronosGroup/Vulkan-ValidationLayers" SECTION = "libs" LICENSE = "Apache-2.0" -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=3b83ef96387f14655fc854ddc3c6bd57" +LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=7dbefed23242760aa3475ee42801c5ac" SRC_URI = "git://github.com/KhronosGroup/Vulkan-ValidationLayers.git;nobranch=1 \ " -SRCREV = "6e6da6ccab8931f7c30815966ef839b1155e5bec" +SRCREV = "88fcbab512e449203649d984317ff7b9a9f80b9d" UPSTREAM_CHECK_GITTAGREGEX = "sdk-(?P\d+(\.\d+)+)" S = "${WORKDIR}/git"