Add "buildno" tool
Modified: trunk/reactos/Makefile
Added: trunk/reactos/include/reactos/version.h
Added: trunk/reactos/tools/buildno/
Added: trunk/reactos/tools/buildno/buildno.cpp
Added: trunk/reactos/tools/buildno/buildno.mak
Added: trunk/reactos/tools/buildno/pch.h
Modified: trunk/reactos/tools/tools.mak
  _____
Modified: trunk/reactos/Makefile
--- trunk/reactos/Makefile      2006-01-30 21:37:09 UTC (rev 56)
+++ trunk/reactos/Makefile      2006-01-30 21:46:14 UTC (rev 57)
@@ -348,19 +348,20 @@
 #include boot/freeldr/bootsect/bootsect.mak
 -include $(ROS_AUTOMAKE)
+#PREAUTO := \
+#      $(BIN2C_TARGET) \
+#      $(BIN2RES_TARGET) \
+#      $(BUILDNO_H) \
+#      $(BUGCODES_H) \
+#      $(BUGCODES_RC) \
+#      $(ERRCODES_H) \
+#      $(ERRCODES_RC) \
+#      $(NCI_SERVICE_FILES) \
+#      $(GENDIB_DIB_FILES)
 PREAUTO := \
-       $(BIN2C_TARGET) \
-       $(BIN2RES_TARGET) \
-       $(BUILDNO_H) \
-       $(BUGCODES_H) \
-       $(BUGCODES_RC) \
-       $(ERRCODES_H) \
-       $(ERRCODES_RC) \
-       $(NCI_SERVICE_FILES) \
-       $(GENDIB_DIB_FILES)
+       $(BUILDNO_H)
-#$(ROS_AUTOMAKE): $(RBUILD_TARGET) $(PREAUTO) $(XMLBUILDFILES)
-$(ROS_AUTOMAKE): $(RBUILD_TARGET) $(XMLBUILDFILES)
+$(ROS_AUTOMAKE): $(RBUILD_TARGET) $(PREAUTO) $(XMLBUILDFILES)
        $(ECHO_RBUILD)
        $(Q)$(RBUILD_TARGET) $(ROS_RBUILDFLAGS) mingw
  _____
Added: trunk/reactos/include/reactos/version.h
--- trunk/reactos/include/reactos/version.h     2006-01-30 21:37:09 UTC
(rev 56)
+++ trunk/reactos/include/reactos/version.h     2006-01-30 21:46:14 UTC
(rev 57)
@@ -0,0 +1,23 @@
+/*
+ * PROJECT:     ReactOS Kernel
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        include/reactos/version.h
+ * PURPOSE:     Defines the current version
+ * COPYRIGHT:   Copyright 1999 David Welch (welch(a)mcmail.com)
+ *              Copyright 1999-2002 Emanuelle Aliberti
+ */
+
+#ifndef __VERSION_H
+#define __VERSION_H
+
+#define KERNEL_VERSION_MAJOR           0
+#define KERNEL_VERSION_MINOR           3
+#define KERNEL_VERSION_PATCH_LEVEL     0
+
+/* KERNEL_VERSION_BUILD_TYPE is L"SVN", L"PR", L"RC" or
L"RELEASE" */
+#define KERNEL_VERSION_BUILD_TYPE      L"SVN"
+
+
+#endif
+
+/* EOF */
Property changes on: trunk/reactos/include/reactos/version.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native
Property changes on: trunk/reactos/tools/buildno
___________________________________________________________________
Name: ros:history
   +
