summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorCallum Parsey2023-06-26 12:50:02 +0930
committerCallum Parsey2023-06-26 12:50:02 +0930
commitc1200a44e58f8e5df2ae1f0a39d5e0ecd6136bff (patch)
treee18bce2caee7d840db8384ab0f59a08841ed135b
parent0081f0f9736e2a080622f2c5ab265d8fef1ce980 (diff)
downloadaur-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--PKGBUILD43
-rw-r--r--namespace.patch196
2 files changed, 226 insertions, 13 deletions
diff --git a/PKGBUILD b/PKGBUILD
index 7fbfde65d18f..dbf01445dad7 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -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@