Skip to content

Commit 521207a

Browse files
committed
Improve build version information.
1 parent 0e858d3 commit 521207a

25 files changed

+132
-586
lines changed

CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.1)
1+
cmake_minimum_required(VERSION 3.10)
22
project(gpick)
33
option(ENABLE_NLS "compile with gettext support" true)
44
option(USE_GTK3 "use GTK3 instead of GTK2" true)
@@ -14,6 +14,7 @@ file(GLOB SOURCES
1414
source/lua/*.cpp source/lua/*.h
1515
source/tools/*.cpp source/tools/*.h
1616
source/transformation/*.cpp source/transformation/*.h
17+
source/version/*.cpp source/version/*.h
1718
)
1819
list(REMOVE_ITEM SOURCES source/Color.cpp source/Color.h source/lua/Script.cpp source/lua/Script.h)
1920
include(Version)
@@ -30,7 +31,7 @@ if (PkgConfig_FOUND)
3031
endif()
3132
pkg_search_module(Lua lua5.4>=5.4 lua5>=5.4 lua5.3>=5.3 lua5>=5.3 lua>=5.3 lua5.2>=5.2 lua>=5.2)
3233
pkg_check_modules(Expat expat>=1.0)
33-
endif (PkgConfig_FOUND)
34+
endif()
3435
set(THREADS_PREFER_PTHREAD_FLAG ON)
3536
find_package(Threads REQUIRED)
3637
find_package(Ragel 6.9 REQUIRED)

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Using CMake:
6868

6969
Using SCons:
7070

71-
`scons` to compile all files and place executable file in `build/source/`.
71+
`scons` to compile all files and place executable file in `build/`.
7272

7373
`scons install` to install executable and resources to `DESTDIR`. By default `DESTDIR` is `/usr/local`.
7474

SConscript

+6-25
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os, string, sys, shutil, math
44
from tools import *
55

6-
env = GpickEnvironment(ENV = os.environ, BUILDERS = {'WriteNsisVersion': Builder(action = WriteNsisVersion, suffix = ".nsi")})
6+
env = GpickEnvironment(ENV = os.environ)
77

88
vars = Variables(os.path.join(env.GetLaunchDir(), 'user-config.py'))
99
vars.Add('DESTDIR', 'Directory to install under', '/usr/local')
@@ -22,10 +22,6 @@ vars.Update(env)
2222
if env['LOCALEDIR'] == '':
2323
env['LOCALEDIR'] = env['DESTDIR'] + '/share/locale'
2424

25-
v = Variables(os.path.join(env.GetLaunchDir(), 'version.py'))
26-
v.Add('GPICK_BUILD_VERSION', '', '0.0')
27-
v.Update(env)
28-
2925
if not env['BUILD_TARGET']:
3026
env['BUILD_TARGET'] = sys.platform
3127

@@ -150,13 +146,8 @@ env.Append(CPPPATH = ['#source'])
150146

151147
def buildVersion(env):
152148
version_env = env.Clone()
153-
version_env.Append(CPPDEFINES = {
154-
'BUILD_DATE': env['GPICK_BUILD_DATE'],
155-
'BUILD_REVISION': env['GPICK_BUILD_REVISION'],
156-
'BUILD_PLATFORM': sys.platform,
157-
'BUILD_VERSION': env['GPICK_BUILD_VERSION'],
158-
})
159-
return version_env.StaticObject(version_env.Glob('source/version/*.cpp'))
149+
sources = version_env.Template(version_env.Glob('source/version/*.in'), TEMPLATE_ENV_FILTER = ['GPICK_*'])
150+
return version_env.StaticObject(version_env.Glob('#source/version/*.cpp') + sources)
160151

161152
def buildLayout(env):
162153
layout_env = env.Clone()
@@ -213,13 +204,7 @@ def buildColorNames(env):
213204

214205
def buildWindowsResources(env):
215206
resources_env = env.Clone()
216-
resources_env.Append(RESOURCE_TEMPLATE_VARS = {
217-
'VERSION': env['GPICK_BUILD_VERSION'],
218-
'VERSION_COMMA': env['GPICK_BUILD_VERSION'].replace('.', ','),
219-
'REVISION': env['GPICK_BUILD_REVISION'],
220-
'BUILD_DATE': env['GPICK_BUILD_DATE'],
221-
})
222-
resources = resources_env.AlwaysBuild(resources_env.ResourceTemplate(resources_env.Glob('source/winres/*.rct')))
207+
resources = resources_env.Template(resources_env.Glob('source/winres/*.rc.in'), TEMPLATE_ENV_FILTER = ['GPICK_*'])
223208
objects = resources_env.RES(resources)
224209
Command("source/winres/gpick-icon.ico", File("source/winres/gpick-icon.ico").srcnode(), Copy("$TARGET", "${SOURCE}"))
225210
if not (env['TOOLCHAIN'] == 'msvc'):
@@ -379,12 +364,8 @@ env.Alias(target = "install", source = [
379364
env.InstallDataAutoDir(dir = env['DESTDIR'] + '/share/locale/', relative_dir = 'share/locale/', source = [env.Glob('share/locale/*/LC_MESSAGES/gpick.mo')]),
380365
])
381366

