diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index dfb55ade..c24e7b4d 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -81,9 +81,10 @@ jobs: -DGGML_METAL_MACOSX_VERSION_MIN=12.6 \ -DMACDEPLOYQT=~/Qt/6.5.1/macos/bin/macdeployqt \ -DGPT4ALL_OFFLINE_INSTALLER=ON \ - -DGPT4ALL_SIGN_INSTALL=ON - ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target all - ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target install + -DGPT4ALL_SIGN_INSTALL=ON \ + -DGPT4ALL_GEN_CPACK_CONFIG=ON + ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target package + ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake . -DGPT4ALL_GEN_CPACK_CONFIG=OFF ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target package ccache -s mkdir upload @@ -219,9 +220,10 @@ jobs: -DGGML_METAL_MACOSX_VERSION_MIN=12.6 \ -DMACDEPLOYQT=~/Qt/6.5.1/macos/bin/macdeployqt \ -DGPT4ALL_OFFLINE_INSTALLER=OFF \ - -DGPT4ALL_SIGN_INSTALL=ON - ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target all - ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target install + -DGPT4ALL_SIGN_INSTALL=ON \ + -DGPT4ALL_GEN_CPACK_CONFIG=ON + ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target package + ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake . -DGPT4ALL_GEN_CPACK_CONFIG=OFF ~/Qt/Tools/CMake/CMake.app/Contents/bin/cmake --build . --target package ccache -s mkdir upload diff --git a/gpt4all-chat/CHANGELOG.md b/gpt4all-chat/CHANGELOG.md index b2463e96..93a52ff5 100644 --- a/gpt4all-chat/CHANGELOG.md +++ b/gpt4all-chat/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). - Save chats on quit, even if the window isn't closed first ([#3387](https://github.com/nomic-ai/gpt4all/pull/3387)) - Add chat template replacements for five new models and fix EM German Mistral ([#3393](https://github.com/nomic-ai/gpt4all/pull/3393)) - Fix crash when entering `{{ a["foo"(` as chat template ([#3394](https://github.com/nomic-ai/gpt4all/pull/3394)) +- Sign the maintenance tool on macOS to prevent crash on Sonoma ([#3391](https://github.com/nomic-ai/gpt4all/pull/3391)) ## [3.6.1] - 2024-12-20 diff --git a/gpt4all-chat/CMakeLists.txt b/gpt4all-chat/CMakeLists.txt index b69a9610..279ba571 100644 --- a/gpt4all-chat/CMakeLists.txt +++ b/gpt4all-chat/CMakeLists.txt @@ -28,7 +28,18 @@ option(GPT4ALL_TEST "Build the tests" ${Python3_FOUND}) option(GPT4ALL_LOCALHOST "Build installer for localhost repo" OFF) option(GPT4ALL_OFFLINE_INSTALLER "Build an offline installer" OFF) option(GPT4ALL_SIGN_INSTALL "Sign installed binaries and installers (requires signing identities)" OFF) +option(GPT4ALL_GEN_CPACK_CONFIG "Generate the CPack config.xml in the package step and nothing else." OFF) +include(cmake/cpack_config.cmake) + +if (GPT4ALL_GEN_CPACK_CONFIG) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpack-steal-config.cmake.in" + "${CMAKE_BINARY_DIR}/cmake/cpack-steal-config.cmake" @ONLY) + set(CPACK_POST_BUILD_SCRIPTS ${CMAKE_BINARY_DIR}/cmake/cpack-steal-config.cmake) + include(CPack) + include(CPackIFW) + return() +endif() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 23) @@ -414,8 +425,6 @@ endif() # -- install -- -set(COMPONENT_NAME_MAIN ${PROJECT_NAME}) - install(TARGETS chat DESTINATION bin COMPONENT ${COMPONENT_NAME_MAIN}) install( @@ -494,61 +503,23 @@ if (NOT APPLE) COMPONENT ${COMPONENT_NAME_MAIN}) endif() -set(CPACK_GENERATOR "IFW") -set(CPACK_VERBATIM_VARIABLES YES) -set(CPACK_IFW_VERBOSE ON) - -if(${CMAKE_SYSTEM_NAME} MATCHES Linux) +if (CMAKE_SYSTEM_NAME MATCHES Linux) find_program(LINUXDEPLOYQT linuxdeployqt HINTS "$ENV{HOME}/dev/linuxdeployqt/build/tools/linuxdeployqt" "$ENV{HOME}/project/linuxdeployqt/bin") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/deploy-qt-linux.cmake.in" "${CMAKE_BINARY_DIR}/cmake/deploy-qt-linux.cmake" @ONLY) set(CPACK_PRE_BUILD_SCRIPTS ${CMAKE_BINARY_DIR}/cmake/deploy-qt-linux.cmake) - set(CPACK_IFW_ROOT "~/Qt/Tools/QtInstallerFramework/4.6") - set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-linux") - set(CPACK_IFW_TARGET_DIRECTORY "@HomeDir@/${COMPONENT_NAME_MAIN}") -elseif(${CMAKE_SYSTEM_NAME} MATCHES Windows) - find_program(WINDEPLOYQT windeployqt HINTS ${_qt_bin_dir}) +elseif (CMAKE_SYSTEM_NAME MATCHES Windows) + find_program(WINDEPLOYQT windeployqt) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/deploy-qt-windows.cmake.in" "${CMAKE_BINARY_DIR}/cmake/deploy-qt-windows.cmake" @ONLY) set(CPACK_PRE_BUILD_SCRIPTS ${CMAKE_BINARY_DIR}/cmake/deploy-qt-windows.cmake) - set(CPACK_IFW_ROOT "C:/Qt/Tools/QtInstallerFramework/4.6") - set(CPACK_IFW_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.ico") - set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-win64") - set(CPACK_IFW_TARGET_DIRECTORY "@HomeDir@\\${COMPONENT_NAME_MAIN}") -elseif(${CMAKE_SYSTEM_NAME} MATCHES Darwin) - find_program(MACDEPLOYQT macdeployqt HINTS ${_qt_bin_dir}) +elseif (CMAKE_SYSTEM_NAME MATCHES Darwin) + find_program(MACDEPLOYQT macdeployqt) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/deploy-qt-mac.cmake.in" "${CMAKE_BINARY_DIR}/cmake/deploy-qt-mac.cmake" @ONLY) set(CPACK_PRE_BUILD_SCRIPTS ${CMAKE_BINARY_DIR}/cmake/deploy-qt-mac.cmake) - set(CPACK_IFW_ROOT "~/Qt/Tools/QtInstallerFramework/4.6") - set(CPACK_IFW_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.icns") - set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-darwin") - set(CPACK_IFW_TARGET_DIRECTORY "@ApplicationsDir@/${COMPONENT_NAME_MAIN}") - set(CPACK_BUNDLE_NAME ${COMPONENT_NAME_MAIN}) - set(CPACK_BUNDLE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.icns") endif() -set(CPACK_COMPONENTS_ALL gpt4all) # exclude development components -set(CPACK_PACKAGE_INSTALL_DIRECTORY ${COMPONENT_NAME_MAIN}) -set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) -SET(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) -set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.nomic.ai/gpt4all") -set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-48.png") -set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE) -set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README.md) -set(CPACK_PACKAGE_EXECUTABLES "GPT4All") -set(CPACK_CREATE_DESKTOP_LINKS "GPT4All") -set(CPACK_IFW_PACKAGE_NAME "GPT4All") -set(CPACK_IFW_PACKAGE_TITLE "GPT4All Installer") -set(CPACK_IFW_PACKAGE_PUBLISHER "Nomic, Inc.") -set(CPACK_IFW_PRODUCT_URL "https://www.nomic.ai/gpt4all") -set(CPACK_IFW_PACKAGE_WIZARD_STYLE "Aero") -set(CPACK_IFW_PACKAGE_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-48.png") -set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-32.png") -set(CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST OFF) -set(CPACK_IFW_PACKAGE_CONTROL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/installer_control.qs") - include(InstallRequiredSystemLibraries) include(CPack) include(CPackIFW) @@ -560,9 +531,20 @@ endif() cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} ESSENTIAL FORCED_INSTALLATION) cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} VERSION ${APP_VERSION}) cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} LICENSES "MIT LICENSE" ${CPACK_RESOURCE_FILE_LICENSE}) -cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/installer_component.qs") +cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/installer_gpt4all_component.qs") cpack_ifw_configure_component(${COMPONENT_NAME_MAIN} REPLACES "gpt4all-chat") #Was used in very earliest prototypes +if (APPLE AND GPT4ALL_SIGN_INSTALL) + if (GPT4ALL_OFFLINE_INSTALLER) + cpack_add_component(maintenancetool HIDDEN) + else() + cpack_add_component(maintenancetool HIDDEN DOWNLOADED) + endif() + cpack_ifw_configure_component(maintenancetool ESSENTIAL FORCED_INSTALLATION) + cpack_ifw_configure_component(maintenancetool VERSION ${APP_VERSION}) + cpack_ifw_configure_component(maintenancetool SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/installer_maintenancetool_component.qs") +endif() + if (GPT4ALL_LOCALHOST) cpack_ifw_add_repository("GPT4AllRepository" URL "http://localhost/repository") elseif(GPT4ALL_OFFLINE_INSTALLER) diff --git a/gpt4all-chat/cmake/cpack-steal-config.cmake.in b/gpt4all-chat/cmake/cpack-steal-config.cmake.in new file mode 100644 index 00000000..41d15ee8 --- /dev/null +++ b/gpt4all-chat/cmake/cpack-steal-config.cmake.in @@ -0,0 +1,2 @@ +set(OUTPUT_DIR "@CMAKE_BINARY_DIR@") +file(COPY ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/config DESTINATION ${OUTPUT_DIR}/cpack-config) diff --git a/gpt4all-chat/cmake/cpack_config.cmake b/gpt4all-chat/cmake/cpack_config.cmake new file mode 100644 index 00000000..93ddc732 --- /dev/null +++ b/gpt4all-chat/cmake/cpack_config.cmake @@ -0,0 +1,45 @@ +set(COMPONENT_NAME_MAIN "gpt4all") + +set(CPACK_GENERATOR "IFW") +set(CPACK_VERBATIM_VARIABLES YES) +set(CPACK_IFW_VERBOSE ON) + +if (CMAKE_SYSTEM_NAME MATCHES Linux) + set(CPACK_IFW_ROOT "~/Qt/Tools/QtInstallerFramework/4.6") + set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-linux") + set(CPACK_IFW_TARGET_DIRECTORY "@HomeDir@/${COMPONENT_NAME_MAIN}") +elseif (CMAKE_SYSTEM_NAME MATCHES Windows) + set(CPACK_IFW_ROOT "C:/Qt/Tools/QtInstallerFramework/4.6") + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.ico") + set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-win64") + set(CPACK_IFW_TARGET_DIRECTORY "@HomeDir@\\${COMPONENT_NAME_MAIN}") +elseif (CMAKE_SYSTEM_NAME MATCHES Darwin) + set(CPACK_IFW_ROOT "~/Qt/Tools/QtInstallerFramework/4.6") + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.icns") + set(CPACK_PACKAGE_FILE_NAME "${COMPONENT_NAME_MAIN}-installer-darwin") + set(CPACK_IFW_TARGET_DIRECTORY "@ApplicationsDir@/${COMPONENT_NAME_MAIN}") +endif() + +set(CPACK_COMPONENTS_ALL ${COMPONENT_NAME_MAIN}) # exclude development components +if (APPLE AND GPT4ALL_SIGN_INSTALL) + list(APPEND CPACK_COMPONENTS_ALL maintenancetool) +endif() +set(CPACK_PACKAGE_INSTALL_DIRECTORY ${COMPONENT_NAME_MAIN}) +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.nomic.ai/gpt4all") +set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-48.png") +set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE) +set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README.md) +set(CPACK_PACKAGE_EXECUTABLES "GPT4All") +set(CPACK_CREATE_DESKTOP_LINKS "GPT4All") +set(CPACK_IFW_PACKAGE_NAME "GPT4All") +set(CPACK_IFW_PACKAGE_TITLE "GPT4All Installer") +set(CPACK_IFW_PACKAGE_PUBLISHER "Nomic, Inc.") +set(CPACK_IFW_PRODUCT_URL "https://www.nomic.ai/gpt4all") +set(CPACK_IFW_PACKAGE_WIZARD_STYLE "Aero") +set(CPACK_IFW_PACKAGE_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-48.png") +set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-32.png") +set(CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST OFF) +set(CPACK_IFW_PACKAGE_CONTROL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/cmake/installer_control.qs") diff --git a/gpt4all-chat/cmake/deploy-qt-mac.cmake.in b/gpt4all-chat/cmake/deploy-qt-mac.cmake.in index d9458aa3..2e1ac38b 100644 --- a/gpt4all-chat/cmake/deploy-qt-mac.cmake.in +++ b/gpt4all-chat/cmake/deploy-qt-mac.cmake.in @@ -1,8 +1,10 @@ set(MACDEPLOYQT "@MACDEPLOYQT@") set(COMPONENT_NAME_MAIN "@COMPONENT_NAME_MAIN@") set(CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") +set(GPT4ALL_SIGN_INSTALL "@GPT4ALL_SIGN_INSTALL@") set(GPT4ALL_SIGNING_ID "@MAC_SIGNING_IDENTITY@") -if (GPT4ALL_SIGNING_ID) +set(CPACK_CONFIG_DIR "@CMAKE_BINARY_DIR@") +if (GPT4ALL_SIGN_INSTALL) set(MAC_NOTARIZE -sign-for-notarization=${GPT4ALL_SIGNING_ID}) endif() execute_process(COMMAND ${MACDEPLOYQT} ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app -qmldir=${CMAKE_CURRENT_SOURCE_DIR} -verbose=2 ${MAC_NOTARIZE}) @@ -18,3 +20,13 @@ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/icons/gpt4all-48.png" DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data) file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/resources/gpt4all.icns" DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data) + +if (GPT4ALL_SIGN_INSTALL) + # Create signed MaintenanceTool + set(MT_DATA_DIR ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/maintenancetool/data) + file(MAKE_DIRECTORY ${MT_DATA_DIR}) + execute_process( + COMMAND binarycreator --config ${CPACK_CONFIG_DIR}/cpack-config/config/config.xml --create-maintenancetool --sign ${GPT4ALL_SIGNING_ID} + WORKING_DIRECTORY ${MT_DATA_DIR} + ) +endif() diff --git a/gpt4all-chat/cmake/installer_component.qs b/gpt4all-chat/cmake/installer_gpt4all_component.qs similarity index 100% rename from gpt4all-chat/cmake/installer_component.qs rename to gpt4all-chat/cmake/installer_gpt4all_component.qs diff --git a/gpt4all-chat/cmake/installer_maintenancetool_component.qs b/gpt4all-chat/cmake/installer_maintenancetool_component.qs new file mode 100644 index 00000000..57a9ca0e --- /dev/null +++ b/gpt4all-chat/cmake/installer_maintenancetool_component.qs @@ -0,0 +1,19 @@ +function Component() +{ + component.ifwVersion = installer.value("FrameworkVersion"); + installer.installationStarted.connect(this, Component.prototype.onInstallationStarted); +} + +Component.prototype.onInstallationStarted = function() +{ + if (component.updateRequested() || component.installationRequested()) { + if (installer.value("os") == "win") { + component.installerbaseBinaryPath = "@TargetDir@/installerbase.exe"; + } else if (installer.value("os") == "x11") { + component.installerbaseBinaryPath = "@TargetDir@/installerbase"; + } else if (installer.value("os") == "mac") { + component.installerbaseBinaryPath = "@TargetDir@/MaintenanceTool.app"; + } + installer.setInstallerBaseBinary(component.installerbaseBinaryPath); + } +}