From 2179215a8be74119210b9e29c0155da330383179 Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Sun, 27 Aug 2017 13:15:29 -0700 Subject: [PATCH] fix rebuilds on git changes Use cmake to generate the version.h from version.h.in which is a cleaned up version of the old version.h with the git short sha into the build directory, and include the version.h from there. Continue to use the GetGitRevisionDescription plugin to make the cmake configuration state depend on the current sha of HEAD, but throw away the results (for the time being.) This makes rebuilds after git changes such as a commit only recompile a couple of files instead of the whole tree. --- CMakeLists.txt | 42 ++-- CMakeScripts/GetGitRevisionDescription.cmake | 211 ++++++++++-------- .../GetGitRevisionDescription.cmake.in | 11 +- src/common/ConfigManager.cpp | 2 +- src/sdl/SDL.cpp | 8 +- src/version.h | 62 ----- src/version.h.in | 45 ++++ src/wx/cmdevents.cpp | 2 +- src/wx/panel.cpp | 2 +- 9 files changed, 189 insertions(+), 196 deletions(-) delete mode 100644 src/version.h create mode 100644 src/version.h.in diff --git a/CMakeLists.txt b/CMakeLists.txt index cd8a25f2..fa46e63b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,27 +102,26 @@ if( NOT ENABLE_DEBUGGER AND ENABLE_SDL ) message( SEND_ERROR "The SDL port can't be built without debugging support" ) endif( NOT ENABLE_DEBUGGER AND ENABLE_SDL ) -# Set the version number with -DVERSION=X.X.X-uber -IF( NOT VERSION ) -#Will need to change this over to git - SET( VERSION "https://github.com/visualboyadvance-m/visualboyadvance-m" ) +find_package(Git) +if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + INCLUDE(GetGitRevisionDescription) + EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD OUTPUT_VARIABLE SHORT_SHA OUTPUT_STRIP_TRAILING_WHITESPACE) - #openmw does this - if(EXISTS ${PROJECT_SOURCE_DIR}/.git) - if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/shallow) - find_package(Git) - if(GIT_FOUND) - include(GetGitRevisionDescription) - get_git_head_revision(REFSPEC COMMITHASH) - SET(VERSION "GIT Commit: ${COMMITHASH}") - else(GIT_FOUND) - message(WARNING "Git executable not found") - endif(GIT_FOUND) - else(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/shallow) - message(STATUS "Shallow Git clone detected, not attempting to retrieve version info") - endif(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/shallow) - endif(EXISTS ${PROJECT_SOURCE_DIR}/.git) -ENDIF( NOT VERSION ) + SET(REVISION ${SHORT_SHA} CACHE STRING "git short sha" FORCE) + + # only use the plugin to tie the configure state to the sha to force rebuilds + # of files that depend on version.h + include(GetGitRevisionDescription) + get_git_head_revision(REFSPEC COMMITHASH) +else() + message(WARNING "Git not found, cannot set version info") + + SET(REVISION "unknown") +endif() + +# generate version.h +include_directories(${CMAKE_BINARY_DIR}) +configure_file("${CMAKE_SOURCE_DIR}/src/version.h.in" "${CMAKE_BINARY_DIR}/version.h" @ONLY) IF(CMAKE_BUILD_TYPE STREQUAL "Debug") ADD_DEFINITIONS(-DDEBUG) @@ -212,7 +211,7 @@ INCLUDE(GNUInstallDirs) # C defines ADD_DEFINITIONS (-DHAVE_NETINET_IN_H -DHAVE_ARPA_INET_H -DHAVE_ZLIB_H -DFINAL_VERSION -DSDL -DUSE_OPENGL -DSYSCONF_INSTALL_DIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}" -DWITH_LIRC=${WITHLIRC}) -ADD_DEFINITIONS (-DVERSION="${VERSION}" -DPKGDATADIR="${CMAKE_INSTALL_FULL_DATADIR}/vbam" -DPACKAGE=) +ADD_DEFINITIONS (-DPKGDATADIR="${CMAKE_INSTALL_FULL_DATADIR}/vbam" -DPACKAGE=) if( ENABLE_LINK ) # IPC linking code needs sem_timedwait which can be either in librt or pthreads @@ -449,7 +448,6 @@ SET(HDR_MAIN src/AutoBuild.h src/System.h src/Util.h - src/version.h src/common/array.h src/common/ConfigManager.h src/common/dictionary.h diff --git a/CMakeScripts/GetGitRevisionDescription.cmake b/CMakeScripts/GetGitRevisionDescription.cmake index fade483e..8ab03bc5 100644 --- a/CMakeScripts/GetGitRevisionDescription.cmake +++ b/CMakeScripts/GetGitRevisionDescription.cmake @@ -18,6 +18,12 @@ # 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: @@ -31,7 +37,7 @@ # http://www.boost.org/LICENSE_1_0.txt) if(__get_git_revision_description) - return() + return() endif() set(__get_git_revision_description YES) @@ -40,116 +46,123 @@ set(__get_git_revision_description YES) 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_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() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - endwhile() + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) - # 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() + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") - 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) + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) endfunction() function(git_describe _var) - #get_git_head_revision(refspec hash) + 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() - if(NOT GIT_FOUND) - set(${_var} "GIT-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() - #if(NOT hash) - # set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - # return() - #endif() + #message(STATUS "Arguments to execute_process: ${ARGN}") - # 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() + 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() - #message(STATUS "Arguments to execute_process: ${ARGN}") - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - describe - #${hash} - ${ARGN} - WORKING_DIRECTORY - "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() - - set(${_var} "${out}" PARENT_SCOPE) + set(${_var} "${out}" PARENT_SCOPE) endfunction() -function(get_git_tag_revision _var) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - rev-list - ${ARGN} - WORKING_DIRECTORY - "${CMAKE_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() - - set(${_var} "${out}" PARENT_SCOPE) +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/CMakeScripts/GetGitRevisionDescription.cmake.in b/CMakeScripts/GetGitRevisionDescription.cmake.in index 888ce13a..6d8b708e 100644 --- a/CMakeScripts/GetGitRevisionDescription.cmake.in +++ b/CMakeScripts/GetGitRevisionDescription.cmake.in @@ -1,4 +1,4 @@ -# +# # Internal file for GetGitRevisionDescription.cmake # # Requires CMake 2.6 or newer (uses the 'function' command) @@ -23,9 +23,12 @@ if(HEAD_CONTENTS MATCHES "ref") string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") if(EXISTS "@GIT_DIR@/${HEAD_REF}") configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") - configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - set(HEAD_HASH "${HEAD_REF}") + 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 diff --git a/src/common/ConfigManager.cpp b/src/common/ConfigManager.cpp index 5cfc73b9..a2ed8126 100644 --- a/src/common/ConfigManager.cpp +++ b/src/common/ConfigManager.cpp @@ -17,7 +17,7 @@ extern "C" { #include #include "../AutoBuild.h" -#include "../version.h" +#include "version.h" #include "../common/Patch.h" #include "../common/ConfigManager.h" diff --git a/src/sdl/SDL.cpp b/src/sdl/SDL.cpp index 55902a16..7b530f91 100644 --- a/src/sdl/SDL.cpp +++ b/src/sdl/SDL.cpp @@ -42,7 +42,7 @@ #include #include "../AutoBuild.h" -#include "../version.h" +#include "version.h" #include "SDL.h" @@ -1640,11 +1640,7 @@ void handleRewinds() int main(int argc, char** argv) { -#ifndef FINAL_BUILD - fprintf(stdout, "VBA-M version %s [SDL]\n", "Git:"); -#else - fprintf(stdout, "VBA-M version %s [SDL]"); -#endif + fprintf(stdout, "%s\n", VBA_NAME_AND_SUBVERSION); home = argv[0]; SetHome(home); diff --git a/src/version.h b/src/version.h deleted file mode 100644 index c7882428..00000000 --- a/src/version.h +++ /dev/null @@ -1,62 +0,0 @@ -// -*- C++ -*- -// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. -// Copyright (C) 1999-2003 Forgotten -// Copyright (C) 2004 Forgotten and the VBA development team - -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2, or(at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software Foundation, -// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -#define VBA_NAME "VisualBoyAdvance-M" - -#ifdef _WIN32 -#ifndef FINAL_BUILD -#define SVN_REV_STR "Git:" -#endif -#else -#ifdef SVN_REV -#define SVN_REV_STR SVN_REV -#else -#define SVN_REV_STR "" -#endif -#endif - -#define VBA_FEATURE_STRING "" - -#ifdef DEBUG -#define VBA_SUBVERSION_STRING " debug" -#elif defined(PUBLIC_RELEASE) -#define VBA_SUBVERSION_STRING "" -#else -#define VBA_SUBVERSION_STRING " (SVN" SVN_REV_STR ")" -#endif - -#if defined(_MSC_VER) -#define VBA_COMPILER "" -#define VBA_COMPILER_DETAIL " msvc " _Py_STRINGIZE(_MSC_VER) -#define _Py_STRINGIZE(X) _Py_STRINGIZE1((X)) -#define _Py_STRINGIZE1(X) _Py_STRINGIZE2##X -#define _Py_STRINGIZE2(X) #X -// re: -// http://72.14.203.104/search?q=cache:HG-okth5NGkJ:mail.python.org/pipermail/python-checkins/2002-November/030704.html+_msc_ver+compiler+version+string&hl=en&gl=us&ct=clnk&cd=5 -#else -// TODO: make for others compilers -#define VBA_COMPILER "" -#define VBA_COMPILER_DETAIL "" -#endif - -#define VBA_VERSION_STRING \ - " " \ - "2.0.0" VBA_SUBVERSION_STRING VBA_FEATURE_STRING VBA_COMPILER -#define VBA_NAME_AND_VERSION " " VBA_NAME VBA_VERSION_STRING -#define VBA_NAME_AND_SUBVERSION " " VBA_NAME VBA_SUBVERSION_STRING diff --git a/src/version.h.in b/src/version.h.in new file mode 100644 index 00000000..b6b95287 --- /dev/null +++ b/src/version.h.in @@ -0,0 +1,45 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +#define VBA_NAME "VisualBoyAdvance-M" +#define VBA_CURRENT_VERSION "2.0.0" + +#define VBA_FEATURE_STRING "" + +#define _STRINGIFY(N) #N + +#if defined(PUBLIC_RELEASE) + #define VBA_SUBVERSION_STRING "" +#else + #define VBA_SUBVERSION_STRING "-" "@REVISION@" +#endif + +#if defined(_MSC_VER) + #define VBA_COMPILER "msvc" + #define VBA_COMPILER_DETAIL _STRINGIFY(_MSC_VER) +#else + #define VBA_COMPILER "" + #define VBA_COMPILER_DETAIL "" +#endif + +#define VBA_VERSION_STRING VBA_CURRENT_VERSION VBA_SUBVERSION_STRING VBA_FEATURE_STRING VBA_COMPILER +#define VBA_NAME_AND_VERSION VBA_NAME " " VBA_VERSION_STRING +#define VBA_NAME_AND_SUBVERSION VBA_NAME_AND_VERSION VBA_SUBVERSION_STRING + +#define VERSION VBA_CURRENT_VERSION VBA_SUBVERSION_STRING diff --git a/src/wx/cmdevents.cpp b/src/wx/cmdevents.cpp index de9f6771..26f639d3 100644 --- a/src/wx/cmdevents.cpp +++ b/src/wx/cmdevents.cpp @@ -24,7 +24,7 @@ extern "C" { #define CODEC_ID_NONE AV_CODEC_ID_NONE #endif #endif -#include "../../version.h" +#include "version.h" #include "../common/ConfigManager.h" #include "../gb/gbPrinter.h" #include "../gba/agbprint.h" diff --git a/src/wx/panel.cpp b/src/wx/panel.cpp index c469863d..a1168275 100644 --- a/src/wx/panel.cpp +++ b/src/wx/panel.cpp @@ -2,7 +2,7 @@ #include #include -#include "../../version.h" +#include "version.h" #include "../common/ConfigManager.h" #include "../common/Patch.h" #include "../gb/gbPrinter.h"