diff options
author | Callum Parsey | 2023-06-26 12:50:02 +0930 |
---|---|---|
committer | Callum Parsey | 2023-06-26 12:50:02 +0930 |
commit | c1200a44e58f8e5df2ae1f0a39d5e0ecd6136bff (patch) | |
tree | e18bce2caee7d840db8384ab0f59a08841ed135b | |
parent | 0081f0f9736e2a080622f2c5ab265d8fef1ce980 (diff) | |
download | aur-c1200a44e58f8e5df2ae1f0a39d5e0ecd6136bff.tar.gz |
Install library in dedicated namespace
Since adding encryption support changes the ABI, it is not feasible to
simply replace the official package's files and require users to
recompile all downstream software.
To work around that, I have modified the build system of this package
to install everything as `QuotientE2EE` instead of `Quotient`. So the
headers are installed to `/usr/include/QuotientE2EE` instead of
`/usr/include/Quotient`, the library itself is installed as
`libQuotientE2EE.so` instead of `libQuotient.so` and the `pkg-config`
and CMake configuration files have been renamed and adjusted
accordingly to allow compilation against this separate library.
As a side-effect of this, it should be possible to have `libquotient`
and `libquotient-encryption` installed at the same time - there are no
conflicting files between these packages now.
The preprocessor macros passed to the compiler are unchanged, as are
the CMake configuration options passed during the build process. At
least in theory, all that needs to change in downstream software is
to make the downstream build system use the `QuotientE2EE` library
instead of `Quotient` and to include headers from the `QuotientE2EE`
system directory instead of `Quotient` - all other variables should be
able to remain unchanged.
The header files are an interesting case, as they expect to be
installed in a directory named `Quotient`. This is something I don't
think I can change in the build system itself without moving the entire
source tree or separating the headers from the source, so I'll probably
have to leave the headers as-is during the build, and then change them
in the `package()` step. All that should need to change in the headers
is replacing instances of `#include <Quotient` with
`#include <QuotientE2EE` - everything else should continue to work.
-rw-r--r-- | PKGBUILD | 43 | ||||
-rw-r--r-- | namespace.patch | 196 |
2 files changed, 226 insertions, 13 deletions
@@ -5,15 +5,39 @@ pkgname=libquotient-encryption pkgver=0.7.2 pkgrel=1 pkgdesc="A Qt library to write cross-platform clients for Matrix (with experimental encryption support)" -arch=(x86_64 aarch64) +arch=("x86_64" "aarch64") url="https://github.com/quotient-im/libQuotient" license=("LGPL2.1") depends=("gcc-libs" "glibc" "libolm" "openssl" "qt5-base" "qt5-multimedia" "qtkeychain-qt5") makedepends=("cmake") -provides=("libquotient" "libQuotient.so=${pkgver%.*}-64") -conflicts=("libquotient") -source=("https://github.com/quotient-im/libQuotient/archive/${pkgver}/${pkgname}-${pkgver}.tar.gz") -sha256sums=("62ff42c8fe321e582ce8943417c1d815ab3f373a26fa0d99a5926e713f6a9382") +provides=("libQuotientE2EE.so=${pkgver%.*}-64") +source=("https://github.com/quotient-im/libQuotient/archive/${pkgver}/${pkgname}-${pkgver}.tar.gz" + "namespace.patch") +sha256sums=("62ff42c8fe321e582ce8943417c1d815ab3f373a26fa0d99a5926e713f6a9382" + "cfb01b1855ac31fdfa614b3802b0cfc9890b92b7a4dade71f5f94f775773a94e") + +prepare() { + # This patch makes the following changes to CMakeLists.txt: + # - Adds a new variable called `${LIBRARY_NAME}` which is currently set + # to `QuotientE2EE`, which will replace `${PROJECT_NAME}` in all cases + # where the name needs to be changed + # - Replaces the name of the library target with `${LIBRARY_NAME}` so that + # the generated shared objects are called `libQuotientE2EE.so*` + # - All references to `${PROJECT_NAME}` which really refer to the library + # target instead of the CMake project as a whole have been changed + # - Changed the output names of the `pkg-config` script and the output + # CMake files (i.e. `QuotientE2EEConfig.cmake`, + # `QuotientE2EETargets.cmake` and so on) + # - Changed the install directories for the config files and headers to use + # `QuotientE2EE` instead of `Quotient` + # - Disable generating files for integration with the Android Native + # Development Kit, as these files have generic names which will conflict + # with the official Arch `libquotient` package + # Also, the template files for the `pkg-config` script (`Quotient.pc.in`) + # and CMake script (`QuotientConfig.cmake.in`) have been adjusted to use + # `${LIBRARY_NAME}` where necessary instead of hard-coding `Quotient`. + patch -Np0 -d . -i namespace.patch +} build() { cmake -B build -S "libQuotient-${pkgver}" \ @@ -28,12 +52,5 @@ build() { package() { DESTDIR="${pkgdir}" cmake --install build - install -Dm 644 "libQuotient-${pkgver}/README.md" "${pkgdir}/usr/share/doc/${pkgname}/README.md" - - # NOTE: There does not seem to be a way to inhibit generating the - # Android Native Development Kit (NDK) build file without patching - # libQuotient's build script. This file has a generic name which - # will conflict with the official `libquotient` package, so it must - # therefore be removed manually. - rm -r "${pkgdir}/usr/share/ndk-modules" + install -Dm644 "libQuotient-${pkgver}/README.md" "${pkgdir}/usr/share/doc/${pkgname}/README.md" } diff --git a/namespace.patch b/namespace.patch new file mode 100644 index 000000000000..948ec7878429 --- /dev/null +++ b/namespace.patch @@ -0,0 +1,196 @@ +diff '--color=auto' -rupN libQuotient-0.7.2.orig/cmake/QuotientConfig.cmake.in libQuotient-0.7.2/cmake/QuotientConfig.cmake.in +--- libQuotient-0.7.2.orig/cmake/QuotientConfig.cmake.in 2023-06-26 10:28:12.392559752 +0930 ++++ libQuotient-0.7.2/cmake/QuotientConfig.cmake.in 2023-06-26 11:28:49.614659917 +0930 +@@ -2,10 +2,10 @@ include(CMakeFindDependencyMacro) + + @FIND_DEPS@ + +-include("${CMAKE_CURRENT_LIST_DIR}/QuotientTargets.cmake") ++include("${CMAKE_CURRENT_LIST_DIR}/@LIBRARY_NAME@Targets.cmake") + + if (NOT QUOTIENT_FORCE_NAMESPACED_INCLUDES) +- get_target_property(_include_dir @PROJECT_NAME@ INTERFACE_INCLUDE_DIRECTORIES) +- list(APPEND _include_dir "${_include_dir}/Quotient") +- set_target_properties(@PROJECT_NAME@ PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_include_dir}") ++ get_target_property(_include_dir @LIBRARY_NAME@ INTERFACE_INCLUDE_DIRECTORIES) ++ list(APPEND _include_dir "${_include_dir}/@LIBRARY_NAME@") ++ set_target_properties(@LIBRARY_NAME@ PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_include_dir}") + endif() +diff '--color=auto' -rupN libQuotient-0.7.2.orig/CMakeLists.txt libQuotient-0.7.2/CMakeLists.txt +--- libQuotient-0.7.2.orig/CMakeLists.txt 2023-06-26 10:28:12.385892873 +0930 ++++ libQuotient-0.7.2/CMakeLists.txt 2023-06-26 11:30:48.835074310 +0930 +@@ -5,6 +5,7 @@ endif() + + set(API_VERSION "0.7") + project(Quotient VERSION "${API_VERSION}.2" LANGUAGES CXX) ++set(LIBRARY_NAME ${PROJECT_NAME}E2EE) + + message(STATUS) + message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION} ==>") +@@ -68,7 +69,7 @@ if (WIN32) + endif() + else() + include(GNUInstallDirs) +- set(CMakeFilesLocation "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") ++ set(CMakeFilesLocation "${CMAKE_INSTALL_LIBDIR}/cmake/${LIBRARY_NAME}") + endif(WIN32) + set(${PROJECT_NAME}_INSTALL_INCLUDEDIR + "${CMAKE_INSTALL_INCLUDEDIR}/" CACHE PATH +@@ -273,24 +274,24 @@ add_compile_options( + -DQT_NO_FOREACH + ) + +-add_library(${PROJECT_NAME} ${lib_SRCS} ${api_ALL_SRCS}) ++add_library(${LIBRARY_NAME} ${lib_SRCS} ${api_ALL_SRCS}) + # Set BUILDING_SHARED_QUOTIENT if building as a shared library +-target_compile_definitions(${PROJECT_NAME} PRIVATE +- $<$<STREQUAL:$<TARGET_PROPERTY:${PROJECT_NAME},TYPE>,SHARED_LIBRARY>:BUILDING_SHARED_QUOTIENT>) ++target_compile_definitions(${LIBRARY_NAME} PRIVATE ++ $<$<STREQUAL:$<TARGET_PROPERTY:${LIBRARY_NAME},TYPE>,SHARED_LIBRARY>:BUILDING_SHARED_QUOTIENT>) + # Set QUOTIENT_STATIC in a static library setting +-target_compile_definitions(${PROJECT_NAME} PUBLIC +- $<$<STREQUAL:$<TARGET_PROPERTY:${PROJECT_NAME},TYPE>,STATIC_LIBRARY>:QUOTIENT_STATIC>) +-target_compile_definitions(${PROJECT_NAME} PRIVATE ++target_compile_definitions(${LIBRARY_NAME} PUBLIC ++ $<$<STREQUAL:$<TARGET_PROPERTY:${LIBRARY_NAME},TYPE>,STATIC_LIBRARY>:QUOTIENT_STATIC>) ++target_compile_definitions(${LIBRARY_NAME} PRIVATE + QT_NO_JAVA_STYLE_ITERATORS QT_NO_URL_CAST_FROM_STRING QT_NO_CAST_TO_ASCII + QT_STRICT_ITERATORS QT_NO_CAST_FROM_BYTEARRAY) + +-target_compile_definitions(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} ++target_compile_definitions(${LIBRARY_NAME} PUBLIC ${PROJECT_NAME}_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} + ${PROJECT_NAME}_VERSION_MINOR=${PROJECT_VERSION_MINOR} ${PROJECT_NAME}_VERSION_PATCH=${PROJECT_VERSION_PATCH} + ${PROJECT_NAME}_VERSION_STRING=\"${PROJECT_VERSION}\") + if (${PROJECT_NAME}_ENABLE_E2EE) +- target_compile_definitions(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_E2EE_ENABLED) ++ target_compile_definitions(${LIBRARY_NAME} PUBLIC ${PROJECT_NAME}_E2EE_ENABLED) + endif() +-set_target_properties(${PROJECT_NAME} PROPERTIES ++set_target_properties(${LIBRARY_NAME} PROPERTIES + CXX_STANDARD 20 + CXX_EXTENSIONS OFF + VISIBILITY_INLINES_HIDDEN ON +@@ -299,33 +300,33 @@ set_target_properties(${PROJECT_NAME} PR + SOVERSION ${API_VERSION} + INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${API_VERSION} + ) +-set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY ++set_property(TARGET ${LIBRARY_NAME} APPEND PROPERTY + COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION) + +-target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) ++target_compile_features(${LIBRARY_NAME} PUBLIC cxx_std_20) + if (MSVC) +- target_compile_options(${PROJECT_NAME} PUBLIC /Zc:preprocessor) ++ target_compile_options(${LIBRARY_NAME} PUBLIC /Zc:preprocessor) + endif() + + # Don't use PCH w/GCC (https://bugzilla.redhat.com/show_bug.cgi?id=1721553#c34) + if (NOT CMAKE_CXX_COMPILER_ID STREQUAL GNU) +- target_precompile_headers(${PROJECT_NAME} PRIVATE Quotient/converters.h) ++ target_precompile_headers(${LIBRARY_NAME} PRIVATE Quotient/converters.h) + endif () + +-target_include_directories(${PROJECT_NAME} PUBLIC ++target_include_directories(${LIBRARY_NAME} PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:$<$<NOT:$<BOOL:${QUOTIENT_FORCE_NAMESPACED_INCLUDES}>>:${CMAKE_CURRENT_SOURCE_DIR}/Quotient>> + $<INSTALL_INTERFACE:${${PROJECT_NAME}_INSTALL_INCLUDEDIR}> + ) + +-target_link_libraries(${PROJECT_NAME} PUBLIC ${Qt}::Core ${Qt}::Network ${Qt}::Gui qt${${Qt}Core_VERSION_MAJOR}keychain) ++target_link_libraries(${LIBRARY_NAME} PUBLIC ${Qt}::Core ${Qt}::Network ${Qt}::Gui qt${${Qt}Core_VERSION_MAJOR}keychain) + if (Qt STREQUAL Qt5) # See #483 +- target_link_libraries(${PROJECT_NAME} PRIVATE ${Qt}::Multimedia) ++ target_link_libraries(${LIBRARY_NAME} PRIVATE ${Qt}::Multimedia) + endif() + set(FIND_DEPS "find_dependency(${Qt}Keychain)") # For QuotientConfig.cmake.in + + if (${PROJECT_NAME}_ENABLE_E2EE) +- target_link_libraries(${PROJECT_NAME} ++ target_link_libraries(${LIBRARY_NAME} + PUBLIC + Olm::Olm + ${Qt}::Sql +@@ -338,7 +339,7 @@ if (${PROJECT_NAME}_ENABLE_E2EE) + find_dependency(${Qt}Sql)") + endif() + +-configure_file(${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY NEWLINE_STYLE UNIX) ++configure_file(${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc @ONLY NEWLINE_STYLE UNIX) + + # Configure testing + +@@ -350,45 +351,45 @@ endif() + + # Configure installation + +-install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets ++install(TARGETS ${LIBRARY_NAME} EXPORT ${LIBRARY_NAME}Targets + LIBRARY RUNTIME + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +-install(DIRECTORY Quotient/ DESTINATION ${${PROJECT_NAME}_INSTALL_INCLUDEDIR}/Quotient ++install(DIRECTORY Quotient/ DESTINATION ${${PROJECT_NAME}_INSTALL_INCLUDEDIR}/${LIBRARY_NAME} + FILES_MATCHING PATTERN "*.h") + + include(CMakePackageConfigHelpers) + # NB: SameMajorVersion doesn't really work yet, as we're within 0.x trail. + # Maybe consider jumping the gun and releasing 1.0, as semver advises? + write_basic_package_version_file( +- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" ++ "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}/${LIBRARY_NAME}ConfigVersion.cmake" + COMPATIBILITY SameMajorVersion + ) + +-export(PACKAGE ${PROJECT_NAME}) +-export(EXPORT ${PROJECT_NAME}Targets +- FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake") ++export(PACKAGE ${LIBRARY_NAME}) ++export(EXPORT ${LIBRARY_NAME}Targets ++ FILE "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}/${LIBRARY_NAME}Targets.cmake") + configure_file(cmake/${PROJECT_NAME}Config.cmake.in +- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" ++ "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}/${LIBRARY_NAME}Config.cmake" + @ONLY + ) + +-install(EXPORT ${PROJECT_NAME}Targets +- FILE ${PROJECT_NAME}Targets.cmake DESTINATION ${CMakeFilesLocation}) ++install(EXPORT ${LIBRARY_NAME}Targets ++ FILE ${LIBRARY_NAME}Targets.cmake DESTINATION ${CMakeFilesLocation}) + + install(FILES +- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Config.cmake" +- "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}ConfigVersion.cmake" ++ "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}/${LIBRARY_NAME}Config.cmake" ++ "${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}/${LIBRARY_NAME}ConfigVersion.cmake" + DESTINATION ${CMakeFilesLocation} + ) +-install(EXPORT_ANDROID_MK ${PROJECT_NAME}Targets DESTINATION ${CMAKE_INSTALL_DATADIR}/ndk-modules) ++#install(EXPORT_ANDROID_MK ${PROJECT_NAME}Targets DESTINATION ${CMAKE_INSTALL_DATADIR}/ndk-modules) + + if (WIN32) + install(FILES mime/packages/freedesktop.org.xml DESTINATION mime/packages) + endif (WIN32) + + if (UNIX AND NOT APPLE) +- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc ++ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + endif() + +diff '--color=auto' -rupN libQuotient-0.7.2.orig/Quotient.pc.in libQuotient-0.7.2/Quotient.pc.in +--- libQuotient-0.7.2.orig/Quotient.pc.in 2023-06-26 10:28:12.385892873 +0930 ++++ libQuotient-0.7.2/Quotient.pc.in 2023-06-26 11:04:31.648488210 +0930 +@@ -3,8 +3,8 @@ exec_prefix=${prefix} + includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ + +-Name: Quotient ++Name: @LIBRARY_NAME@ + Description: A Qt5 library to write cross-platfrom clients for Matrix + Version: @API_VERSION@ + Cflags: -I${includedir} +-Libs: -L${libdir} -lQuotient ++Libs: -L${libdir} -l@LIBRARY_NAME@ |