------------------------------------------------------------------------
r19708 | royce | 2005-11-28 00:04:51 +0100 (Mon, 28 Nov 2005) | 1 line
move xml.h/cpp and ssprintf.h/cpp up a directory, make both rbuild and
buildno use these same files
------------------------------------------------------------------------
r19675 | sedwards | 2005-11-27 07:48:34 +0100 (Sun, 27 Nov 2005) | 1
line
XML.cpp -> xml.cpp, XML.h -> xml.h. Sorry Windows users, if you make
sure your stuff is in the correct case the first time then you wont have
problems when doing a svn update.
------------------------------------------------------------------------
r18952 | gvg | 2005-11-02 17:13:00 +0100 (Wed, 02 Nov 2005) | 3 lines
ScoTTie <scott(a)wizzer-it.com>/erie-- <seditaniedi(a)gmail.com>
Build fixes for FreeBSD
------------------------------------------------------------------------
r16941 | weiden | 2005-08-01 12:58:28 +0200 (Mon, 01 Aug 2005) | 1 line
define common build flags so they can easily be changed for all tools
------------------------------------------------------------------------
r16689 | sedwards | 2005-07-22 21:45:32 +0200 (Fri, 22 Jul 2005) | 1
line
some fixes for the host gcc4 on FC4
------------------------------------------------------------------------
r15809 | chorns | 2005-06-05 18:32:33 +0200 (Sun, 05 Jun 2005) | 1 line
Remove old makefiles
------------------------------------------------------------------------
r15583 | chorns | 2005-05-28 17:18:30 +0200 (Sat, 28 May 2005) | 1 line
Merge 12735:15568 from xmlbuildsystem branch
------------------------------------------------------------------------
r14910 | arty | 2005-05-01 13:24:07 +0200 (Sun, 01 May 2005) | 3 lines
Added HOST=mingw32-linux64 setting.
Fixed various small breakage for linux64 host.
------------------------------------------------------------------------
r13656 | gvg | 2005-02-20 00:05:09 +0100 (Sun, 20 Feb 2005) | 4 lines
Don't use svn command line tool to get revision number
XML code stolen from the xmlbuildsystem branch, we need
to merge this when merging the xmlbuildsystem back into trunk
------------------------------------------------------------------------
Name: ros:doc
   + ReactOS-specific build utility
  _____
