summaryrefslogtreecommitdiff
path: root/m4/fp_setup_project_version.m4
blob: d51759add71aa22f2c06264109262693efaf05a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# FP_SETUP_PROJECT_VERSION
# ---------------------
AC_DEFUN([FP_SETUP_PROJECT_VERSION],
[
    if test "$RELEASE" = "NO"; then
        AC_MSG_CHECKING([for GHC version date])
        if test -f VERSION_DATE; then
            PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
            AC_MSG_RESULT(given $PACKAGE_VERSION)
        elif test -e .git; then
            changequote(, )dnl
            ver_posixtime=`git log -1 --pretty=format:%ct`
            ver_date=`perl -MPOSIX -e "print strftime('%Y%m%d', gmtime($ver_posixtime));"`
            if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
            changequote([, ])dnl
                    AC_MSG_ERROR([failed to detect version date: check that git and perl are in your path])
            fi
            PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
            AC_MSG_RESULT(inferred $PACKAGE_VERSION)
        elif test -f VERSION; then
            PACKAGE_VERSION=`cat VERSION`
            AC_MSG_RESULT(given $PACKAGE_VERSION)
        else
            AC_MSG_WARN([cannot determine snapshot version: no .git directory and no VERSION file])
            dnl We'd really rather this case didn't happen, but it might
            dnl do (in particular, people using lndir trees may find that
            dnl the build system can't find any other date). If it does
            dnl happen, then we use the current date.
            dnl This way we get some idea about how recent a build is.
            dnl It also means that packages built for 2 different builds
            dnl will probably use different version numbers, so things are
            dnl less likely to go wrong.
            PACKAGE_VERSION=${PACKAGE_VERSION}.`date +%Y%m%d`
        fi
    fi

    AC_MSG_CHECKING([for GHC Git commit id])
    if test -e .git; then
        git_commit_id=`git rev-parse HEAD`
        if test -n "$git_commit_id" 2>&1 >/dev/null; then true; else
            AC_MSG_ERROR([failed to detect revision: check that git is in your path])
        fi
        PACKAGE_GIT_COMMIT_ID=$git_commit_id
        AC_MSG_RESULT(inferred $PACKAGE_GIT_COMMIT_ID)
    elif test -f GIT_COMMIT_ID; then
        PACKAGE_GIT_COMMIT_ID=`cat GIT_COMMIT_ID`
        AC_MSG_RESULT(given $PACKAGE_GIT_COMMIT_ID)
    else
        AC_MSG_WARN([cannot determine snapshot revision: no .git directory and no 'GIT_COMMIT_ID' file])
        PACKAGE_GIT_COMMIT_ID="0000000000000000000000000000000000000000"
    fi


    # Some renamings
    AC_SUBST([ProjectName], [$PACKAGE_NAME])
    AC_SUBST([ProjectVersion], [$PACKAGE_VERSION])
    AC_SUBST([ProjectGitCommitId], [$PACKAGE_GIT_COMMIT_ID])

    # Split PACKAGE_VERSION into (possibly empty) parts
    VERSION_MAJOR=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
    VERSION_TMP=`echo $PACKAGE_VERSION | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`
    VERSION_MINOR=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1'/`
    ProjectPatchLevel=`echo $VERSION_TMP | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3'/`

    # Calculate project version as an integer, using 2 digits for minor version
    case $VERSION_MINOR in
      ?) ProjectVersionInt=${VERSION_MAJOR}0${VERSION_MINOR} ;;
      ??) ProjectVersionInt=${VERSION_MAJOR}${VERSION_MINOR} ;;
      *) AC_MSG_ERROR([bad minor version in $PACKAGE_VERSION]) ;;
    esac
    AC_SUBST([ProjectVersionInt])

    # The project patchlevel is zero unless stated otherwise
    test -z "$ProjectPatchLevel" && ProjectPatchLevel=0

    # Save split version of ProjectPatchLevel
    ProjectPatchLevel1=`echo $ProjectPatchLevel | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\1/'`
    ProjectPatchLevel2=`echo $ProjectPatchLevel | sed 's/^\(@<:@^.@:>@*\)\(\.\{0,1\}\(.*\)\)$/\3/'`

    # The project patchlevel1/2 is zero unless stated otherwise
    test -z "$ProjectPatchLevel1" && ProjectPatchLevel1=0
    test -z "$ProjectPatchLevel2" && ProjectPatchLevel2=0

    AC_SUBST([ProjectPatchLevel1])
    AC_SUBST([ProjectPatchLevel2])

    # Remove dots from the patch level; this allows us to have versions like 6.4.1.20050508
    ProjectPatchLevel=`echo $ProjectPatchLevel | sed 's/\.//'`

    AC_SUBST([ProjectPatchLevel])

    # The version of the GHC package changes every day, since the
    # patchlevel is the current date.  We don't want to force
    # recompilation of the entire compiler when this happens, so for
    # GHC HEAD we omit the patchlevel from the package version number.
    #
    # The ProjectPatchLevel1 > 20000000 iff GHC HEAD. If it's for a stable
    # release like 7.10.1 or for a release candidate such as 7.10.1.20141224
    # then we don't omit the patchlevel components.

    ProjectVersionMunged="$ProjectVersion"
    if test "$ProjectPatchLevel1" -gt 20000000; then
      ProjectVersionMunged="${VERSION_MAJOR}.${VERSION_MINOR}"
    fi
    AC_SUBST([ProjectVersionMunged])
])# FP_SETUP_PROJECT_VERSION