Make sure ControlProtocolInfo objects are also cleaned up when
[ardour.git] / SConstruct
index 40b52d8db2b10bd70c486a36dd55c7449e5923c6..605c4f164251e5bec26309a841bb362d8b23fced 100644 (file)
@@ -16,7 +16,7 @@ import SCons.Node.FS
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
-version = '2.0beta6'
+version = '2.0beta8'
 
 subst_dict = { }
 
@@ -41,7 +41,7 @@ opts.AddOptions(
     PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
     BoolOption('SURFACES', 'Build support for control surfaces', 0),
     BoolOption('SYSLIBS', 'USE AT YOUR OWN RISK: CANCELS ALL SUPPORT FROM ARDOUR AUTHORS: Use existing system versions of various libraries instead of internal ones', 0),
-    BoolOption('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0),
+    BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
     BoolOption('VST', 'Compile with support for VST', 0)
 )
 
@@ -231,51 +231,58 @@ def i18n (buildenv, sources, installenv):
         moname = domain + '.mo'
         installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
 
+
+def fetch_svn_revision (path):
+    cmd = "svn info "
+    cmd += path
+    cmd += " | awk '/^Revision:/ { print $2}'"
+    return commands.getoutput (cmd)
+
+def recreate_stored_revision(target = None, source = None, env = None):
+    os.unlink ('svn_revision.h')
+    print "===========> Forcing recreation of svn_revision.h"
+    create_stored_revision ()
+    
+def create_stored_revision(target = None, source = None, env = None):
+    if os.path.exists('.svn'):    
+        rev = fetch_svn_revision ('.');
+        try:
+            text  = "#ifndef __ardour_svn_revision_h__\n"
+            text += "#define __ardour_svn_revision_h__\n"
+            text += "static const char* ardour_svn_revision = \"" + rev + "\";\n";
+            text += "#endif\n"
+            print '============> writing svn revision info to svn_revision.h\n'
+            o = file ('svn_revision.h', 'w')
+            o.write (text)
+            o.close ()
+        except IOError:
+            print "Could not open svn_revision.h for writing\n"
+            sys.exit (-1)
+    else:
+        if os.path.exists ('svn_revision.h') == False:
+            print "\n\nYou are missing svn_revision.h, which should have been included."
+            print "This is caused either by a packaging error, "
+            print "    or a configuration error with your system."
+            print "Please report this issue to the ardour-dev mailing list."
+            print "(See http://ardour.org/support for details)\n\n"
+            sys.exit (-1)
+
+#
+# if it exists, do not remove it
+#
+
+Precious('svn_revision.h')
+    
 #
 # A generic builder for version.cc files
 #
 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
 # note: assumes one source files, the header that declares the version variables
 #
-#def version_builder (target, source, env):
-#   text  = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
-#   text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
-#   text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
-#   
-#   try:
-#      o = file (target[0].get_path(), 'w')
-#      o.write (text)
-#      o.close ()
-#   except IOError:
-#      print "Could not open", target[0].get_path(), " for writing\n"
-#      sys.exit (-1)
-#   
-#   text  = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
-#   text += "#define __" + env['DOMAIN'] + "_version_h__\n"
-#   text += "extern int " + env['DOMAIN'] + "_major_version;\n"
-#   text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
-#   text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
-#   text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
-#   
-#   try:
-#      o = file (target[1].get_path(), 'w')
-#      o.write (text)
-#      o.close ();
-#   except IOError:
-#      print "Could not open", target[1].get_path(), " for writing\n"
-#      sys.exit (-1)
-#   
-#   return None
 
 def version_builder (target, source, env):
-    cmd = "svn info "
-    cmd += source[0].get_path()
-    cmd += " | awk '/^Revision:/ { print $2}'"
-    
-    rev = commands.getoutput (cmd)
-        
-    text  = "const char* " + env['DOMAIN'] + "_revision = \"" + rev + "\";\n"
-    text += "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
+
+    text  = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
     text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
     text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
     
@@ -298,7 +305,7 @@ def version_builder (target, source, env):
     try:
         o = file (target[1].get_path(), 'w')
         o.write (text)
-        o.close ();
+        o.close ()
     except IOError:
         print "Could not open", target[1].get_path(), " for writing\n"
         sys.exit (-1)
@@ -317,32 +324,18 @@ env.Append (BUILDERS = {'VersionBuild' : version_bld})
 #
 
 def versioned_builder(target,source,env):
-    # build ID is composed of a representation of the date of the last CVS transaction
-    # for this (SConscript) file
-    
-    try:
-        o = file (source[0].get_dir().get_path() +  '/CVS/Entries', "r")
-    except IOError:
-        print "Could not CVS/Entries for reading"
-        return -1
-    
-    last_date = ""
-    lines = o.readlines()
-    for line in lines:
-        if line[0:12] == '/SConscript/':
-            parts = line.split ("/")
-            last_date = parts[3]
-            break
-    o.close ()
+    w, r = os.popen2( "svn info | awk '/^Revision:/ { print $2}'")
     
-    if last_date == "":
-        print "No SConscript CVS update info found - versioned executable cannot be built"
+    last_revision = r.readline().strip()
+    w.close()
+    r.close()
+    if last_revision == "":
+        print "No SVN info found - versioned executable cannot be built"
         return -1
     
-    tag = time.strftime ('%Y%M%d%H%m', time.strptime (last_date))
-    print "The current build ID is " + tag
+    print "The current build ID is " + last_revision
     
-    tagged_executable = source[0].get_path() + '-' + tag
+    tagged_executable = source[0].get_path() + '-' + last_revision
     
     if os.path.exists (tagged_executable):
         print "Replacing existing executable with the same build tag."
@@ -501,7 +494,7 @@ libraries['flac'] = conf.Finish ()
 
 libraries['boost'] = LibraryInfo ()
 conf = Configure (libraries['boost'])
-if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == 0:
+if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
         print "Boost header files do not appear to be installed."
         sys.exit (1)
     
@@ -555,7 +548,7 @@ elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Co
     subst_dict['%MIDITAG%'] = "ardour"
     subst_dict['%MIDITYPE%'] = "coremidi"
 else:
-    print "It appears you don't have the required MIDI libraries installed."
+    print "It appears you don't have the required MIDI libraries installed. For Linux this means you are missing the development package for ALSA libraries."
     sys.exit (1)
 
 env = conf.Finish()
@@ -581,7 +574,7 @@ if env['SYSLIBS']:
 # cannot use system one for the time being
 #
     
-    libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
+    libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
 
@@ -648,7 +641,7 @@ else:
     libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
                                           LIBPATH='#libs/soundtouch',
                                           CPPPATH=['#libs', '#libs/soundtouch'])