382-
env.Alias(target = "nsis", source = [
383-
env.WriteNsisVersion("version.py")
384-
])
385-
386367
env.Alias(target = "version", source = [
387-
env.Template(target = "#version.txt", source = "version.template"),
368+
env.AlwaysBuild(env.Template(target = "#.version", source = None, TEMPLATE_ENV_FILTER = ['GPICK_*'], TEMPLATE_SOURCE = '@GPICK_BUILD_VERSION@\n@GPICK_BUILD_REVISION@\n@GPICK_BUILD_HASH@\n@GPICK_BUILD_DATE@\n'))
388369
])
389370

390371
tarFiles = env.GetSourceFiles("(" + RegexEscape(os.sep) + r"\.)|(" + RegexEscape(os.sep) + r"\.svn$)|(^" + RegexEscape(os.sep) + r"build$)", r"(^\.)|(\.pyc$)|(\.orig$)|(~$)|(\.log$)|(\.diff)|(\.mo$)|(\.patch)|(^gpick-.*\.tar\.gz$)|(^user-config\.py$)")
@@ -397,5 +378,5 @@ if 'TAR' in env:
397378
env.Tar('gpick_' + str(env['GPICK_BUILD_VERSION']) + '.tar.gz', tarFiles)
398379
])
399380

400-
env.Default(executable, env.Install('source', executable))
381+
env.Default(executable, executable)
401382

cmake/FindGettext.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 2.8)
1+
cmake_minimum_required(VERSION 3.10)
22
find_program(MSGMERGE_EXECUTABLE NAMES msgmerge)
33
find_program(MSGFMT_EXECUTABLE NAMES msgfmt)
44
find_program(MSGCAT_EXECUTABLE NAMES msgcat)

cmake/FindRagel.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 2.8)
1+
cmake_minimum_required(VERSION 3.10)
22
find_program(RAGEL_EXECUTABLE NAMES ragel DOC "path to the ragel executable")
33
mark_as_advanced(RAGEL_EXECUTABLE)
44
if (RAGEL_EXECUTABLE)

cmake/Version.cmake