Added: trunk/reactos/tools/buildno/buildno.cpp
--- trunk/reactos/tools/buildno/buildno.cpp     2006-01-30 21:37:09 UTC
(rev 56)
+++ trunk/reactos/tools/buildno/buildno.cpp     2006-01-30 21:46:14 UTC
(rev 57)
@@ -0,0 +1,371 @@
+/* $Id$
+ *
+ * buildno - Generate the build number for ReactOS
+ *
+ * Copyright (c) 1999,2000 Emanuele Aliberti
+ *
+ * The build number is the day on which the build took
+ * place, as YYYYMMDD
+ *
+ * The build number is stored in the file
+ * <reactos/buildno.h> as a set of macros:
+ *
+ * KERNEL_VERSION_BUILD                base 10 number
+ * KERNEL_VERSION_BUILD_STR    C string
+ * KERNEL_VERSION_BUILD_RC     RC string
+ *
+ * REVISIONS
+ * ---------
+ * 2000-01-22 (ea)
+ *     Fixed bugs: tm_year is (current_year - 1900),
+ *     tm_month is 0-11 not 1-12 and code ignored TZ.
+ * 2000-12-10 (ea)
+ *     Added -p option to make it simply print the
+ *     version number, but skip buildno.h generation.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include "version.h"
+#include "xml.h"
+
+#define FALSE 0
+#define TRUE  1
+
+static char * argv0 = "";
+static char * filename = "";
+
+#ifdef DBG
+void
+tm_dump (const char *tag, struct tm * t)
+{
+       printf ("%s->tm_sec   = %d\n", tag, t->tm_sec);
+       printf ("%s->tm_min   = %d\n", tag, t->tm_min);
+       printf ("%s->tm_hour  = %d\n", tag, t->tm_hour);
+       printf ("%s->tm_mday  = %d\n", tag, t->tm_mday);
+       printf ("%s->tm_mon   = %d\n", tag, t->tm_mon);
+       printf ("%s->tm_year  = %d\n", tag, t->tm_year);
+       printf ("%s->tm_wday  = %d\n", tag, t->tm_wday);
+       printf ("%s->tm_yday  = %d\n", tag, t->tm_yday);
+       printf ("%s->tm_isdst = %d\n\n", tag, t->tm_isdst);
+}
+#endif
+
+void
+write_h (int build, char *buildstr)
+{
+  FILE *h = NULL;
+  char* s;
+  char* s1;
+  unsigned int length;
+  int dllversion = KERNEL_VERSION_MAJOR + 42;
+
+  s1 = s = (char *) malloc(256 * 1024);
+
+  s = s + sprintf (s, "/* Do not edit - Machine generated */\n");
+
+  s = s + sprintf (s, "#ifndef _INC_REACTOS_BUILDNO\n" );
+  s = s + sprintf (s, "#define _INC_REACTOS_BUILDNO\n" );
+
+  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD\t%d\n", build);
+  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_STR\t\"%s\"\n",
buildstr);
+  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_RC\t\"%s\\0\"\n",
buildstr);
+  s = s + sprintf (s, "#define KERNEL_RELEASE_RC\t\"%d.%d",
+                  KERNEL_VERSION_MAJOR, KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\\0\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define KERNEL_RELEASE_STR\t\"%d.%d",
+                  KERNEL_VERSION_MAJOR,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define KERNEL_VERSION_RC\t\"%d.%d",
+                  KERNEL_VERSION_MAJOR,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\\0\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define KERNEL_VERSION_STR\t\"%d.%d",
+                  KERNEL_VERSION_MAJOR,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define REACTOS_DLL_VERSION_MAJOR\t%d\n",
dllversion);
+  s = s + sprintf (s, "#define REACTOS_DLL_RELEASE_RC\t\"%d.%d",
+                  dllversion, KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\\0\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define REACTOS_DLL_RELEASE_STR\t\"%d.%d",
+                  dllversion,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define REACTOS_DLL_VERSION_RC\t\"%d.%d",
+                  dllversion,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\\0\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#define REACTOS_DLL_VERSION_STR\t\"%d.%d",
+                  dllversion,
+                  KERNEL_VERSION_MINOR);
+  if (0 != KERNEL_VERSION_PATCH_LEVEL)
+    {
+      s = s + sprintf (s, ".%d", KERNEL_VERSION_PATCH_LEVEL);
+    }
+  s = s + sprintf (s, "-%S\"\n", KERNEL_VERSION_BUILD_TYPE);
+  s = s + sprintf (s, "#endif\n/* EOF */\n");
+
+  h = fopen (filename, "wb");
+  if (h != NULL)
+    {
+      fseek(h, 0, SEEK_END);
+      length = ftell(h);
+      if (length == strlen(s1))
+       {
+         char* orig;
+
+         orig = (char *) malloc(length);
+         fseek(h, 0, SEEK_SET);
+         fread(orig, 1, length, h);
+         if (memcmp(s1, orig, length) == 0)
+           {
+             fclose(h);
+             return;
+           }
+       }
+      fclose(h);
+    }
+
+  h = fopen (filename, "wb");
+  if (!h)
+    {
+      fprintf (stderr,
+              "%s: can not create file \"%s\"!\n",
+              argv0,
+              filename);
+      return;
+    }
+  fwrite(s1, 1, strlen(s1), h);
+  fclose (h);
+}
+
+char *
+GetRev(void)
+{
+  static char Unknown[] = "UNKNOWN";
+  static char Revision[10]; /* 999999999 revisions should be enough for
everyone... */
+
+  try
+    {
+      XMLElement *head;
+
+      try
+        {
+          head = XMLLoadFile(".svn/entries");
+        }
+      catch(XMLFileNotFoundException)
+        {
+          head = XMLLoadFile("_svn/entries");
+        }
+      XMLElement *entries = head->subElements[0];
+      for (size_t i = 0; i < entries->subElements.size(); i++)
+      {
+          XMLElement *entry = entries->subElements[i];
+          if ("entry" == entry->name)
+            {
+              bool GotName = false;
+              bool GotKind = false;
+              bool GotRevision = false;
+              for (size_t j = 0; j < entry->attributes.size(); j++)
+                {
+                  XMLAttribute *Attribute = entry->attributes[j];
+                  if ("name" == Attribute->name && "" ==
Attribute->value)
+                    {
+                      GotName = true;
+                    }
+                  if ("kind" == Attribute->name && "dir"
==
Attribute->value)
+                    {
+                      GotKind = true;
+                    }
+                  if ("revision" == Attribute->name)
+                    {
+                      if (sizeof(Revision) <= Attribute->value.length()
+ 1)
+                        {
+                          strcpy(Revision, "revtoobig");
+                        }
+                      else
+                        {
+                          strcpy(Revision, Attribute->value.c_str());
+                        }
+                      GotRevision = true;
+                    }
+                  if (GotName && GotKind && GotRevision)
+                    {
+                      delete head;
+                      return Revision;
+                    }
+                }
+            }
+        }
+
+      delete head;
+    }
+  catch(...)
+    {
+      ;
+    }
+
+  return Unknown;
+}
+
+
+void
+usage (void)
+{
+       fprintf (
+               stderr,
+               "Usage: %s [-{p|q}] path-to-header\n\n  -p  print
version number and exit\n  -q  run in quiet mode\n",
+               argv0
+               );
+       exit (EXIT_SUCCESS);
+}
+
+
+int
+main (int argc, char * argv [])
+{
+       int             print_only = FALSE;
+       int             quiet = FALSE;
+
+       int             build = 0;
+       char            buildstr[64];
+
+       time_t          t1 = 0;
+       struct tm       * t1_tm = NULL;
+
+       argv0 = argv[0];
+
+       switch (argc)
+       {
+               case 1:
+                       break;
+               case 2:
+               case 3:
+                       if (argv[1][0] == '-')
+                       {
+                               if (argv[1][1] == 'q')
+                               {
+                                       quiet = TRUE;
+                               }
+                               else  if (argv[1][1] == 'p')
+                               {
+                                       print_only = TRUE;
+                               }
+                               else
+                               {
+                                       usage ();
+                               }
+                               filename = argv[2];
+                       }
+                       else if (argc == 2)
+                       {
+                               filename = argv[1];
+                       }
+                       else
+                       {
+                               usage ();
+                       }
+                       break;
+               default:
+                       usage ();
+       }
+       /*
+        * Set TZ information.
+        */
+       tzset ();
+       /*
+        * We are building TODAY!
+        */
+       if (! quiet)
+       {
+               printf ( "\nReactOS Build Number Generator\n\n");
+       }
+
+       time (& t1); /* current build time */
+       t1_tm = gmtime (& t1);
+
+#ifdef DBG
+       tm_dump ("t1", t1_tm);
+#endif
+       t1_tm->tm_year += 1900;
+#ifdef DBG
+       tm_dump ("t1", t1_tm);
+#endif
+       if (! quiet)
+       {
+               printf (
+                       "Current date: %4d-%02d-%02d\n\n",
+                       t1_tm->tm_year,
+                       (t1_tm->tm_mon + 1),
+                       t1_tm->tm_mday
+                       );
+       }
+       /*
+        * Compute build number.
+        */
+       build = t1_tm->tm_year * 10000 + (t1_tm->tm_mon + 1) * 100 +
t1_tm->tm_mday;
+
+       sprintf(buildstr, "%d-r%s", build, GetRev());
+
+       if (! quiet)
+       {
+               printf (
+                       "ROS Version : %d.%d",
+                       KERNEL_VERSION_MAJOR,
+                       KERNEL_VERSION_MINOR
+                       );
+               if (0 != KERNEL_VERSION_PATCH_LEVEL)
+               {
+                       printf(".%d", KERNEL_VERSION_PATCH_LEVEL);
+               }
+               printf("-%S (Build %s)\n\n", KERNEL_VERSION_BUILD_TYPE,
buildstr);
+       }
+       /*
+        * (Over)write the include file, unless
+        * the user switched on -p.
+        */
+       if (! print_only)
+       {
+               write_h (build, buildstr);
+       }
+       else
+       {
+               printf ("%s: no code generated", argv [0]);
+       }
+
+       return EXIT_SUCCESS;
+}
+
+
+/* EOF */
Property changes on: trunk/reactos/tools/buildno/buildno.cpp
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native
  _____
