From f5e581974bb1d6bbf86baceec30f7ea73fb2e582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20L=C3=A4hteenm=C3=A4ki?= Date: Sat, 8 Feb 2020 13:31:51 +0200 Subject: [PATCH 1/2] Build installer for Windows --- .appveyor.yml | 11 +++++++++++ CMakeLists.txt | 8 +++++--- gui/CMakeLists.txt | 5 ++++- gui/Logger/Settings.cpp | 2 +- gui/version.iss.in | 1 + packaging/Windows/InnoSetup.iss.in | 22 ++++++++++++++++++++++ 6 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 gui/version.iss.in create mode 100644 packaging/Windows/InnoSetup.iss.in diff --git a/.appveyor.yml b/.appveyor.yml index 04b353d..9430d48 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -8,6 +8,8 @@ install: - conan user - conan remote add public-conan https://api.bintray.com/conan/bincrafters/public-conan - conan remote add theirix https://api.bintray.com/conan/bincrafters/theirix + - choco install -y innosetup + - set PATH=%PATH%;'C:\Program Files (x86)\Inno Setup 6'; - cd "%APPVEYOR_BUILD_FOLDER%" - git submodule update --init --recursive @@ -18,3 +20,12 @@ build_script: - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - cmake .. -G "Visual Studio 15 2017 Win64" - cmake --build . --config Release + +after_build: + - cd "%APPVEYOR_BUILD_FOLDER%" + - iscc build\InnoSetup.iss + +artifacts: + - path: 'build\Output\ETS2JobLogger-v*.exe' + - path: 'build\bin\ets2-job-logger.exe' + - path: 'build\bin\ets2-job-logger.dll' diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cd54bf..3a2aea0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,10 @@ if(MSVC) conan_basic_setup() endif() +if(MSVC OR MINGW) + configure_file(packaging/Windows/InnoSetup.iss.in InnoSetup.iss @ONLY) +endif() + add_subdirectory(scs-sdk) add_subdirectory(plugin) -if(NOT MINGW) - add_subdirectory(gui) -endif() +add_subdirectory(gui) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 54bff48..7b1a3c4 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -71,11 +71,14 @@ endif() configure_file(Version.h.in Version.h) configure_file(Logger/PluginInstallerDefs.h.in PluginInstallerDefs.h) +if(MSVC OR MINGW) + configure_file(version.iss.in version.iss) +endif() add_executable(ets2-job-logger WIN32 ${SOURCES}) if(MINGW) - set(WIN32_LIBS -lws2_32) + set(WIN32_LIBS -lws2_32 -lcrypt32) elseif (WIN32) find_library(WS2_32_LIB ws2_32.lib REQUIRED) find_library(GDI32_LIB gdi32.lib REQUIRED) diff --git a/gui/Logger/Settings.cpp b/gui/Logger/Settings.cpp index 94aadd1..d845b75 100644 --- a/gui/Logger/Settings.cpp +++ b/gui/Logger/Settings.cpp @@ -229,7 +229,7 @@ wxString Settings::getConfigFile() const { if (path.empty()) { return ""; } else { - path += wxFileName::GetPathSeparator() + wxString("ets2-job-logger"); + path += wxFileName::GetPathSeparator() + wxString("ets2-job-logger"); } return path + wxFileName::GetPathSeparator() + wxString("config.ini"); diff --git a/gui/version.iss.in b/gui/version.iss.in new file mode 100644 index 0000000..994ddf5 --- /dev/null +++ b/gui/version.iss.in @@ -0,0 +1 @@ +#define APP_VERSION_FULL = "@PROJECT_VERSION@"; diff --git a/packaging/Windows/InnoSetup.iss.in b/packaging/Windows/InnoSetup.iss.in new file mode 100644 index 0000000..cfc47db --- /dev/null +++ b/packaging/Windows/InnoSetup.iss.in @@ -0,0 +1,22 @@ +#include "@CMAKE_CURRENT_BINARY_DIR@\gui\version.iss" + +[Setup] +AppName=ETS2 Job Logger +AppVersion={#APP_VERSION_FULL} +LicenseFile=@CMAKE_CURRENT_LIST_DIR@\LICENSE.md +OutputBaseFilename=ETS2JobLogger-v{#APP_VERSION_FULL} +UsePreviousAppDir=yes +PrivilegesRequired=none +DefaultDirName={userappdata}\ets2-job-logger +DefaultGroupName=ETS2 Job Logger + +[Tasks] +Name: AutoRunRegistry; Description: "Start on startup"; GroupDescription: "{cm:AdditionalIcons}" + +[Registry] +Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "ETS2JobLogger"; ValueData: "{app}\ets2-job-logger.exe --minimized"; Tasks: AutoRunRegistry; + +[Files] +Source: "@CMAKE_CURRENT_LIST_DIR@\LICENSE.md"; DestDir: "{app}"; DestName: "License.txt" +Source: "@CMAKE_CURRENT_BINARY_DIR@\bin\ets2-job-logger.exe"; DestDir: "{app}" +Source: "@CMAKE_CURRENT_BINARY_DIR@\bin\ets2-job-logger.dll"; DestDir: "{app}\win_x64" From e3cac83ef8fdb33645002d117c5af96f745da58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20L=C3=A4hteenm=C3=A4ki?= Date: Sun, 23 Feb 2020 09:25:29 +0200 Subject: [PATCH 2/2] Add Git SHA1 to AboutDialog --- CMakeLists.txt | 2 + cmake/modules/GetGitRevisionDescription.cmake | 172 ++++++++++++++++++ .../GetGitRevisionDescription.cmake.in | 41 +++++ gui/AboutDialog.cpp | 2 +- gui/CMakeLists.txt | 8 + gui/Version.h.in | 1 + 6 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 cmake/modules/GetGitRevisionDescription.cmake create mode 100644 cmake/modules/GetGitRevisionDescription.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a2aea0..0674117 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ project(ets2-job-logger) set(CMAKE_CXX_STANDARD 11) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + if(MSVC) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() diff --git a/cmake/modules/GetGitRevisionDescription.cmake b/cmake/modules/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..a9ad77b --- /dev/null +++ b/cmake/modules/GetGitRevisionDescription.cmake @@ -0,0 +1,172 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# git_local_changes() +# +# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. +# Uses the return code of "git diff-index --quiet HEAD --". +# Does not regard untracked files. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + if(NOT IS_DIRECTORY "${GIT_DIR}") + file(READ ${GIT_DIR} worktree) + string(REGEX REPLACE "gitdir: (.*)worktrees(.*)\n$" "\\1" GIT_DIR ${worktree}) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_local_changes _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + diff-index --quiet HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(res EQUAL 0) + set(${_var} "CLEAN" PARENT_SCOPE) + else() + set(${_var} "DIRTY" PARENT_SCOPE) + endif() +endfunction() diff --git a/cmake/modules/GetGitRevisionDescription.cmake.in b/cmake/modules/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..6d8b708 --- /dev/null +++ b/cmake/modules/GetGitRevisionDescription.cmake.in @@ -0,0 +1,41 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/gui/AboutDialog.cpp b/gui/AboutDialog.cpp index 0137a47..42343a9 100644 --- a/gui/AboutDialog.cpp +++ b/gui/AboutDialog.cpp @@ -36,5 +36,5 @@ AboutDialog::AboutDialog(wxWindow *parent) : base::AboutDialog(parent) { auto titleFont = m_staticTextName->GetFont(); titleFont.SetPointSize(titleFont.GetPointSize() + 4); m_staticTextName->SetFont(titleFont); - m_staticTextVersion->SetLabel("v" APP_VERSION_FULL); + m_staticTextVersion->SetLabel("v" APP_VERSION_FULL " (" GIT_SHA1 ")"); } diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 7b1a3c4..5937ded 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -69,6 +69,14 @@ if(NOT WIN32) endif() endif() +include(GetGitRevisionDescription) +git_describe(GIT_SHA1) +get_git_head_revision(GIT_REFSPEC GIT_SHA1) +string(SUBSTRING ${GIT_SHA1} 0 7 GIT_SHA1) +git_local_changes(GIT_STATUS) +if(${GIT_STATUS} STREQUAL "DIRTY") + set(GIT_SHA1 "${GIT_SHA1}-${GIT_STATUS}") +endif() configure_file(Version.h.in Version.h) configure_file(Logger/PluginInstallerDefs.h.in PluginInstallerDefs.h) if(MSVC OR MINGW) diff --git a/gui/Version.h.in b/gui/Version.h.in index d08dd99..76b02c3 100644 --- a/gui/Version.h.in +++ b/gui/Version.h.in @@ -28,5 +28,6 @@ #define ETS2_JOB_LOGGER_VERSION_H #define APP_VERSION_FULL "@PROJECT_VERSION@" +#define GIT_SHA1 "@GIT_SHA1@" #endif //ETS2_JOB_LOGGER_VERSION_H