From 5efb9d099eba4efb9953c89fa048d04da549b742 Mon Sep 17 00:00:00 2001 From: Thibault Lemaire Date: Wed, 7 Sep 2022 09:43:13 +0200 Subject: [PATCH] Add nix flake support run the app with ``` fish nix run ``` The resulting app supports VP8, AV1, and H264 --- CMakeLists.txt | 14 +- flake.lock | 299 ++++++++++++++++++++ flake.nix | 122 ++++++++ linphone-app/CMakeLists.txt | 32 ++- linphone-app/cmake/FindBCToolbox.cmake | 2 +- linphone-app/cmake/FindLibLinphone.cmake | 2 +- linphone-app/cmake/FindMediastreamer2.cmake | 4 +- linphone-app/cmake/FindQtKeychain.cmake | 2 +- linphone-sdk | 2 +- 9 files changed, 452 insertions(+), 27 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/CMakeLists.txt b/CMakeLists.txt index 56376ad2b..4da2bf035 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,13 +220,13 @@ if(NOT APPLE OR MONO_ARCH) endfunction() add_linphone_keychain() endif() - if(NOT APPLE AND NOT WIN32) - function(add_linphone_ispell) - add_subdirectory("external/ispell") - endfunction() - add_linphone_ispell() - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") - endif() + endif() + if(NOT APPLE AND NOT WIN32) + function(add_linphone_ispell) + add_subdirectory("external/ispell") + endfunction() + add_linphone_ispell() + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() function(add_linphone_app) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) # Prevent project from overriding the options we just set here diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..87ebe1d61 --- /dev/null +++ b/flake.lock @@ -0,0 +1,299 @@ +{ + "nodes": { + "bctoolbox-src": { + "flake": false, + "locked": { + "lastModified": 1711528184, + "narHash": "sha256-L96Ag8YhsBeiR6XzYDRpvH4sk1n7QcXhfw+jon/rzh4=", + "ref": "6e5b2547ada63afcc6e0b6efc91f780de076605a", + "rev": "6e5b2547ada63afcc6e0b6efc91f780de076605a", + "revCount": 857, + "type": "git", + "url": "file:./linphone-sdk/bctoolbox" + }, + "original": { + "type": "git", + "url": "file:./bctoolbox" + } + }, + "bcunit-src": { + "flake": false, + "locked": { + "lastModified": 1700735100, + "narHash": "sha256-42mbo6icYveRDKZ8mRlzqNDWcBY78kk9Yi1uUQBiWAk=", + "ref": "bd57ee7f2e29b5418bfa4a428639d42ce608d15e", + "rev": "bd57ee7f2e29b5418bfa4a428639d42ce608d15e", + "revCount": 227, + "type": "git", + "url": "file:./linphone-sdk/bcunit" + }, + "original": { + "type": "git", + "url": "file:./bcunit" + } + }, + "belcard-src": { + "flake": false, + "locked": { + "lastModified": 1704707519, + "narHash": "sha256-Cp/bfrdBR4gVNqefRpJzQh6dG41PbII2EyT0+QcucAA=", + "ref": "afaf9f73ef97e082986d7a54aad9c4b1a6cad1a4", + "rev": "afaf9f73ef97e082986d7a54aad9c4b1a6cad1a4", + "revCount": 242, + "type": "git", + "url": "file:./linphone-sdk/belcard" + }, + "original": { + "type": "git", + "url": "file:./belcard" + } + }, + "belle-sip-src": { + "flake": false, + "locked": { + "lastModified": 1711523325, + "narHash": "sha256-vSC7N7gX2Dwk9bxhwQIya2V9zqDM6UsDQjZcjcDxXXU=", + "ref": "03662b800ac63e8a48744d371df79358aea10d0c", + "rev": "03662b800ac63e8a48744d371df79358aea10d0c", + "revCount": 2164, + "type": "git", + "url": "file:./linphone-sdk/belle-sip" + }, + "original": { + "type": "git", + "url": "file:./belle-sip" + } + }, + "belr-src": { + "flake": false, + "locked": { + "lastModified": 1711525048, + "narHash": "sha256-8n78wGwYEshrItCIwJwUUfKPH1e3vzidKZKHEkQubx4=", + "ref": "ae44414813a7dfc4f19d39899bd99f189a41e49d", + "rev": "ae44414813a7dfc4f19d39899bd99f189a41e49d", + "revCount": 211, + "type": "git", + "url": "file:./linphone-sdk/belr" + }, + "original": { + "type": "git", + "url": "file:./belr" + } + }, + "bzrtp-src": { + "flake": false, + "locked": { + "lastModified": 1713880943, + "narHash": "sha256-h/kZWjmQfvKqAQvhoPnS+JB6LShxH0z7e+TMzXNbrRA=", + "ref": "refs/heads/fix/nix-build", + "rev": "6f3290f8f0644fc6f654fd659ef6aecbcdaf70b1", + "revCount": 327, + "type": "git", + "url": "file:./linphone-sdk/bzrtp" + }, + "original": { + "type": "git", + "url": "file:./bzrtp" + } + }, + "decaf-src": { + "flake": false, + "locked": { + "lastModified": 1685541108, + "narHash": "sha256-WOHC35Am4BpMmWXXKfoGQ1+zTO3R1wspNJE/WL2bKMg=", + "ref": "4d7bafff3a69c9d02b8addbb78f301a6a74e59ea", + "rev": "4d7bafff3a69c9d02b8addbb78f301a6a74e59ea", + "revCount": 562, + "type": "git", + "url": "file:./linphone-sdk/external/decaf" + }, + "original": { + "type": "git", + "url": "file:./external/decaf" + } + }, + "ispell-src": { + "flake": false, + "locked": { + "lastModified": 1699354417, + "narHash": "sha256-YoRLiMjk2BxoI27xc2nzucxfHV9UbouFRSECb3RdHGo=", + "ref": "05574fe160222c3d0b6283c1433c9b087271fad1", + "rev": "05574fe160222c3d0b6283c1433c9b087271fad1", + "revCount": 4, + "type": "git", + "url": "file:./external/ispell" + }, + "original": { + "type": "git", + "url": "file:./external/ispell" + } + }, + "liblinphone-src": { + "flake": false, + "locked": { + "lastModified": 1712587436, + "narHash": "sha256-u3E4VL+q+Hcu6CfJEgHD9tN4O4XQZq6XIp8JjQmTqnc=", + "ref": "4bd295821551a6a87bb963ca226a4572f10163b7", + "rev": "4bd295821551a6a87bb963ca226a4572f10163b7", + "revCount": 16565, + "type": "git", + "url": "file:./linphone-sdk/liblinphone" + }, + "original": { + "type": "git", + "url": "file:./liblinphone" + } + }, + "lime-src": { + "flake": false, + "locked": { + "lastModified": 1704707676, + "narHash": "sha256-4SzvVy/i6wAnMHSOUBOCHJuHj7wcHk4aXEWKd+zm7g8=", + "ref": "a9d1f3eee62bfcd3eac54816840f0c03fab278fb", + "rev": "a9d1f3eee62bfcd3eac54816840f0c03fab278fb", + "revCount": 258, + "type": "git", + "url": "file:./linphone-sdk/lime" + }, + "original": { + "type": "git", + "url": "file:./lime" + } + }, + "linphone-sdk": { + "inputs": { + "bctoolbox-src": "bctoolbox-src", + "bcunit-src": "bcunit-src", + "belcard-src": "belcard-src", + "belle-sip-src": "belle-sip-src", + "belr-src": "belr-src", + "bzrtp-src": "bzrtp-src", + "decaf-src": "decaf-src", + "liblinphone-src": "liblinphone-src", + "lime-src": "lime-src", + "mbedtls-src": "mbedtls-src", + "mediastreamer2-src": "mediastreamer2-src", + "msopenh264-src": "msopenh264-src", + "nixpkgs": [ + "nixpkgs" + ], + "ortp-src": "ortp-src", + "soci-src": "soci-src" + }, + "locked": { + "lastModified": 1713883095, + "narHash": "sha256-+UXgLThDf8lkHmEsxoSHMb5PGzxT5DLcYijGojkTHtk=", + "ref": "refs/heads/feat/auto-extract-nix-version-from-submodule-src", + "rev": "92db77c5d7a738fc324eeb5d55f1f430bfec25a8", + "revCount": 3047, + "type": "git", + "url": "file:./linphone-sdk" + }, + "original": { + "type": "git", + "url": "file:./linphone-sdk" + } + }, + "mbedtls-src": { + "flake": false, + "locked": { + "lastModified": 1685541286, + "narHash": "sha256-Bdq4syH+rRgSZP9wwBzQNkU9V5ZHSQCHPtaAPn7JSo0=", + "ref": "2acc0f26e6e97c82ff9981c1ec32b497d4ea9426", + "rev": "2acc0f26e6e97c82ff9981c1ec32b497d4ea9426", + "revCount": 24180, + "type": "git", + "url": "file:./external/mbedtls" + }, + "original": { + "type": "git", + "url": "file:./external/mbedtls" + } + }, + "mediastreamer2-src": { + "flake": false, + "locked": { + "lastModified": 1711832699, + "narHash": "sha256-A9A8xfDgJgtSkzDzBbwdtJxmqOSvYfe6jycBVP4lIaY=", + "ref": "d2eb8c1f5d2521d31669f480229d93755d623e58", + "rev": "d2eb8c1f5d2521d31669f480229d93755d623e58", + "revCount": 6537, + "type": "git", + "url": "file:./linphone-sdk/mediastreamer2" + }, + "original": { + "type": "git", + "url": "file:./mediastreamer2" + } + }, + "msopenh264-src": { + "flake": false, + "locked": { + "lastModified": 1709975904, + "narHash": "sha256-KQfXelgbjwDr1qMd8SuX2zf50V5Pra+OFAyfefissEo=", + "ref": "76b7e5e503087acd8d2d5dcc9d6eec88c8b82dde", + "rev": "76b7e5e503087acd8d2d5dcc9d6eec88c8b82dde", + "revCount": 162, + "type": "git", + "url": "file:./linphone-sdk/msopenh264" + }, + "original": { + "type": "git", + "url": "file:./msopenh264" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 0, + "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", + "path": "/nix/store/j10523yhkcc34478azkgcl70yzcx6j2j-source", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "ortp-src": { + "flake": false, + "locked": { + "lastModified": 1711534760, + "narHash": "sha256-r7WkxL3hBxwy9Ze2HlzRAVQBU44ky8KS8M0uxg7Ttm4=", + "ref": "0ddef68a87b14a5bbe278a1c197c11f881e65875", + "rev": "0ddef68a87b14a5bbe278a1c197c11f881e65875", + "revCount": 2014, + "type": "git", + "url": "file:./linphone-sdk/ortp" + }, + "original": { + "type": "git", + "url": "file:./ortp" + } + }, + "root": { + "inputs": { + "ispell-src": "ispell-src", + "linphone-sdk": "linphone-sdk", + "nixpkgs": "nixpkgs" + } + }, + "soci-src": { + "flake": false, + "locked": { + "lastModified": 1712325296, + "narHash": "sha256-4D+f+mMS6UBgEUBPrL1pHvcHvPQAUpzy9jSJgmiQqpo=", + "ref": "dc64bb457f658adb3fd998b8279ed28e005f7a98", + "rev": "dc64bb457f658adb3fd998b8279ed28e005f7a98", + "revCount": 2458, + "type": "git", + "url": "file:./linphone-sdk/external/soci" + }, + "original": { + "type": "git", + "url": "file:./external/soci" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..1b7d57b98 --- /dev/null +++ b/flake.nix @@ -0,0 +1,122 @@ +{ + description = "Linphone Qt Desktop Client"; + + inputs = { + linphone-sdk = { + url = git+file:./linphone-sdk; + inputs = { + nixpkgs.follows = "nixpkgs"; + bctoolbox-src.url = git+file:./linphone-sdk/bctoolbox; + bcunit-src.url = git+file:./linphone-sdk/bcunit; + belcard-src.url = git+file:./linphone-sdk/belcard; + belle-sip-src.url = git+file:./linphone-sdk/belle-sip; + belr-src.url = git+file:./linphone-sdk/belr; + bzrtp-src.url = git+file:./linphone-sdk/bzrtp; + decaf-src.url = git+file:./linphone-sdk/external/decaf; + lime-src.url = git+file:./linphone-sdk/lime; + liblinphone-src.url = git+file:./linphone-sdk/liblinphone; + mediastreamer2-src.url = git+file:./linphone-sdk/mediastreamer2; + msopenh264-src.url = git+file:./linphone-sdk/msopenh264; + ortp-src.url = git+file:./linphone-sdk/ortp; + soci-src.url = git+file:./linphone-sdk/external/soci; + }; + }; + ispell-src = { + url = git+file:./external/ispell; + flake = false; + }; + }; + + outputs = { self, nixpkgs, linphone-sdk, ispell-src, ... }: { + + overlays.default = final: prev: { + + linphone = prev.linphone.overrideAttrs (attrs: + let overriddenSrc = linphone-sdk.nixUtils.overrideSource self; in + overriddenSrc // { + buildInputs = [ + final.bctoolbox + final.lime + final.liblinphone + final.mediastreamer + final.belcard + final.belr + final.belle-sip + + final.jsoncpp + ] ++ (with final.libsForQt5; [ + qtkeychain + qtquickcontrols2 + qtmultimedia + qtspeech + poppler + ]); + + # Manually copy submodule source to where it's expected to be + postUnpack = '' + ispell_dir=$NIX_BUILD_TOP/source/external/ispell/ + mkdir --parents $ispell_dir + cp --no-preserve=mode --recursive ${ispell-src}/* $ispell_dir + ''; + + # Disable upstream (nixpkgs) patches + patches = [ ]; + postPatch = ''''; + + postInstall = with final; '' + # I would like to set LINPHONEAPP_INSTALL_PREFIX but then compilation fails when trying to include + mv --target-directory=$out ./OUTPUT/* + + mkdir -p $out/share/belr/grammars + ln -s ${liblinphone}/share/belr/grammars/* $out/share/belr/grammars/ + ln -s ${belle-sip}/share/belr/grammars/* $out/share/belr/grammars/ + + mkdir -p $out/lib/mediastreamer/plugins + ln -s ${mediastreamer-openh264}/lib/mediastreamer/plugins/* $out/lib/mediastreamer/plugins/ + ln -s ${mediastreamer}/lib/mediastreamer/plugins/* $out/lib/mediastreamer/plugins/ + + cp linphone-app/libapp-plugin.so $out/lib/ + + wrapProgram $out/bin/linphone \ + --set MEDIASTREAMER_PLUGINS_DIR \ + $out/lib/mediastreamer/plugins + ''; + + cmakeFlags = attrs.cmakeFlags ++ [ + # Do not build the SDK + "-DLINPHONE_QT_ONLY=YES" + "-DENABLE_BUILD_APP_PLUGINS=NO" + "-DENABLE_UPDATE_CHECK=NO" + "-DQTKEYCHAIN_TARGET_NAME=qt5keychain" + ( + let datetime = overriddenSrc.version; in + "-DLINPHONEAPP_VERSION=${builtins.substring 0 4 datetime}.${builtins.substring 4 2 datetime}.${builtins.substring 6 2 datetime}" + ) + "-DFULL_VERSION=${overriddenSrc.version}-nix" + "-DLINPHONE_OUTPUT_DIR=${final.liblinphone}" + #"-DISPELL_OUTPUT_DIR=${final.ispell}" + ]; + }); + + ispell = prev.ispell.overrideAttrs (attrs: (linphone-sdk.nixUtils.overrideSource ispell-src) // { + nativeBuildInputs = [ final.cmake ]; + }); + }; + + packages.x86_64-linux = import nixpkgs { + system = "x86_64-linux"; + overlays = [ + linphone-sdk.overlays.default + self.overlays.default + ]; + }; + + defaultPackage.x86_64-linux = self.packages.x86_64-linux.linphone; + + apps.x86_64-linux.default = { + type = "app"; + program = "${self.packages.x86_64-linux.linphone}/bin/linphone"; + }; + + }; +} diff --git a/linphone-app/CMakeLists.txt b/linphone-app/CMakeLists.txt index d40842fa2..38363f02a 100644 --- a/linphone-app/CMakeLists.txt +++ b/linphone-app/CMakeLists.txt @@ -24,26 +24,27 @@ cmake_minimum_required(VERSION 3.22) #Linphone targets -set(LINPHONE_PACKAGES LinphoneCxx Mediastreamer2 Belcard LibLinphone) +set(LINPHONE_PACKAGES LinphoneCxx Mediastreamer2 BelCard LibLinphone) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") find_package(BCToolbox) if(NOT BCToolbox_FOUND) - find_package(bctoolbox CONFIG REQUIRED) + find_package(BCToolbox CONFIG REQUIRED) endif() if(NOT LINPHONEAPP_VERSION) bc_compute_full_version(LINPHONEAPP_VERSION) + set(version_major) + set(version_minor) + set(version_patch) + set(identifiers ) + set(metadata ) + bc_parse_full_version("${LINPHONEAPP_VERSION}" version_major version_minor version_patch identifiers metadata) + set(LINPHONEAPP_VERSION "${version_major}.${version_minor}.${version_patch}") endif() -set(version_major) -set(version_minor) -set(version_patch) -set(identifiers ) -set(metadata ) -bc_parse_full_version("${LINPHONEAPP_VERSION}" version_major version_minor version_patch identifiers metadata) -project(linphoneqt VERSION "${version_major}.${version_minor}.${version_patch}") +project(linphoneqt VERSION "${LINPHONEAPP_VERSION}") if(ENABLE_BUILD_VERBOSE) #message("CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}") @@ -111,11 +112,13 @@ foreach(PACKAGE ${LINPHONE_PACKAGES}) endif() endforeach() +find_package(jsoncpp REQUIRED) + set(PLUGIN_TARGETS ${LinphoneCxx_TARGET}) set(APP_TARGETS ${LinphoneCxx_TARGET} ${BCToolbox_TARGET}#Logger/App ${Mediastreamer2_TARGET}#MediastreamerUtils - ${Belcard_TARGET}#VCard Model + ${BelCard_TARGET}#VCard Model ${LibLinphone_TARGET})#MediastreamerUtils #################################### @@ -123,7 +126,7 @@ set(APP_TARGETS ${LinphoneCxx_TARGET} if(ENABLE_QT_KEYCHAIN) find_package(QtKeychain) if(NOT QtKeychain_FOUND) - find_package(${QTKEYCHAIN_TARGET_NAME} CONFIG REQUIRED) + find_package(Qt5Keychain CONFIG REQUIRED) endif() add_compile_definitions("ENABLE_QT_KEYCHAIN") @@ -868,9 +871,10 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" DESTINATION "${CMAKE_INS add_subdirectory(build) -add_subdirectory(cmake_builder/linphone_package) - -deployqt_hack(${TARGET_NAME} ${LINPHONE_QML_DIR}) +if(NOT LINPHONE_QT_ONLY) + add_subdirectory(cmake_builder/linphone_package) + deployqt_hack(${TARGET_NAME} ${LINPHONE_QML_DIR}) +endif() # ------------------------------------------------------------------------------ diff --git a/linphone-app/cmake/FindBCToolbox.cmake b/linphone-app/cmake/FindBCToolbox.cmake index 707cc1472..5166d3e7c 100644 --- a/linphone-app/cmake/FindBCToolbox.cmake +++ b/linphone-app/cmake/FindBCToolbox.cmake @@ -34,7 +34,7 @@ if(NOT TARGET bctoolbox) set(EXPORT_PATH ${LINPHONE_OUTPUT_DIR}) include(GNUInstallDirs) set(BCToolbox_CMAKE_DIR ${EXPORT_PATH}/${CMAKE_INSTALL_DATADIR}/bctoolbox/cmake) - include(${BCToolbox_CMAKE_DIR}/bctoolboxTargets.cmake) + include(${BCToolbox_CMAKE_DIR}/bctoolboxTargets.cmake OPTIONAL) endif() set(_BCToolbox_REQUIRED_VARS BCToolbox_TARGET BCToolbox_CMAKE_DIR BCToolbox_CMAKE_UTILS) diff --git a/linphone-app/cmake/FindLibLinphone.cmake b/linphone-app/cmake/FindLibLinphone.cmake index 826bb0d81..49797fdf3 100644 --- a/linphone-app/cmake/FindLibLinphone.cmake +++ b/linphone-app/cmake/FindLibLinphone.cmake @@ -27,7 +27,7 @@ if(NOT TARGET liblinphone) set(EXPORT_PATH ${LINPHONE_OUTPUT_DIR}) include(GNUInstallDirs) - include(${EXPORT_PATH}/${CMAKE_INSTALL_DATADIR}/linphone/cmake/linphoneTargets.cmake) + include(${EXPORT_PATH}/${CMAKE_INSTALL_DATADIR}/linphone/cmake/linphoneTargets.cmake OPTIONAL) endif() set(_LibLinphone_REQUIRED_VARS LibLinphone_TARGET LibLinphone_PLUGINS_DIR) diff --git a/linphone-app/cmake/FindMediastreamer2.cmake b/linphone-app/cmake/FindMediastreamer2.cmake index dc41f187e..883db2ad3 100644 --- a/linphone-app/cmake/FindMediastreamer2.cmake +++ b/linphone-app/cmake/FindMediastreamer2.cmake @@ -29,10 +29,10 @@ if(NOT TARGET mediastreamer2) set(EXPORT_PATH ${LINPHONE_OUTPUT_DIR}) include(GNUInstallDirs) - include(${EXPORT_PATH}/${CMAKE_INSTALL_DATADIR}/Mediastreamer2/cmake/Mediastreamer2Targets.cmake) + include(${EXPORT_PATH}/${CMAKE_INSTALL_DATADIR}/Mediastreamer2/cmake/Mediastreamer2Targets.cmake OPTIONAL) endif() -set(_Mediastreamer2_REQUIRED_VARS Mediastreamer2_TARGET Mediastreamer2_PLUGINS_DIR) +set(_Mediastreamer2_REQUIRED_VARS Mediastreamer2_TARGET) set(_Mediastreamer2_CACHE_VARS ${_Mediastreamer2_REQUIRED_VARS}) if(TARGET mediastreamer2) diff --git a/linphone-app/cmake/FindQtKeychain.cmake b/linphone-app/cmake/FindQtKeychain.cmake index 9b7911aab..9a42a859f 100644 --- a/linphone-app/cmake/FindQtKeychain.cmake +++ b/linphone-app/cmake/FindQtKeychain.cmake @@ -28,7 +28,7 @@ if(NOT TARGET ${QTKEYCHAIN_TARGET_NAME}) set(EXPORT_PATH ${QTKEYCHAIN_OUTPUT_DIR}) include(GNUInstallDirs) - include(${EXPORT_PATH}/${CMAKE_INSTALL_LIBDIR}/cmake/${QTKEYCHAIN_TARGET_NAME}/${QTKEYCHAIN_TARGET_NAME}Config.cmake) + include(${EXPORT_PATH}/${CMAKE_INSTALL_LIBDIR}/cmake/${QTKEYCHAIN_TARGET_NAME}/${QTKEYCHAIN_TARGET_NAME}Config.cmake OPTIONAL) endif() set(_QtKeychain_REQUIRED_VARS QtKeychain_TARGET) diff --git a/linphone-sdk b/linphone-sdk index 1f9db257f..92db77c5d 160000 --- a/linphone-sdk +++ b/linphone-sdk @@ -1 +1 @@ -Subproject commit 1f9db257fe224ea6d9b067e69ee6b9f72102e129 +Subproject commit 92db77c5d7a738fc324eeb5d55f1f430bfec25a8