diff --git a/.gitignore b/.gitignore
index 989c3f41..7ca446de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,6 +62,8 @@ x86regtmod.c
nasm-version.c
win64-gas.c
win64-nasm.c
+YASM-VERSION-FILE
+YASM-VERSION.h
.sw*
*.s
*.asm
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9237329e..b63d14b7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,6 +10,7 @@ SET(BUILD_SHARED_LIBS ON)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
INCLUDE(YasmMacros)
+INCLUDE(VersionGen)
OPTION(ENABLE_NLS "Enable message translations" OFF)
@@ -26,12 +27,8 @@ IF(NOT CMAKE_BUILD_TYPE)
FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
-set (YASM_VERSION_MAJOR 1)
-set (YASM_VERSION_MINOR 1)
-set (YASM_VERSION_SUBMINOR 99)
-set (PACKAGE_INTVER "${YASM_VERSION_MAJOR}.${YASM_VERSION_MINOR}.${YASM_VERSION_SUBMINOR}")
-set (PACKAGE_BUILD "HEAD")
-set (PACKAGE_VERSION ${PACKAGE_BUILD})
+VERSION_GEN(PACKAGE_VERSION "${CMAKE_BINARY_DIR}/YASM-VERSION-FILE" "1.1.0")
+
set (PACKAGE_STRING "yasm ${PACKAGE_VERSION}")
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_BINARY_DIR} ${yasm_SOURCE_DIR})
diff --git a/Makefile.am b/Makefile.am
index f3ed7d41..208dc67f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,6 +31,7 @@ EXTRA_DIST = config/config.rpath
# libyasm-stdint.h doesn't clean up after itself?
CONFIG_CLEAN_FILES = libyasm-stdint.h
+CONFIG_CLEAN_FILES += YASM-VERSION-FILE
EXTRA_DIST += tools/Makefile.inc
EXTRA_DIST += libyasm/Makefile.inc
@@ -55,6 +56,7 @@ EXTRA_DIST += BSD.txt
EXTRA_DIST += GNU_GPL-2.0
EXTRA_DIST += GNU_LGPL-2.0
EXTRA_DIST += splint.sh
+EXTRA_DIST += YASM-VERSION-GEN.sh
EXTRA_DIST += Mkfiles/Makefile.flat
EXTRA_DIST += Mkfiles/Makefile.dj
EXTRA_DIST += Mkfiles/dj/config.h
@@ -122,6 +124,12 @@ EXTRA_DIST += Mkfiles/vc10/re2c/run.bat
# Until this gets fixed in automake
DISTCLEANFILES += libyasm/stamp-h libyasm/stamp-h[0-9]*
+dist-hook: YASM-VERSION-FILE
+ cp YASM-VERSION-FILE $(distdir)/version
+
+YASM-VERSION-FILE: $(top_srcdir)/YASM-VERSION-GEN.sh
+ $(top_srcdir)/YASM-VERSION-GEN.sh
+
distclean-local:
-rm -rf results
if HAVE_PYTHON
diff --git a/Mkfiles/Makefile.flat b/Mkfiles/Makefile.flat
index 3e190d73..011fbe51 100644
--- a/Mkfiles/Makefile.flat
+++ b/Mkfiles/Makefile.flat
@@ -197,7 +197,7 @@ win64-gas.c: modules/objfmts/coff/win64-gas.mac genmacro
modules/objfmts/coff/coff-objfmt.c: win64-nasm.c win64-gas.c
-genversion: modules/preprocs/nasm/genversion.c
+genversion: modules/preprocs/nasm/genversion.c YASM-VERSION.h
$(BUILDCC) -IMkfiles -I. -o $@ $<
version.mac: genversion
@@ -272,3 +272,8 @@ vsyasm: $(VSYASM_OBJS)
.c.o:
$(CC) -c $(CFLAGS) -o $@ $<
+$(YASM_OBJS) $(YTASM_OBJS) $(VSYASM_OBJS): YASM-VERSION.h
+
+YASM-VERSION.h: YASM-VERSION-GEN.sh
+ sh YASM-VERSION-GEN.sh
+
diff --git a/Mkfiles/dj/config.h b/Mkfiles/dj/config.h
index 46e3167e..b33554ac 100644
--- a/Mkfiles/dj/config.h
+++ b/Mkfiles/dj/config.h
@@ -1,3 +1,4 @@
+#include "YASM-VERSION.h"
#define yasm__splitpath(path, tail) yasm__splitpath_win(path, tail)
#define yasm__abspath(path) yasm__abspath_win(path)
#define yasm__combpath(from, to) yasm__combpath_win(from, to)
@@ -116,23 +117,17 @@
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "bug-yasm@tortall.net"
-/* Define to build version of this package. */
-#define PACKAGE_BUILD "HEAD"
-
-/* Define to internal version of this package. */
-#define PACKAGE_INTVER "1.1.99"
-
/* Define to the full name of this package. */
#define PACKAGE_NAME "yasm"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "yasm HEAD"
+/*#define PACKAGE_STRING "yasm HEAD"*/
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "yasm"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "HEAD"
+/*#define PACKAGE_VERSION "HEAD"*/
/* Define if the C compiler supports function prototypes. */
#define PROTOTYPES 1
diff --git a/Mkfiles/vc10/config.h b/Mkfiles/vc10/config.h
index aba46abe..efb7cbe4 100644
--- a/Mkfiles/vc10/config.h
+++ b/Mkfiles/vc10/config.h
@@ -1,3 +1,4 @@
+#include "YASM-VERSION.h"
#define yasm__splitpath(path, tail) yasm__splitpath_win(path, tail)
#define yasm__abspath(path) yasm__abspath_win(path)
#define yasm__combpath(from, to) yasm__combpath_win(from, to)
@@ -114,23 +115,17 @@
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "bug-yasm@tortall.net"
-/* Define to build version of this package. */
-#define PACKAGE_BUILD "HEAD"
-
-/* Define to internal version of this package. */
-#define PACKAGE_INTVER "1.1.99"
-
/* Define to the full name of this package. */
#define PACKAGE_NAME "yasm"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "yasm HEAD"
+/*#define PACKAGE_STRING "yasm HEAD"*/
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "yasm"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "HEAD"
+/*#define PACKAGE_VERSION "HEAD"*/
/* Define if the C compiler supports function prototypes. */
#define PROTOTYPES 1
diff --git a/Mkfiles/vc10/genversion/genversion.vcxproj b/Mkfiles/vc10/genversion/genversion.vcxproj
index cce7c7fd..1bfd9e7a 100644
--- a/Mkfiles/vc10/genversion/genversion.vcxproj
+++ b/Mkfiles/vc10/genversion/genversion.vcxproj
@@ -48,7 +48,7 @@
Disabled
- ..\..\vc10;%(AdditionalIncludeDirectories)
+ ..\..\vc10;../../..;%(AdditionalIncludeDirectories)
WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
EnableFastChecks
@@ -73,6 +73,9 @@
run.bat "$(TargetPath)"
+
+ runpre.bat
+
diff --git a/Mkfiles/vc10/genversion/runpre.bat b/Mkfiles/vc10/genversion/runpre.bat
new file mode 100644
index 00000000..fdd15708
--- /dev/null
+++ b/Mkfiles/vc10/genversion/runpre.bat
@@ -0,0 +1,2 @@
+cd ..\..\..
+YASM-VERSION-GEN.bat
diff --git a/Mkfiles/vc10/yasm.sln b/Mkfiles/vc10/yasm.sln
index 342bf07b..306c7b10 100644
--- a/Mkfiles/vc10/yasm.sln
+++ b/Mkfiles/vc10/yasm.sln
@@ -7,6 +7,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libyasm", "libyasm\libyasm.vcxproj", "{29FE7874-1256-4AD6-B889-68E399DC9608}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B545983B-8EE0-4A7B-A67A-E749EEAE62A2} = {B545983B-8EE0-4A7B-A67A-E749EEAE62A2}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "modules", "modules\modules.vcxproj", "{D715A3D4-EFAA-442E-AD8B-5B4FF64E1DD6}"
EndProject
diff --git a/Mkfiles/vc9/config.h b/Mkfiles/vc9/config.h
index aba46abe..efb7cbe4 100644
--- a/Mkfiles/vc9/config.h
+++ b/Mkfiles/vc9/config.h
@@ -1,3 +1,4 @@
+#include "YASM-VERSION.h"
#define yasm__splitpath(path, tail) yasm__splitpath_win(path, tail)
#define yasm__abspath(path) yasm__abspath_win(path)
#define yasm__combpath(from, to) yasm__combpath_win(from, to)
@@ -114,23 +115,17 @@
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "bug-yasm@tortall.net"
-/* Define to build version of this package. */
-#define PACKAGE_BUILD "HEAD"
-
-/* Define to internal version of this package. */
-#define PACKAGE_INTVER "1.1.99"
-
/* Define to the full name of this package. */
#define PACKAGE_NAME "yasm"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "yasm HEAD"
+/*#define PACKAGE_STRING "yasm HEAD"*/
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "yasm"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "HEAD"
+/*#define PACKAGE_VERSION "HEAD"*/
/* Define if the C compiler supports function prototypes. */
#define PROTOTYPES 1
diff --git a/Mkfiles/vc9/genversion/genversion.vcproj b/Mkfiles/vc9/genversion/genversion.vcproj
index 84c92a2d..f5a01f97 100644
--- a/Mkfiles/vc9/genversion/genversion.vcproj
+++ b/Mkfiles/vc9/genversion/genversion.vcproj
@@ -26,6 +26,7 @@
>
YASM-VERSION-FILE
+echo #define PACKAGE_STRING "yasm %_ver_%" > YASM-VERSION.h
+echo #define PACKAGE_VERSION "%_ver_%" >> YASM-VERSION.h
+
diff --git a/YASM-VERSION-GEN.sh b/YASM-VERSION-GEN.sh
new file mode 100755
index 00000000..00c0136f
--- /dev/null
+++ b/YASM-VERSION-GEN.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+YVF=YASM-VERSION-FILE
+DEF_VER=v1.1.0
+
+LF='
+'
+
+# First see if there is a version file (included in release tarballs),
+# then try git-describe, then default.
+if test -f version
+then
+ VN=$(cat version) || VN="$DEF_VER"
+elif test -d .git -o -f .git &&
+ VN=$(git describe --match "v[0-9]*" --abbrev=4 HEAD 2>/dev/null) &&
+ case "$VN" in
+ *$LF*) (exit 1) ;;
+ v0.1.0*)
+ # Special handling until we get a more recent tag on the
+ # master branch
+ MERGE_BASE=$(git merge-base $DEF_VER HEAD 2>/dev/null)
+ VN1=$(git rev-list $MERGE_BASE..HEAD | wc -l 2>/dev/null)
+ VN2=$(git rev-list --max-count=1 --abbrev-commit --abbrev=4 HEAD 2>/dev/null)
+ VN=$(echo "v$DEF_VER-$VN1-g$VN2" | sed -e 's/ //g')
+ git update-index -q --refresh
+ test -z "$(git diff-index --name-only HEAD --)" ||
+ VN="$VN-dirty" ;;
+ v[0-9]*)
+ git update-index -q --refresh
+ test -z "$(git diff-index --name-only HEAD --)" ||
+ VN="$VN-dirty" ;;
+ esac
+then
+ VN=$(echo "$VN" | sed -e 's/-/./g');
+else
+ VN="$DEF_VER"
+fi
+
+VN=$(expr "$VN" : v*'\(.*\)')
+
+if test -r $YVF
+then
+ VC=$(cat $YVF)
+else
+ VC=unset
+fi
+test "$VN" = "$VC" || {
+ echo >&2 "$VN"
+ echo "$VN" >$YVF
+ echo "#define PACKAGE_STRING \"yasm $VN\"" > YASM-VERSION.h
+ echo "#define PACKAGE_VERSION \"$VN\"" >> YASM-VERSION.h
+}
diff --git a/autogen.sh b/autogen.sh
index b91fc286..12da6aa4 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -73,7 +73,8 @@ if test ! -d "config"; then
mkdir config
fi
-rm -f stamp-h.in
+rm -rf autom4te.cache
+rm -f configure config.h config.status config.log stamp-h.in
#echo " gettextize -f --no-changelog"
#echo "N" | gettextize -f --no-changelog || exit 1
echo " aclocal $ACLOCAL_FLAGS"
diff --git a/cmake/modules/VersionGen.cmake b/cmake/modules/VersionGen.cmake
new file mode 100644
index 00000000..340455b3
--- /dev/null
+++ b/cmake/modules/VersionGen.cmake
@@ -0,0 +1,78 @@
+# Redistribution and use is allowed according to the terms of the BSD license.
+#
+# Copyright (c) 2011 Peter Johnson
+
+macro (VERSION_GEN _version _version_file _default_version)
+ set (_vn "v${_default_version}")
+
+ # First see if there is a version file (included in release tarballs),
+ # then try git-describe, then default.
+ if (EXISTS "${CMAKE_SOURCE_DIR}/version")
+ file (STRINGS "${CMAKE_SOURCE_DIR}/version" _version_strs LIMIT_COUNT 1)
+ list (GET _version_strs 0 _version_strs0)
+ if (NOT (${_version_strs0} STREQUAL ""))
+ set (_vn "v${_version_strs0}")
+ endif (${_version_strs0})
+ elseif (EXISTS "${CMAKE_SOURCE_DIR}/.git")
+ execute_process (COMMAND git describe --match "v[0-9]*" --abbrev=4 HEAD
+ RESULT_VARIABLE _git_result
+ OUTPUT_VARIABLE _git_vn
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ if (_git_result EQUAL 0)
+ # Special handling until we get a more recent tag on the master
+ # branch
+ if (_git_vn MATCHES "^v0[.]1[.]0")
+ execute_process (COMMAND git merge-base v${_default_version} HEAD
+ OUTPUT_VARIABLE _merge_base
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ #message (STATUS "Merge base: ${_merge_base}")
+
+ execute_process (COMMAND git rev-list ${_merge_base}..HEAD
+ OUTPUT_VARIABLE _rev_list
+ ERROR_QUIET)
+ string (REGEX MATCHALL "[^\n]*\n" _rev_list_lines "${_rev_list}")
+ #message (STATUS "Rev list: ${_rev_list_lines}")
+ list (LENGTH _rev_list_lines _vn1)
+
+ execute_process (COMMAND git rev-list --max-count=1 --abbrev-commit --abbrev=4 HEAD
+ OUTPUT_VARIABLE _vn2
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ set (_git_vn "v${_default_version}-${_vn1}-g${_vn2}")
+ endif (_git_vn MATCHES "^v0[.]1[.]0")
+
+ # Append -dirty if there are local changes
+ execute_process (COMMAND git update-index -q --refresh)
+ execute_process (COMMAND git diff-index --name-only HEAD --
+ OUTPUT_VARIABLE _git_vn_dirty)
+ if (_git_vn_dirty)
+ set (_git_vn "${_git_vn}-dirty")
+ endif (_git_vn_dirty)
+
+ # Substitute . for - in the result
+ string (REPLACE "-" "." _vn "${_git_vn}")
+ endif (_git_result EQUAL 0)
+ endif (EXISTS "${CMAKE_SOURCE_DIR}/version")
+
+ # Strip leading "v" from version
+ #message (STATUS "_vn: ${_vn}")
+ string (REGEX REPLACE "^v*(.+)" "\\1" _vn "${_vn}")
+
+ # Update version file if required
+ if (EXISTS ${_version_file})
+ file (STRINGS ${_version_file} _version_strs LIMIT_COUNT 1)
+ list (GET _version_strs 0 _vc)
+ else (EXISTS ${_version_file})
+ set (_vc "unset")
+ endif (EXISTS ${_version_file})
+ if (NOT ("${_vn}" STREQUAL "${_vc}"))
+ file (WRITE ${_version_file} "${_vn}")
+ endif (NOT ("${_vn}" STREQUAL "${_vc}"))
+
+ # Set output version variable
+ set (${_version} ${_vn})
+endmacro (VERSION_GEN)
diff --git a/config.h.cmake b/config.h.cmake
index d282b931..50ed93ab 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -29,12 +29,6 @@
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "bug-yasm@tortall.net"
-/* Define to internal version of this package. */
-#define PACKAGE_INTVER "@PACKAGE_INTVER@"
-
-/* Define to build version of this package. */
-#define PACKAGE_BUILD "@PACKAGE_BUILD@"
-
/* Define to the full name of this package. */
#define PACKAGE_NAME "yasm"
diff --git a/configure.ac b/configure.ac
index 4dc92f41..c0507a6b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,9 @@
# autoconf setup
#
AC_PREREQ(2.53)
-AC_INIT([yasm], [HEAD], [bug-yasm@tortall.net])
+AC_INIT([yasm],
+ m4_esyscmd([./YASM-VERSION-GEN.sh && tr -d '\n' \n", argv[0]);
return EXIT_FAILURE;
}
- if (sscanf(PACKAGE_INTVER, "%d.%d.%d", &major, &minor, &subminor) != 3) {
+ matched = sscanf(PACKAGE_VERSION, "%d.%d.%d.%d", &major, &minor, &subminor,
+ &patchlevel);
+
+ if (matched == 3)
+ patchlevel = 0;
+ else if (matched != 4) {
fprintf(stderr, "Version tokenizing error\n");
return EXIT_FAILURE;
}
@@ -61,17 +66,15 @@ main(int argc, char *argv[])
fprintf(out, "%%define __YASM_MAJOR__ %d\n", major);
fprintf(out, "%%define __YASM_MINOR__ %d\n", minor);
fprintf(out, "%%define __YASM_SUBMINOR__ %d\n", subminor);
- if (!isdigit(PACKAGE_BUILD[0]))
- fprintf(out, "%%define __YASM_BUILD__ 0\n");
- else
- fprintf(out, "%%define __YASM_BUILD__ %d\n", atoi(PACKAGE_BUILD));
+ fprintf(out, "%%define __YASM_BUILD__ %d\n", patchlevel);
+ fprintf(out, "%%define __YASM_PATCHLEVEL__ %d\n", patchlevel);
/* Version id (hex number) */
- fprintf(out, "%%define __YASM_VERSION_ID__ 0%02x%02x%02x00h\n", major,
- minor, subminor);
+ fprintf(out, "%%define __YASM_VERSION_ID__ 0%02x%02x%02x%02xh\n", major,
+ minor, subminor, patchlevel);
- /* Version string - version sans build */
- fprintf(out, "%%define __YASM_VER__ \"%s\"\n", PACKAGE_INTVER);
+ /* Version string */
+ fprintf(out, "%%define __YASM_VER__ \"%s\"\n", PACKAGE_VERSION);
fclose(out);
return EXIT_SUCCESS;