Added: trunk/reactos/tools/buildno/buildno.mak
--- trunk/reactos/tools/buildno/buildno.mak     2006-01-30 21:37:09 UTC
(rev 56)
+++ trunk/reactos/tools/buildno/buildno.mak     2006-01-30 21:46:14 UTC
(rev 57)
@@ -0,0 +1,50 @@
+BUILDNO_BASE = $(TOOLS_BASE_)buildno
+BUILDNO_BASE_ = $(BUILDNO_BASE)$(SEP)
+BUILDNO_INT = $(INTERMEDIATE_)$(BUILDNO_BASE)
+BUILDNO_INT_ = $(BUILDNO_INT)$(SEP)
+BUILDNO_OUT = $(OUTPUT_)$(BUILDNO_BASE)
+BUILDNO_OUT_ = $(BUILDNO_OUT)$(SEP)
+
+$(BUILDNO_INT): | $(TOOLS_INT)
+       $(ECHO_MKDIR)
+       ${mkdir} $@
+
+ifneq ($(INTERMEDIATE),$(OUTPUT))
+$(BUILDNO_OUT): | $(TOOLS_OUT)
+       $(ECHO_MKDIR)
+       ${mkdir} $@
+endif
+
+BUILDNO_TARGET = \
+       $(EXEPREFIX)$(BUILDNO_OUT_)buildno$(EXEPOSTFIX)
+
+BUILDNO_SOURCES = $(addprefix $(BUILDNO_BASE_), \
+       buildno.cpp \
+       )
+
+BUILDNO_OBJECTS = \
+       $(addprefix $(INTERMEDIATE_), $(BUILDNO_SOURCES:.cpp=.o))
+
+BUILDNO_HOST_CXXFLAGS = -I$(TOOLS_BASE) -Iinclude/reactos
$(TOOLS_CPPFLAGS)
+
+BUILDNO_HOST_LFLAGS = $(TOOLS_LFLAGS)
+
+.PHONY: buildno
+buildno: $(BUILDNO_TARGET)
+
+$(BUILDNO_TARGET): $(BUILDNO_OBJECTS) $(XML_SSPRINTF_OBJECTS) |
$(BUILDNO_OUT)
+       $(ECHO_LD)
+       ${host_gpp} $^ $(BUILDNO_HOST_LFLAGS) -o $@
+
+$(BUILDNO_INT_)buildno.o: $(BUILDNO_BASE_)buildno.cpp | $(BUILDNO_INT)
+       $(ECHO_CC)
+       ${host_gpp} $(BUILDNO_HOST_CXXFLAGS) -c $< -o $@
+
+.PHONY: buildno_clean
+buildno_clean:
+       -@$(rm) $(BUILDNO_TARGET) $(BUILDNO_OBJECTS) 2>$(NUL)
+clean: buildno_clean
+
+$(BUILDNO_H): $(BUILDNO_TARGET)
+       $(ECHO_BUILDNO)
+       $(Q)$(BUILDNO_TARGET) $(BUILDNO_QUIET) $(BUILDNO_H)
Property changes on: trunk/reactos/tools/buildno/buildno.mak
___________________________________________________________________
Name: svn:eol-style
   + native
  _____
