mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 06:42:12 +00:00
- Change updaterevision to a CMake script
The benefit to this is fairly small, but it does mean a little less work needs to be done in the build scripts for cross compiling. The C version wasn't especially concise so it was not obviously better in any way.
This commit is contained in:
parent
d527866e6d
commit
62e9e0cbbb
8 changed files with 101 additions and 185 deletions
|
@ -426,9 +426,9 @@ endif()
|
||||||
# Update gitinfo.h
|
# Update gitinfo.h
|
||||||
|
|
||||||
add_custom_target( revision_check ALL
|
add_custom_target( revision_check ALL
|
||||||
COMMAND updaterevision src/gitinfo.h
|
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/tools/updaterevision/UpdateRevision.cmake" src/gitinfo.h
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
DEPENDS updaterevision )
|
)
|
||||||
|
|
||||||
# Libraries ZDoom needs
|
# Libraries ZDoom needs
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ cmake_minimum_required( VERSION 2.8.7 )
|
||||||
|
|
||||||
add_subdirectory( re2c )
|
add_subdirectory( re2c )
|
||||||
add_subdirectory( lemon )
|
add_subdirectory( lemon )
|
||||||
add_subdirectory( updaterevision )
|
|
||||||
add_subdirectory( zipdir )
|
add_subdirectory( zipdir )
|
||||||
|
|
||||||
set( CROSS_EXPORTS ${CROSS_EXPORTS} PARENT_SCOPE )
|
set( CROSS_EXPORTS ${CROSS_EXPORTS} PARENT_SCOPE )
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
cmake_minimum_required( VERSION 2.8.7 )
|
|
||||||
|
|
||||||
if( WIN32 )
|
|
||||||
if( MSVC_VERSION GREATER 1399 )
|
|
||||||
# VC 8+ adds a manifest automatically to the executable. We need to
|
|
||||||
# merge ours with it.
|
|
||||||
set( MT_MERGE ON )
|
|
||||||
else()
|
|
||||||
set( TRUSTINFO trustinfo.rc )
|
|
||||||
endif()
|
|
||||||
else( WIN32 )
|
|
||||||
set( TRUSTINFO "" )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( NOT CMAKE_CROSSCOMPILING )
|
|
||||||
add_executable( updaterevision updaterevision.c ${TRUSTINFO} )
|
|
||||||
set( CROSS_EXPORTS ${CROSS_EXPORTS} updaterevision PARENT_SCOPE )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( MT_MERGE )
|
|
||||||
add_custom_command(TARGET updaterevision POST_BUILD
|
|
||||||
COMMAND mt -inputresource:$<TARGET_FILE:updaterevision> -manifest ${CMAKE_CURRENT_SOURCE_DIR}/trustinfo.txt -outputresource:$<TARGET_FILE:updaterevision> -nologo
|
|
||||||
COMMENT "Embedding trustinfo into updaterevision" )
|
|
||||||
endif()
|
|
91
tools/updaterevision/UpdateRevision.cmake
Executable file
91
tools/updaterevision/UpdateRevision.cmake
Executable file
|
@ -0,0 +1,91 @@
|
||||||
|
#!/usr/bin/cmake -P
|
||||||
|
|
||||||
|
# UpdateRevision.cmake
|
||||||
|
#
|
||||||
|
# Public domain. This program uses git commands command to get
|
||||||
|
# various bits of repository status for a particular directory
|
||||||
|
# and writes it into a header file so that it can be used for a
|
||||||
|
# project's versioning.
|
||||||
|
|
||||||
|
# Boilerplate to return a variable from a function.
|
||||||
|
macro(ret_var VAR)
|
||||||
|
set(${VAR} "${${VAR}}" PARENT_SCOPE)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Populate variables "Hash", "Tag", and "Timestamp" with relevant information
|
||||||
|
# from source repository. If anything goes wrong return something in "Error."
|
||||||
|
function(query_repo_info)
|
||||||
|
execute_process(
|
||||||
|
COMMAND git describe --tags --dirty=-m
|
||||||
|
RESULT_VARIABLE Error
|
||||||
|
OUTPUT_VARIABLE Tag
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
if(NOT "${Error}" STREQUAL "0")
|
||||||
|
ret_var(Error)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND git log -1 "--format=%ai;%H"
|
||||||
|
RESULT_VARIABLE Error
|
||||||
|
OUTPUT_VARIABLE CommitInfo
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
if(NOT "${Error}" STREQUAL "0")
|
||||||
|
ret_var(Error)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(GET CommitInfo 0 Timestamp)
|
||||||
|
list(GET CommitInfo 1 Hash)
|
||||||
|
|
||||||
|
ret_var(Tag)
|
||||||
|
ret_var(Timestamp)
|
||||||
|
ret_var(Hash)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Although configure_file doesn't overwrite the file if the contents are the
|
||||||
|
# same we can't easily observe that to change the status message. This
|
||||||
|
# function parses the existing file (if it exists) and puts the hash in
|
||||||
|
# variable "OldHash"
|
||||||
|
function(get_existing_hash File)
|
||||||
|
if(EXISTS "${File}")
|
||||||
|
file(STRINGS "${File}" OldHash LIMIT_COUNT 1)
|
||||||
|
if(OldHash)
|
||||||
|
string(SUBSTRING "${OldHash}" 3 -1 OldHash)
|
||||||
|
ret_var(OldHash)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(main)
|
||||||
|
if(NOT CMAKE_ARGC EQUAL 4) # cmake -P UpdateRevision.cmake <OutputFile>
|
||||||
|
message("Usage: ${CMAKE_ARGV2} <path to gitinfo.h>")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(OutputFile "${CMAKE_ARGV3}")
|
||||||
|
|
||||||
|
get_filename_component(ScriptDir "${CMAKE_SCRIPT_MODE_FILE}" DIRECTORY)
|
||||||
|
|
||||||
|
query_repo_info()
|
||||||
|
if(NOT Hash)
|
||||||
|
message("Failed to get commit info: ${Error}")
|
||||||
|
set(Hash "0")
|
||||||
|
set(Tag "<unknown version>")
|
||||||
|
set(Timestamp "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_existing_hash("${OutputFile}")
|
||||||
|
if(Hash STREQUAL OldHash)
|
||||||
|
message("${OutputFile} is up to date at commit ${Tag}.")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file("${ScriptDir}/gitinfo.h.in" "${OutputFile}")
|
||||||
|
message("${OutputFile} updated to commit ${Tag}.")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
main()
|
8
tools/updaterevision/gitinfo.h.in
Normal file
8
tools/updaterevision/gitinfo.h.in
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// @Hash@
|
||||||
|
//
|
||||||
|
// This file was automatically generated by the
|
||||||
|
// updaterevision tool. Do not edit by hand.
|
||||||
|
|
||||||
|
#define GIT_DESCRIPTION "@Tag@"
|
||||||
|
#define GIT_HASH "@Hash@"
|
||||||
|
#define GIT_TIME "@Timestamp@"
|
|
@ -1,6 +0,0 @@
|
||||||
// This resource script is for compiling with MinGW only. Visual C++
|
|
||||||
// compilations use the manifest tool to insert the manifest instead.
|
|
||||||
|
|
||||||
#include <WinUser.h>
|
|
||||||
|
|
||||||
1 RT_MANIFEST "trustinfo.txt"
|
|
|
@ -1,16 +0,0 @@
|
||||||
<!-- Ignore any warnings about Unrecognized Element "trustInfo" -->
|
|
||||||
|
|
||||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
|
||||||
<assemblyIdentity version="1.0.0.0"
|
|
||||||
processorArchitecture="X86"
|
|
||||||
name="UpdateRevision"
|
|
||||||
type="win32" />
|
|
||||||
<description>Update svnrevision.h for the ZDoom source build process.</description>
|
|
||||||
<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<ms_asmv3:security>
|
|
||||||
<ms_asmv3:requestedPrivileges>
|
|
||||||
<ms_asmv3:requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
|
||||||
</ms_asmv3:requestedPrivileges>
|
|
||||||
</ms_asmv3:security>
|
|
||||||
</ms_asmv3:trustInfo>
|
|
||||||
</assembly>
|
|
|
@ -1,136 +0,0 @@
|
||||||
/* updaterevision.c
|
|
||||||
*
|
|
||||||
* Public domain. This program uses git commands command to get
|
|
||||||
* various bits of repository status for a particular directory
|
|
||||||
* and writes it into a header file so that it can be used for a
|
|
||||||
* project's versioning.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _CRT_SECURE_NO_DEPRECATE
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define popen _popen
|
|
||||||
#define pclose _pclose
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Used to strip newline characters from lines read by fgets.
|
|
||||||
void stripnl(char *str)
|
|
||||||
{
|
|
||||||
if (*str != '\0')
|
|
||||||
{
|
|
||||||
size_t len = strlen(str);
|
|
||||||
if (str[len - 1] == '\n')
|
|
||||||
{
|
|
||||||
str[len - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
char vertag[128], lastlog[128], lasthash[128], *hash = NULL;
|
|
||||||
FILE *stream = NULL;
|
|
||||||
int gotrev = 0, needupdate = 1;
|
|
||||||
|
|
||||||
vertag[0] = '\0';
|
|
||||||
lastlog[0] = '\0';
|
|
||||||
|
|
||||||
if (argc != 2)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Usage: %s <path to gitinfo.h>\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use git describe --tags to get a version string. If we are sitting directly
|
|
||||||
// on a tag, it returns that tag. Otherwise it returns <most recent tag>-<number of
|
|
||||||
// commits since the tag>-<short hash>.
|
|
||||||
// Use git log to get the time of the latest commit in ISO 8601 format and its full hash.
|
|
||||||
stream = popen("git describe --tags --dirty=-m && git log -1 --format=%ai*%H", "r");
|
|
||||||
|
|
||||||
if (NULL != stream)
|
|
||||||
{
|
|
||||||
if (fgets(vertag, sizeof vertag, stream) == vertag &&
|
|
||||||
fgets(lastlog, sizeof lastlog, stream) == lastlog)
|
|
||||||
{
|
|
||||||
stripnl(vertag);
|
|
||||||
stripnl(lastlog);
|
|
||||||
gotrev = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pclose(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gotrev)
|
|
||||||
{
|
|
||||||
hash = strchr(lastlog, '*');
|
|
||||||
if (hash != NULL)
|
|
||||||
{
|
|
||||||
*hash = '\0';
|
|
||||||
hash++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hash == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to get commit info: %s\n", strerror(errno));
|
|
||||||
strcpy(vertag, "<unknown version>");
|
|
||||||
lastlog[0] = '\0';
|
|
||||||
lastlog[1] = '0';
|
|
||||||
lastlog[2] = '\0';
|
|
||||||
hash = lastlog + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream = fopen (argv[1], "r");
|
|
||||||
if (stream != NULL)
|
|
||||||
{
|
|
||||||
if (!gotrev)
|
|
||||||
{ // If we didn't get a revision but the file does exist, leave it alone.
|
|
||||||
fclose (stream);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// Read the revision that's in this file already. If it's the same as
|
|
||||||
// what we've got, then we don't need to modify it and can avoid rebuilding
|
|
||||||
// dependant files.
|
|
||||||
if (fgets(lasthash, sizeof lasthash, stream) == lasthash)
|
|
||||||
{
|
|
||||||
stripnl(lasthash);
|
|
||||||
if (strcmp(hash, lasthash + 3) == 0)
|
|
||||||
{
|
|
||||||
needupdate = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose (stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needupdate)
|
|
||||||
{
|
|
||||||
stream = fopen (argv[1], "w");
|
|
||||||
if (stream == NULL)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fprintf(stream,
|
|
||||||
"// %s\n"
|
|
||||||
"//\n"
|
|
||||||
"// This file was automatically generated by the\n"
|
|
||||||
"// updaterevision tool. Do not edit by hand.\n"
|
|
||||||
"\n"
|
|
||||||
"#define GIT_DESCRIPTION \"%s\"\n"
|
|
||||||
"#define GIT_HASH \"%s\"\n"
|
|
||||||
"#define GIT_TIME \"%s\"\n",
|
|
||||||
hash, vertag, hash, lastlog);
|
|
||||||
fclose(stream);
|
|
||||||
fprintf(stderr, "%s updated to commit %s.\n", argv[1], vertag);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf (stderr, "%s is up to date at commit %s.\n", argv[1], vertag);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in a new issue