-    libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
+    libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
 #    libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
@@ -746,10 +739,10 @@ config_prefix = '$DESTDIR' + final_config_prefix
 
 conf = Configure (env)
 
-have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
+have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
 if have_cxx[0] != 1:
     print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
-    exit (1)
+    sys.exit (1)
 else:
     print "Congratulations, you have a functioning C++ compiler."
 
@@ -974,6 +967,13 @@ env = conf.Finish()
 
 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
 
+#
+# making this into an Alias directly prevents scons from understanding how to build
+# svn_revision.h
+#
+
+the_revision = env.Command ('svn_revision.h', [], create_stored_revision)
+
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
 
@@ -983,13 +983,8 @@ Default (rcbuild)
 
 Precious (env['DISTTREE'])
 
-#
-# note the special "cleanfirst" source name. this triggers removal
-# of the existing disttree
-#
-
 env.Distribute (env['DISTTREE'],
-                [ 'SConstruct',
+                [ 'SConstruct', 'svn_revision.h',
                   'COPYING', 'PACKAGER_README', 'README',
                   'ardour.rc.in',
                   'ardour_system.rc',
@@ -1019,7 +1014,9 @@ env.Alias ('srctar', srcdist)
 #
 # don't leave the distree around
 #
+
 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
+env.AddPreAction (srcdist, Action (recreate_stored_revision))
 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
 
 #