Added: trunk/reactos/tools/buildno/pch.h
--- trunk/reactos/tools/buildno/pch.h   2006-01-30 21:37:09 UTC (rev 56)
+++ trunk/reactos/tools/buildno/pch.h   2006-01-30 21:46:14 UTC (rev 57)
@@ -0,0 +1,47 @@
+// pre-compiled header stuff
+
+#ifndef PCH_H
+#define PCH_H
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4786 ) // identifier was truncated to '255'
characters in the debug information
+#endif//_MSC_VER
+
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+
+#include <stdarg.h>
+#ifndef RBUILD
+#include <ctype.h>
+#include <unistd.h>
+#endif
+
+#ifdef _MSC_VER
+#define MAX_PATH _MAX_PATH
+#endif
+
+#ifndef WIN32
+#include <wctype.h>
+#include <math.h>
+
+inline char * strlwr(char *x)
+{
+        char  *y=x;
+
+        while (*y) {
+                *y=tolower(*y);
+                y++;
+        }
+        return x;
+}
+
+#define _finite __finite
+#define _isnan __isnan
+#define stricmp strcasecmp
+#define MAX_PATH PATH_MAX
+#define _MAX_PATH PATH_MAX
+#endif
+
+#endif//PCH_H
Property changes on: trunk/reactos/tools/buildno/pch.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native
  _____
Modified: trunk/reactos/tools/tools.mak
--- trunk/reactos/tools/tools.mak       2006-01-30 21:37:09 UTC (rev 56)
+++ trunk/reactos/tools/tools.mak       2006-01-30 21:46:14 UTC (rev 57)
@@ -46,7 +46,7 @@
 #include tools/raddr2line.mak
 #include tools/pefixup.mak
 #include tools/bin2res/bin2res.mak
-#include tools/buildno/buildno.mak
+include tools/buildno/buildno.mak
 #include tools/cabman/cabman.mak
 include tools/cdmake/cdmake.mak
 #include tools/gendib/gendib.mak