diff --git a/ports/yubico-piv-tool/patches/fix-build-system.patch b/ports/yubico-piv-tool/patches/fix-build-system.patch new file mode 100644 index 0000000000..def12ff717 --- /dev/null +++ b/ports/yubico-piv-tool/patches/fix-build-system.patch @@ -0,0 +1,111 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -63,10 +63,12 @@ + endif() + + if(MSVC) +- if((NOT GETOPT_LIB_DIR) OR (NOT GETOPT_INCLUDE_DIR)) +- message(FATAL_ERROR "please provide definitions for " +- "GETOPT_LIB_DIR and GETOPT_INCLUDE_DIR when building " +- "under msvc") ++ if(NOT BUILD_ONLY_LIB) ++ if((NOT GETOPT_LIB_DIR) OR (NOT GETOPT_INCLUDE_DIR)) ++ message(FATAL_ERROR "please provide definitions for " ++ "GETOPT_LIB_DIR and GETOPT_INCLUDE_DIR when building " ++ "under msvc") ++ endif() + endif() + if(SUPRESS_MSVC_WARNINGS) + set(MSVC_DISABLED_WARNINGS_LIST +@@ -93,7 +95,7 @@ + else() + find_package (PkgConfig REQUIRED) + +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror") ++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-braces") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat -Wformat-security") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow -Wpointer-arith") +diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt +--- a/lib/CMakeLists.txt ++++ b/lib/CMakeLists.txt +@@ -79,38 +79,43 @@ + endif(BUILD_STATIC_LIB) + + # dynamic library +-add_library(ykpiv_shared SHARED ${SOURCE}) +-target_link_libraries(ykpiv_shared ${LIBCRYPTO_LIBRARIES} ${PCSC_LIBRARIES} ${ZLIB_LIBS} ${ADDITIONAL_LIBRARY}) +-set_target_properties(ykpiv_shared PROPERTIES SOVERSION ${SO_VERSION} VERSION ${VERSION}) +-if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") +- set_target_properties(ykpiv_shared PROPERTIES INSTALL_RPATH "${YKPIV_INSTALL_LIB_DIR}") +-endif() +-if(WIN32) +- set_target_properties(ykpiv_shared PROPERTIES OUTPUT_NAME libykpiv) +-else(WIN32) +- set_target_properties(ykpiv_shared PROPERTIES OUTPUT_NAME ykpiv) +-endif(WIN32) +-add_coverage(ykpiv_shared) ++if(NOT BUILD_STATIC_LIB) ++ add_library(ykpiv_shared SHARED ${SOURCE}) ++ target_link_libraries(ykpiv_shared ${LIBCRYPTO_LIBRARIES} ${PCSC_LIBRARIES} ${ZLIB_LIBS} ${ADDITIONAL_LIBRARY}) ++ set_target_properties(ykpiv_shared PROPERTIES SOVERSION ${SO_VERSION} VERSION ${VERSION}) ++ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ++ set_target_properties(ykpiv_shared PROPERTIES INSTALL_RPATH "${YKPIV_INSTALL_LIB_DIR}") ++ endif() ++ if(WIN32) ++ set_target_properties(ykpiv_shared PROPERTIES OUTPUT_NAME libykpiv) ++ else(WIN32) ++ set_target_properties(ykpiv_shared PROPERTIES OUTPUT_NAME ykpiv) ++ endif(WIN32) ++ add_coverage(ykpiv_shared) ++endif() + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ykpiv.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/ykpiv.pc @ONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ykpiv-config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/ykpiv-config.h @ONLY) + +-install( +- TARGETS ykpiv_shared +- ARCHIVE DESTINATION ${YKPIV_INSTALL_LIB_DIR} +- LIBRARY DESTINATION ${YKPIV_INSTALL_LIB_DIR} +- RUNTIME DESTINATION ${YKPIV_INSTALL_BIN_DIR}) +-if(BUILD_STATIC_LIB) +- install( ++if(NOT BUILD_STATIC_LIB) ++ install( ++ TARGETS ykpiv_shared ++ ARCHIVE DESTINATION ${YKPIV_INSTALL_LIB_DIR} ++ LIBRARY DESTINATION ${YKPIV_INSTALL_LIB_DIR} ++ RUNTIME DESTINATION ${YKPIV_INSTALL_BIN_DIR}) ++else() ++ install( + TARGETS ykpiv + ARCHIVE DESTINATION ${YKPIV_INSTALL_LIB_DIR} + LIBRARY DESTINATION ${YKPIV_INSTALL_LIB_DIR} + RUNTIME DESTINATION ${YKPIV_INSTALL_BIN_DIR}) +-endif(BUILD_STATIC_LIB) ++endif() + + install(FILES ykpiv.h DESTINATION ${YKPIV_INSTALL_INC_DIR}/ykpiv) + install(FILES ykpiv-config.h DESTINATION ${YKPIV_INSTALL_INC_DIR}/ykpiv) + + install(FILES ykpiv.pc DESTINATION ${YKPIV_INSTALL_PKGCONFIG_DIR}) + +-add_subdirectory(tests) ++if(NOT DEFINED SKIP_TESTS) ++ add_subdirectory(tests) ++endif() +diff --git a/lib/ykpiv.pc.in b/lib/ykpiv.pc.in +--- a/lib/ykpiv.pc.in ++++ b/lib/ykpiv.pc.in +@@ -26,8 +26,8 @@ + + prefix=@CMAKE_INSTALL_PREFIX@ + exec_prefix=@CMAKE_INSTALL_PREFIX@ +-libdir=@YKPIV_INSTALL_LIB_DIR@ +-includedir=@YKPIV_INSTALL_INC_DIR@ ++libdir=${prefix}/@YKPIV_INSTALL_LIB_DIR@ ++includedir=${prefix}/@YKPIV_INSTALL_INC_DIR@ + + Name: @CMAKE_PROJECT_NAME@ + Description: Yubico PIV C Library diff --git a/ports/yubico-piv-tool/portfile.cmake b/ports/yubico-piv-tool/portfile.cmake new file mode 100644 index 0000000000..313e52e009 --- /dev/null +++ b/ports/yubico-piv-tool/portfile.cmake @@ -0,0 +1,51 @@ +vcpkg_download_distfile(ARCHIVE + URLS "https://developers.yubico.com/yubico-piv-tool/Releases/yubico-piv-tool-${VERSION}.tar.gz" + FILENAME "yubico-piv-tool-${VERSION}.tar.gz" + SHA512 2bac8a875c7c5c3d1e5e8ec84fc70b37fc5b08985ef7ef96f6a9eaf5be882eeb9b1dbfb6cc0d6f5c00586f625cefa38c2d34d0e5aef5164be7274162af3554b8 +) + +vcpkg_extract_source_archive(SOURCE_PATH + ARCHIVE "${ARCHIVE}" + PATCHES + patches/fix-build-system.patch +) + +# Map vcpkg linkage to upstream's BUILD_STATIC_LIB option +string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" YKPIV_BUILD_STATIC) + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + DISABLE_PARALLEL_CONFIGURE + OPTIONS + -DBUILD_ONLY_LIB=ON + -DBUILD_STATIC_LIB=${YKPIV_BUILD_STATIC} + -DSKIP_TESTS=1 + -DENABLE_HARDWARE_TESTS=OFF + -DGENERATE_MAN_PAGES=OFF + -DENABLE_COVERAGE=OFF + -DENABLE_CERT_COMPRESS=ON + -DYKPIV_INSTALL_LIB_DIR=lib + -DYKPIV_INSTALL_INC_DIR=include + -DYKPIV_INSTALL_BIN_DIR=bin + -DYKPIV_INSTALL_PKGCONFIG_DIR=lib/pkgconfig + MAYBE_UNUSED_VARIABLES + SKIP_TESTS # Not consumed when BUILD_ONLY_LIB is ON +) + +vcpkg_cmake_install() +vcpkg_copy_pdbs() +vcpkg_fixup_pkgconfig() + +# Remove duplicate/unnecessary dirs from debug +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share") + +# Install unofficial CMake config +file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/unofficial-libykpiv-config.cmake" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/unofficial-libykpiv") + +# Install usage instructions +file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/COPYING") diff --git a/ports/yubico-piv-tool/unofficial-libykpiv-config.cmake b/ports/yubico-piv-tool/unofficial-libykpiv-config.cmake new file mode 100644 index 0000000000..35a8ea862e --- /dev/null +++ b/ports/yubico-piv-tool/unofficial-libykpiv-config.cmake @@ -0,0 +1,54 @@ +include(CMakeFindDependencyMacro) + +find_dependency(OpenSSL) +find_dependency(ZLIB) + +if(NOT TARGET unofficial::libykpiv::ykpiv) + add_library(unofficial::libykpiv::ykpiv UNKNOWN IMPORTED) + + find_library(_unofficial_ykpiv_library_release + NAMES ykpiv ykpiv_static libykpiv + PATHS "${CMAKE_CURRENT_LIST_DIR}/../../lib" + NO_DEFAULT_PATH + ) + find_library(_unofficial_ykpiv_library_debug + NAMES ykpiv ykpiv_static libykpiv + PATHS "${CMAKE_CURRENT_LIST_DIR}/../../debug/lib" + NO_DEFAULT_PATH + ) + + # Transitive dependencies + set(_ykpiv_link_libs OpenSSL::Crypto ZLIB::ZLIB) + if(WIN32) + list(APPEND _ykpiv_link_libs winscard ws2_32) + elseif(APPLE) + list(APPEND _ykpiv_link_libs "-framework PCSC") + else() + find_library(_unofficial_ykpiv_pcsclite pcsclite) + if(NOT _unofficial_ykpiv_pcsclite) + message(FATAL_ERROR "libpcsclite not found.") + endif() + list(APPEND _ykpiv_link_libs ${_unofficial_ykpiv_pcsclite}) + endif() + + set_target_properties(unofficial::libykpiv::ykpiv PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/../../include" + INTERFACE_LINK_LIBRARIES "${_ykpiv_link_libs}" + ) + + if(_unofficial_ykpiv_library_release) + set_property(TARGET unofficial::libykpiv::ykpiv APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties(unofficial::libykpiv::ykpiv PROPERTIES + IMPORTED_LOCATION_RELEASE "${_unofficial_ykpiv_library_release}" + ) + endif() + + if(_unofficial_ykpiv_library_debug) + set_property(TARGET unofficial::libykpiv::ykpiv APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties(unofficial::libykpiv::ykpiv PROPERTIES + IMPORTED_LOCATION_DEBUG "${_unofficial_ykpiv_library_debug}" + ) + endif() + + unset(_ykpiv_link_libs) +endif() diff --git a/ports/yubico-piv-tool/usage b/ports/yubico-piv-tool/usage new file mode 100644 index 0000000000..73dc9a287a --- /dev/null +++ b/ports/yubico-piv-tool/usage @@ -0,0 +1,9 @@ +yubico-piv-tool provides CMake targets: + + find_package(unofficial-libykpiv CONFIG REQUIRED) + target_link_libraries(main PRIVATE unofficial::libykpiv::ykpiv) + +yubico-piv-tool provides pkg-config modules: + + # Yubico PIV C Library + ykpiv diff --git a/ports/yubico-piv-tool/vcpkg.json b/ports/yubico-piv-tool/vcpkg.json new file mode 100644 index 0000000000..094b15c63d --- /dev/null +++ b/ports/yubico-piv-tool/vcpkg.json @@ -0,0 +1,16 @@ +{ + "name": "yubico-piv-tool", + "version": "2.7.3", + "description": "YubiKey PIV library (libykpiv) for interacting with the PIV application on a YubiKey", + "homepage": "https://github.com/Yubico/yubico-piv-tool", + "license": "BSD-2-Clause", + "supports": "!android & !ios", + "dependencies": [ + "openssl", + { + "name": "vcpkg-cmake", + "host": true + }, + "zlib" + ] +} diff --git a/scripts/ci.baseline.txt b/scripts/ci.baseline.txt index 76d25c10df..91a1b1246e 100644 --- a/scripts/ci.baseline.txt +++ b/scripts/ci.baseline.txt @@ -716,6 +716,8 @@ xbitmaps:x64-android=fail xbitmaps:x64-linux=fail xdigest:arm64-linux=fail yara:arm64-linux=fail +yubico-piv-tool:arm64-linux=fail # requires system libpcsclite-dev +yubico-piv-tool:x64-linux=fail # requires system libpcsclite-dev z3:arm64-linux=fail zeroc-ice:arm-neon-android=fail zeroc-ice:arm64-android=fail diff --git a/scripts/ci.feature.baseline.txt b/scripts/ci.feature.baseline.txt index 833cacea9e..f3aba75bad 100644 --- a/scripts/ci.feature.baseline.txt +++ b/scripts/ci.feature.baseline.txt @@ -1541,6 +1541,8 @@ xdigest:arm64-linux=fail xerces-c[xmlch-wchar](!windows)=feature-fails # wchar_t must be 16 bit and not 32 yara:arm64-linux=fail yoctolib:arm64-linux=cascade +yubico-piv-tool:arm64-linux=fail # requires system libpcsclite-dev +yubico-piv-tool:x64-linux=fail # requires system libpcsclite-dev z3:arm64-linux=fail zeroc-ice:arm64-linux=fail zeroc-ice[icediscovery]:x64-windows-static-md=cascade diff --git a/versions/baseline.json b/versions/baseline.json index a2ec1d1322..b3e3d7bc65 100644 --- a/versions/baseline.json +++ b/versions/baseline.json @@ -11020,6 +11020,10 @@ "baseline": "1.6.0", "port-version": 0 }, + "yubico-piv-tool": { + "baseline": "2.7.3", + "port-version": 0 + }, "yyjson": { "baseline": "0.12.0", "port-version": 0 diff --git a/versions/y-/yubico-piv-tool.json b/versions/y-/yubico-piv-tool.json new file mode 100644 index 0000000000..cddc2ab4a0 --- /dev/null +++ b/versions/y-/yubico-piv-tool.json @@ -0,0 +1,9 @@ +{ + "versions": [ + { + "git-tree": "40436deb11b8ddf2267cb5d4633d1853040316b1", + "version": "2.7.3", + "port-version": 0 + } + ] +}