+31-29
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,52 @@
1-
cmake_minimum_required(VERSION 2.8)
1+
cmake_minimum_required(VERSION 3.10)
22
find_program(GIT_EXECUTABLE git DOC "Git version control")
33
mark_as_advanced(GIT_EXECUTABLE)
44
find_file(GITDIR NAMES .git PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH)
5-
find_file(VERSION_FILE NAMES version.py PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH)
6-
if (NOT VERSION_FILE)
7-
message(SEND_ERROR "Missing version file \"version.py\"")
8-
endif()
9-
file(STRINGS "${VERSION_FILE}" GPICK_VERSION LIMIT_COUNT 1)
10-
string(FIND ${GPICK_VERSION} "=" position)
11-
string(LENGTH ${GPICK_VERSION} length)
12-
math(EXPR position "${position} + 2")
13-
math(EXPR length "${length} - ${position} - 1")
14-
string(SUBSTRING ${GPICK_VERSION} ${position} ${length} GPICK_VERSION)
15-
set(GPICK_BUILD_PLATFORM "${CMAKE_SYSTEM_NAME}")
165
if (GIT_EXECUTABLE AND GITDIR)
176
set(old_tz $ENV{TZ})
187
set(ENV{TZ} UTC)
19-
execute_process(COMMAND "${GIT_EXECUTABLE}" show --quiet "--date=format-local:%Y-%m-%d;%H:%M:%S" "--format=%H;%cd;"
8+
execute_process(COMMAND "${GIT_EXECUTABLE}" describe "--match=gpick-*" "--match=v*" --always --long
9+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
10+
OUTPUT_VARIABLE version
11+
ERROR_VARIABLE version_error
12+
OUTPUT_STRIP_TRAILING_WHITESPACE
13+
)
14+
if (version_error)
15+
message(FATAL_ERROR "Failed to get version: ${version_error}")
16+
endif()
17+
string(REGEX REPLACE "^(gpick-|v)([(0-9)]+\\.[(0-9)(a-z)]+(\\.[(0-9)(a-z)]+)?(-[(0-9)]+)?).*" "\\2" version_parts ${version})
18+
string(REPLACE "-" ";" version_parts ${version_parts})
19+
list(GET version_parts 0 GPICK_BUILD_VERSION)
20+
list(GET version_parts 1 GPICK_BUILD_REVISION)
21+
execute_process(COMMAND "${GIT_EXECUTABLE}" show --quiet "--date=format-local:%Y-%m-%d" "--format=%H;%cd"
2022
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
2123
OUTPUT_VARIABLE version_parts
2224
ERROR_VARIABLE version_error
2325
OUTPUT_STRIP_TRAILING_WHITESPACE
2426
)
2527
set(ENV{TZ} "${old_tz}")
2628
if (version_error)
27-
message(SEND_ERROR "Failed to get version: ${version_error}")
29+
message(FATAL_ERROR "Failed to get version: ${version_error}")
2830
endif()
2931
list(LENGTH version_parts length)
3032
if (length LESS 2)
31-
message(SEND_ERROR "Invalid version string ${version_parts}")
33+
message(FATAL_ERROR "Invalid version string ${version_parts}")
3234
endif()
33-
list(GET version_parts 0 GPICK_REVISION)
35+
list(GET version_parts 0 GPICK_BUILD_HASH)
3436
list(GET version_parts 1 GPICK_BUILD_DATE)
35-
list(GET version_parts 2 GPICK_BUILD_TIME)
36-
string(SUBSTRING ${GPICK_REVISION} 0 10 GPICK_REVISION)
37+
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.version" "${GPICK_BUILD_VERSION}\n${GPICK_BUILD_REVISION}\n${GPICK_BUILD_HASH}\n${GPICK_BUILD_DATE}")
3738
else()
38-
find_file(VERSION_TXT_FILE NAMES version.txt PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH)
39-
if (VERSION_TXT_FILE)
40-
file(STRINGS "${VERSION_TXT_FILE}" version_parts LIMIT_COUNT 3)
41-
list(GET version_parts 0 GPICK_REVISION)
42-
list(GET version_parts 1 GPICK_BUILD_DATE)
43-
list(GET version_parts 2 GPICK_BUILD_TIME)
44-
string(SUBSTRING ${GPICK_REVISION} 0 10 GPICK_REVISION)
45-
return()
39+
find_file(VERSION_FILE NAMES .version PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH)
40+
if (NOT VERSION_FILE)
41+
message(FATAL_ERROR "Version file \".version\" is required when GIT can not be used to get version information.")
4642
endif()
47-
set(GPICK_REVISION "unknown")
48-
set(GPICK_BUILD_DATE "")
49-
set(GPICK_BUILD_TIME "")
43+
file(STRINGS "${VERSION_FILE}" version_parts LIMIT_COUNT 4)
44+
list(GET version_parts 0 GPICK_BUILD_VERSION)
45+
list(GET version_parts 1 GPICK_BUILD_REVISION)
46+
list(GET version_parts 2 GPICK_BUILD_HASH)
47+
list(GET version_parts 3 GPICK_BUILD_DATE)
5048
endif()
49+
set(GPICK_BUILD_VERSION_FULL "${GPICK_BUILD_VERSION}-${GPICK_BUILD_REVISION}")
50+
string(REGEX REPLACE "([(0-9)]+)[^\\.]*" "\\1" version_part ${GPICK_BUILD_VERSION})
51+
string(REPLACE "." "," GPICK_BUILD_VERSION_FULL_COMMA "${version_part},${GPICK_BUILD_REVISION}")
52+
string(SUBSTRING ${GPICK_BUILD_HASH} 0 10 GPICK_BUILD_HASH)

installer/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ DEPFILES= files/Gpick.exe
2020
.SUFFIXES: .wxs .wixobj .xstl
2121

2222
all: $(MSI).msi
23-
23+
2424
$(MSI).msi: $(OBJS) $(DEPFILES) $(HEAT_SRCS)
2525
$(LIGHT) -nologo $(LIGHT_FLAGS) -out $@ $(OBJS)
2626

installer/getversion.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import os,sys,re
1+
import os, re
22
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
3-
sys.path.insert(0,parentdir)
4-
import version
53

64
def getversion(style):
5+
with open(os.path.join(parentdir, ".version"), "r") as file:
6+
lines = file.read().splitlines()
7+
version = lines[0]
8+
revision = lines[1]
79
if style == "full":
8-
print version.GPICK_BUILD_VERSION
10+
print(version + '-' + revision)
911
else:
10-
result = re.match(r"^(\d+\.\d+\.\d+)(.*)$", version.GPICK_BUILD_VERSION)
11-
if result:
12-
print result.group(1)
13-
else:
14-
print "invalid_version"
12+
print(re.sub(r'(\d+)[^\.]*', '\\1', version) + '.' + revision)

0 commit comments

Comments
 (0)