From 491f452dd7c043d1a252cdbc39b88b99ca8428ca Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Wed, 26 Oct 2022 15:06:06 -0300 Subject: [PATCH] Windows prebuilt gui fixes Currently you can't use GUI_EXE without BUILD_GUI, but BUILD_GUI also requires the yarn command (even though it will never use it when GUI_EXE is set). This commit fixes it: - Make `GUI_EXE` a windows-only top-level project options, rather than being guarded by `BUILD_GUI`. - Make `BUILD_GUI` control *building* the GUI instead of bundling it. - GUI_EXE and BUILD_GUI are now mutually exclusive. --- cmake/gui-option.cmake | 11 +++++++ cmake/gui.cmake | 52 +++++++++++++------------------- cmake/win32_installer_deps.cmake | 19 ------------ 3 files changed, 32 insertions(+), 50 deletions(-) diff --git a/cmake/gui-option.cmake b/cmake/gui-option.cmake index 323f201fa..1ec141ea2 100644 --- a/cmake/gui-option.cmake +++ b/cmake/gui-option.cmake @@ -3,4 +3,15 @@ if(APPLE OR WIN32) set(default_build_gui ON) endif() +if(WIN32) + set(GUI_EXE "" CACHE FILEPATH "path to a pre-built Windows GUI .exe to use (implies -DBUILD_GUI=OFF)") + if(GUI_EXE) + set(default_build_gui OFF) + endif() +endif() + option(BUILD_GUI "build electron gui from 'gui' submodule source" ${default_build_gui}) + +if(BUILD_GUI AND GUI_EXE) + message(FATAL_ERROR "-DGUI_EXE=... and -DBUILD_GUI=ON are mutually exclusive") +endif() diff --git a/cmake/gui.cmake b/cmake/gui.cmake index 7bf8cc27b..6b74ab9ed 100644 --- a/cmake/gui.cmake +++ b/cmake/gui.cmake @@ -1,24 +1,26 @@ -set(default_gui_target pack) -if(APPLE) - set(default_gui_target macos:raw) -elseif(WIN32) - set(default_gui_target win32) - set(GUI_EXE "" CACHE FILEPATH "path to an externally built lokinet gui.exe") -endif() +if(WIN32 AND GUI_EXE) + message(STATUS "using pre-built lokinet gui executable: ${GUI_EXE}") + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${GUI_EXE}" "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe") +elseif(BUILD_GUI) + message(STATUS "Building lokinet-gui from source") + + set(default_gui_target pack) + if(APPLE) + set(default_gui_target macos:raw) + elseif(WIN32) + set(default_gui_target win32) + endif() -set(GUI_YARN_TARGET "${default_gui_target}" CACHE STRING "yarn target for building the GUI") -set(GUI_YARN_EXTRA_OPTS "" CACHE STRING "extra options to pass into the yarn build command") + set(GUI_YARN_TARGET "${default_gui_target}" CACHE STRING "yarn target for building the GUI") + set(GUI_YARN_EXTRA_OPTS "" CACHE STRING "extra options to pass into the yarn build command") -if (BUILD_GUI) - message(STATUS "Building lokinet-gui") # allow manually specifying yarn with -DYARN= if(NOT YARN) find_program(YARN NAMES yarnpkg yarn REQUIRED) endif() message(STATUS "Building lokinet-gui with yarn ${YARN}, target ${GUI_YARN_TARGET}") - if(NOT WIN32) add_custom_target(lokinet-gui COMMAND ${YARN} install --frozen-lockfile && @@ -45,25 +47,13 @@ if (BUILD_GUI) ) elseif(WIN32) file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/gui") - option(GUI_ZIP_FILE "custom lokinet gui for windows from zip file" OFF) - if(GUI_ZIP_FILE) - message(STATUS "using custom lokinet gui from ${GUI_ZIP_FILE}") - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ${GUI_ZIP_FILE} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}) - add_custom_target("${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" COMMAND "true") - elseif(GUI_EXE) - message(STATUS "using custom lokinet gui executable: ${GUI_EXE}") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${GUI_EXE}" "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe") - add_custom_target("${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" COMMAND "true") - else() - add_custom_command(OUTPUT "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" - COMMAND ${YARN} install --frozen-lockfile && - USE_SYSTEM_7ZA=true DISPLAY= WINEDEBUG=-all WINEPREFIX="${PROJECT_BINARY_DIR}/wineprefix" ${YARN} ${GUI_YARN_EXTRA_OPTS} ${GUI_YARN_TARGET} - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${PROJECT_SOURCE_DIR}/gui/release/Lokinet-GUI_portable.exe" - "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" - WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/gui") - endif() + add_custom_command(OUTPUT "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" + COMMAND ${YARN} install --frozen-lockfile && + USE_SYSTEM_7ZA=true DISPLAY= WINEDEBUG=-all WINEPREFIX="${PROJECT_BINARY_DIR}/wineprefix" ${YARN} ${GUI_YARN_EXTRA_OPTS} ${GUI_YARN_TARGET} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${PROJECT_SOURCE_DIR}/gui/release/Lokinet-GUI_portable.exe" + "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe" + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/gui") add_custom_target(assemble_gui ALL COMMAND "true" DEPENDS "${PROJECT_BINARY_DIR}/gui/lokinet-gui.exe") else() message(FATAL_ERROR "Building/bundling the GUI from this repository is not supported on this platform") diff --git a/cmake/win32_installer_deps.cmake b/cmake/win32_installer_deps.cmake index e0591466e..8099e9a00 100644 --- a/cmake/win32_installer_deps.cmake +++ b/cmake/win32_installer_deps.cmake @@ -1,22 +1,3 @@ -if(NOT BUILD_GUI) - if(NOT GUI_ZIP_URL) - set(GUI_ZIP_URL "https://oxen.rocks/oxen-io/lokinet-gui/dev/lokinet-windows-x64-20220331T180338Z-569f90ad8.zip") - set(GUI_ZIP_HASH_OPTS EXPECTED_HASH SHA256=316f10489f5907bfa9c74b21f8ef2fdd7b7c7e6a0f5bcedaed2ee5f4004eab52) - endif() - - file(DOWNLOAD - ${GUI_ZIP_URL} - ${CMAKE_BINARY_DIR}/lokinet-gui.zip - ${GUI_ZIP_HASH_OPTS}) - - # We expect the produced .zip file above to extract to ./gui/lokinet-gui.exe - execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf ${CMAKE_BINARY_DIR}/lokinet-gui.zip - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) - - if(NOT EXISTS ${CMAKE_BINARY_DIR}/gui/lokinet-gui.exe) - message(FATAL_ERROR "Downloaded gui archive from ${GUI_ZIP_URL} does not contain gui/lokinet-gui.exe!") - endif() -endif() install(DIRECTORY ${CMAKE_BINARY_DIR}/gui DESTINATION share COMPONENT gui) if(WITH_WINDOWS_32)