diff --git a/cmake/FindQtRuntime.cmake b/cmake/FindQtRuntime.cmake index 0fd7f423a..45bb8200e 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -42,39 +42,39 @@ set(QT_COMPONENTS_ORACLE Concurrent Network Svg Widgets) set(QT_COMPONENTS_SERVATRICE Network Sql WebSockets) # Union of Qt modules required across all test targets (independent of application targets). -# When adding a new test that needs additional Qt modules, add them here rather than in the test's CMakeLists.txt. +# When adding a new test that needs additional Qt modules, add them here instead to tests/CMakeLists.txt. set(QT_COMPONENTS_TEST Concurrent Network Svg Widgets) # --------------------------------------------------------------------------- # Determine which Qt components are required for this build # --------------------------------------------------------------------------- -set(REQUIRED_QT_COMPONENTS Core) +set(QT_COMPONENTS_REQUIRED Core) if(WITH_CLIENT) - list(APPEND REQUIRED_QT_COMPONENTS ${QT_COMPONENTS_COCKATRICE}) + list(APPEND QT_COMPONENTS_REQUIRED ${QT_COMPONENTS_COCKATRICE}) endif() if(WITH_ORACLE) - list(APPEND REQUIRED_QT_COMPONENTS ${QT_COMPONENTS_ORACLE}) + list(APPEND QT_COMPONENTS_REQUIRED ${QT_COMPONENTS_ORACLE}) endif() if(WITH_SERVER) - list(APPEND REQUIRED_QT_COMPONENTS ${QT_COMPONENTS_SERVATRICE}) + list(APPEND QT_COMPONENTS_REQUIRED ${QT_COMPONENTS_SERVATRICE}) endif() if(TEST) - list(APPEND REQUIRED_QT_COMPONENTS ${QT_COMPONENTS_TEST}) + list(APPEND QT_COMPONENTS_REQUIRED ${QT_COMPONENTS_TEST}) endif() -list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) +list(REMOVE_DUPLICATES QT_COMPONENTS_REQUIRED) # --------------------------------------------------------------------------- # Find Qt and define minimum version centrally # --------------------------------------------------------------------------- # Add Qt Linguist as required component unrelated of build target -find_package(Qt6 6.4 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} LinguistTools) +find_package(Qt6 6.4 REQUIRED COMPONENTS ${QT_COMPONENTS_REQUIRED} LinguistTools) set(QT_MAIN_VERSION_STRING Qt6) @@ -98,8 +98,8 @@ endif() # Export Qt target lists for individual targets # --------------------------------------------------------------------------- -# Convert components list, e.g.: Network;Sql;WebSockets -# into Qt modules: Qt6::Network;Qt6::Sql;Qt6::WebSockets +# Convert components list into Qt modules, e.g. +# Network;Sql;WebSockets --> Qt6::Network;Qt6::Sql;Qt6::WebSockets function(_qt_components_to_targets COMPONENTS OUTPUT_VARIABLE) set(TARGETS) @@ -146,7 +146,7 @@ get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}/../../.." ABSOLUTE) get_filename_component(QT_PLUGINS_DIR "${Qt6Core_DIR}/../../../${QT6_INSTALL_PLUGINS}" ABSOLUTE) if(UNIX AND APPLE) - # macOS needs a bit more help finding all necessary components. + # macOS needs a bit more help finding all necessary components list(APPEND QT_LIBRARY_DIR "/usr/local/lib") endif() @@ -155,7 +155,7 @@ endif() # --------------------------------------------------------------------------- message(STATUS "Found Qt: ${Qt6_DIR} (found version \"${Qt6_VERSION}\")") -message(STATUS "REQUIRED_QT_COMPONENTS = ${REQUIRED_QT_COMPONENTS}") +message(STATUS "QT_COMPONENTS_REQUIRED = ${QT_COMPONENTS_REQUIRED}") if(WITH_CLIENT) message(STATUS "QT_MODULES_COCKATRICE = ${QT_MODULES_COCKATRICE}") endif() diff --git a/cmake/NSIS.template.in b/cmake/NSIS.template.in index 197ee363b..5af116470 100644 --- a/cmake/NSIS.template.in +++ b/cmake/NSIS.template.in @@ -57,13 +57,21 @@ Page Custom PortableModePageCreate PortableModePageLeave Function .onInit -${If} ${NSIS_IS_64_BIT} == 1 # NSIS 64bit +${If} ${NSIS_IS_64_BIT} == 1 #NSIS 64bit ${IfNot} ${RunningX64} MessageBox MB_OK|MB_ICONSTOP "This version of Cockatrice requires a 64-bit Windows system." Abort ${EndIf} StrCpy $NormalDestDir "$ProgramFiles64\Cockatrice" SetRegView 64 +${Else} #NSIS 32bit + ${If} ${RunningX64} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "You are about to install a 32-bit version of Cockatrice on a 64-bit Windows system.$\n\ + We advise you to use the correct 64-bit installer instead to get around potential issues.$\n$\n\ + Download from our webpage: https://cockatrice.github.io" + ${EndIf} + StrCpy $NormalDestDir "$ProgramFiles\Cockatrice" ${EndIf} StrCpy $PortableDestDir "$Desktop\CockatricePortable" @@ -148,6 +156,7 @@ ${If} $8 != "admin" ${EndIf} FunctionEnd + Function SetModeDestinationFromInstdir ${If} $PortableMode = 0 StrCpy $NormalDestDir $InstDir @@ -166,14 +175,27 @@ Function AutoUninstallIfNeeded SetShellVarContext all -SetRegView 64 +; --- 32-bit uninstall --- +SetRegView 32 ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "QuietUninstallString" -StrCmp $R0 "" done64 -DetailPrint "Removing previous version..." +StrCmp $R0 "" done32 +DetailPrint "Removing previous version (32-bit)..." ExecWait '$R0' -done64: +done32: + +; --- 64-bit uninstall --- +${If} ${RunningX64} + SetRegView 64 + ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "QuietUninstallString" + + StrCmp $R0 "" done64 + DetailPrint "Removing previous version (64-bit)..." + ExecWait '$R0' + + done64: +${EndIf} FunctionEnd @@ -222,23 +244,45 @@ ${EndIf} ${If} $PortableMode = 0 SetShellVarContext all - SetRegView 64 + # uninstall 32bit version + SetRegView 32 ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "UninstallString" - StrCmp $R0 "" done64 + StrCmp $R0 "" done32 ${If} $ReinstallMode = 0 - MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "A previous version of Cockatrice must be uninstalled before installing the new one." IDOK uninst64 + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "A previous version of Cockatrice must be uninstalled before installing the new one." IDOK uninst32 Abort ${Else} - Goto uninst64 + Goto uninst32 ${EndIf} - uninst64: + uninst32: ClearErrors ExecWait "$R0" - done64: + done32: + + # uninstall 64bit version + ${If} ${NSIS_IS_64_BIT} == 1 + SetRegView 64 + + ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "UninstallString" + StrCmp $R0 "" done64 + + ${If} $ReinstallMode = 0 + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "A previous version of Cockatrice must be uninstalled before installing the new one." IDOK uninst64 + Abort + ${Else} + Goto uninst64 + ${EndIf} + + uninst64: + ClearErrors + ExecWait "$R0" + + done64: + ${EndIf} ${Else} Abort @@ -252,62 +296,70 @@ SetOutPath "$INSTDIR" ${If} $PortableMode = 1 ${AndIf} ${FileExists} "$INSTDIR\portable.dat" - ; upgrade portable mode - RMDir /r "$INSTDIR\plugins" - RMDir /r "$INSTDIR\sounds" - RMDir /r "$INSTDIR\themes" - RMDir /r "$INSTDIR\translations" - Delete "$INSTDIR\uninstall.exe" - Delete "$INSTDIR\cockatrice.exe" - Delete "$INSTDIR\oracle.exe" - Delete "$INSTDIR\servatrice.exe" - Delete "$INSTDIR\Qt*.dll" - Delete "$INSTDIR\libmysql.dll" - Delete "$INSTDIR\icu*.dll" - Delete "$INSTDIR\libeay32.dll" - Delete "$INSTDIR\ssleay32.dll" - Delete "$INSTDIR\qt.conf" - Delete "$INSTDIR\qdebug.txt" - Delete "$INSTDIR\servatrice.sql" - Delete "$INSTDIR\servatrice.ini.example" - Delete "$INSTDIR\zlib*.dll" - RMDir "$INSTDIR" + ; upgrade portable mode + RMDir /r "$INSTDIR\plugins" + RMDir /r "$INSTDIR\sounds" + RMDir /r "$INSTDIR\themes" + RMDir /r "$INSTDIR\translations" + Delete "$INSTDIR\uninstall.exe" + Delete "$INSTDIR\cockatrice.exe" + Delete "$INSTDIR\oracle.exe" + Delete "$INSTDIR\servatrice.exe" + Delete "$INSTDIR\Qt*.dll" + Delete "$INSTDIR\libmysql.dll" + Delete "$INSTDIR\icu*.dll" + Delete "$INSTDIR\libeay32.dll" + Delete "$INSTDIR\ssleay32.dll" + Delete "$INSTDIR\qt.conf" + Delete "$INSTDIR\qdebug.txt" + Delete "$INSTDIR\servatrice.sql" + Delete "$INSTDIR\servatrice.ini.example" + Delete "$INSTDIR\zlib*.dll" + RMDir "$INSTDIR" ${EndIf} @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@ @CPACK_NSIS_FULL_INSTALL@ ${If} $PortableMode = 0 - WriteUninstaller "$INSTDIR\uninstall.exe" - ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 - IntFmt $0 "0x%08X" $0 + WriteUninstaller "$INSTDIR\uninstall.exe" + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 - ; Enable Windows User-Mode Dumps - ; https://learn.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps - WriteRegExpandStr HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpFolder" "%LOCALAPPDATA%\CrashDumps\Cockatrice" - WriteRegDWORD HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpCount" "5" - WriteRegDWORD HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpType" "2" + ; Enable Windows User-Mode Dumps + ; https://learn.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps + WriteRegExpandStr HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpFolder" "%LOCALAPPDATA%\CrashDumps\Cockatrice" + WriteRegDWORD HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpCount" "5" + WriteRegDWORD HKLM "Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\cockatrice.exe" "DumpType" "2" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayIcon" "$INSTDIR\cockatrice.exe" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayName" "Cockatrice" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayVersion" "@CPACK_PACKAGE_VERSION_MAJOR@.@CPACK_PACKAGE_VERSION_MINOR@.@CPACK_PACKAGE_VERSION_PATCH@" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "EstimatedSize" "$0" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "InstallLocation" "$INSTDIR" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "NoModify" "1" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "NoRepair" "1" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "Publisher" "Cockatrice team" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "VersionMajor" "@CPACK_PACKAGE_VERSION_MAJOR@" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "VersionMinor" "@CPACK_PACKAGE_VERSION_MINOR@" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayIcon" "$INSTDIR\cockatrice.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayName" "Cockatrice" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "DisplayVersion" "@CPACK_PACKAGE_VERSION_MAJOR@.@CPACK_PACKAGE_VERSION_MINOR@.@CPACK_PACKAGE_VERSION_PATCH@" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "EstimatedSize" "$0" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "InstallLocation" "$INSTDIR" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "NoModify" "1" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "NoRepair" "1" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "Publisher" "Cockatrice team" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "VersionMajor" "@CPACK_PACKAGE_VERSION_MAJOR@" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" "VersionMinor" "@CPACK_PACKAGE_VERSION_MINOR@" - IfFileExists "$INSTDIR\vc_redist.x64.exe" VcRedist64Exists PastVcRedist64Check - VcRedist64Exists: - ExecWait '"$INSTDIR\vc_redist.x64.exe" /passive /norestart' - DetailPrint "Sleep to ensure unlock of vc_redist file after installation..." - Sleep 3000 - Delete "$INSTDIR\vc_redist.x64.exe" - PastVcRedist64Check: + IfFileExists "$INSTDIR\vc_redist.x86.exe" VcRedist86Exists PastVcRedist86Check + VcRedist86Exists: + ExecWait '"$INSTDIR\vc_redist.x86.exe" /passive /norestart' + DetailPrint "Wait to ensure unlock of vc_redist file after installation..." + Sleep 3000 + Delete "$INSTDIR\vc_redist.x86.exe" + PastVcRedist86Check: + + IfFileExists "$INSTDIR\vc_redist.x64.exe" VcRedist64Exists PastVcRedist64Check + VcRedist64Exists: + ExecWait '"$INSTDIR\vc_redist.x64.exe" /passive /norestart' + DetailPrint "Sleep to ensure unlock of vc_redist file after installation..." + Sleep 3000 + Delete "$INSTDIR\vc_redist.x64.exe" + PastVcRedist64Check: ${Else} ; Create the file the application uses to detect portable mode @@ -325,51 +377,51 @@ SectionEnd Section "Start menu item" SecStartMenu ${If} $PortableMode = 0 - SetShellVarContext all - createDirectory "$SMPROGRAMS\Cockatrice" - createShortCut "$SMPROGRAMS\Cockatrice\Cockatrice.lnk" "$INSTDIR\cockatrice.exe" - createShortCut "$SMPROGRAMS\Cockatrice\Oracle.lnk" "$INSTDIR\oracle.exe" - createShortCut "$SMPROGRAMS\Cockatrice\Servatrice.lnk" "$INSTDIR\servatrice.exe" + SetShellVarContext all + createDirectory "$SMPROGRAMS\Cockatrice" + createShortCut "$SMPROGRAMS\Cockatrice\Cockatrice.lnk" "$INSTDIR\cockatrice.exe" + createShortCut "$SMPROGRAMS\Cockatrice\Oracle.lnk" "$INSTDIR\oracle.exe" + createShortCut "$SMPROGRAMS\Cockatrice\Servatrice.lnk" "$INSTDIR\servatrice.exe" ${EndIf} SectionEnd Section "un.Application" UnSecApplication - SetShellVarContext all - RMDir /r "$INSTDIR\plugins" - RMDir /r "$INSTDIR\sounds" - RMDir /r "$INSTDIR\themes" - RMDir /r "$INSTDIR\translations" - Delete "$INSTDIR\*.exe" - Delete "$INSTDIR\*.dll" - Delete "$INSTDIR\qt.conf" - Delete "$INSTDIR\qdebug.txt" - Delete "$INSTDIR\servatrice.sql" - Delete "$INSTDIR\servatrice.ini.example" - RMDir "$INSTDIR" + SetShellVarContext all + RMDir /r "$INSTDIR\plugins" + RMDir /r "$INSTDIR\sounds" + RMDir /r "$INSTDIR\themes" + RMDir /r "$INSTDIR\translations" + Delete "$INSTDIR\*.exe" + Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\qt.conf" + Delete "$INSTDIR\qdebug.txt" + Delete "$INSTDIR\servatrice.sql" + Delete "$INSTDIR\servatrice.ini.example" + RMDir "$INSTDIR" - RMDir "$SMPROGRAMS\Cockatrice" + RMDir "$SMPROGRAMS\Cockatrice" - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Cockatrice" SectionEnd ; unselected because it is /o Section /o "un.Configurations, decks, cards, pics" UnSecConfiguration - SetShellVarContext current - DeleteRegKey HKCU "Software\Cockatrice" + SetShellVarContext current + DeleteRegKey HKCU "Software\Cockatrice" - RMDir /r "$LOCALAPPDATA\Cockatrice" + RMDir /r "$LOCALAPPDATA\Cockatrice" SectionEnd LangString DESC_SecApplication ${LANG_ENGLISH} "Cockatrice program files" LangString DESC_SecStartMenu ${LANG_ENGLISH} "Create start menu items for Cockatrice and Oracle." !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SecApplication} $(DESC_SecApplication) - !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenu} $(DESC_SecStartMenu) + !insertmacro MUI_DESCRIPTION_TEXT ${SecApplication} $(DESC_SecApplication) + !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenu} $(DESC_SecStartMenu) !insertmacro MUI_FUNCTION_DESCRIPTION_END LangString DESC_UnSecApplication ${LANG_ENGLISH} "Cockatrice program files and start menu items" LangString DESC_UnSecConfiguration ${LANG_ENGLISH} "Configurations, decks, card database, pictures" !insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${UnSecApplication} $(DESC_UnSecApplication) - !insertmacro MUI_DESCRIPTION_TEXT ${UnSecConfiguration} $(DESC_UnSecConfiguration) + !insertmacro MUI_DESCRIPTION_TEXT ${UnSecApplication} $(DESC_UnSecApplication) + !insertmacro MUI_DESCRIPTION_TEXT ${UnSecConfiguration} $(DESC_UnSecConfiguration) !insertmacro MUI_UNFUNCTION_DESCRIPTION_END diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 84d6d967c..f89bbd219 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,4 @@ -# NOTE: Qt modules for tests are defined centrally in cmake/FindQtRuntime.cmake (the _TEST_NEEDED variable). +# NOTE: Qt modules for tests are defined centrally in cmake/FindQtRuntime.cmake (the QT_COMPONENTS_TEST variable). # If a new test needs additional Qt modules, add them there — not in individual test CMakeLists.txt files. enable_testing() @@ -18,8 +18,6 @@ add_test(NAME latency_tracker_test COMMAND latency_tracker_test) add_test(NAME deck_hash_performance_test COMMAND deck_hash_performance_test) set_tests_properties(deck_hash_performance_test PROPERTIES TIMEOUT 15) -# Find GTest - add_executable(dummy_test dummy_test.cpp) add_executable(expression_test expression_test.cpp) add_executable(clamped_arithmetic_test clamped_arithmetic_test.cpp) @@ -35,6 +33,7 @@ add_executable(lag_monitor_test ${CMAKE_SOURCE_DIR}/cockatrice/src/client/lag_mo target_include_directories(lag_monitor_test PRIVATE ${CMAKE_SOURCE_DIR}/cockatrice/src) add_executable(latency_tracker_test latency_tracker_test.cpp) +# Find GTest find_package(GTest) if(NOT GTEST_FOUND)