release.tcl file
diff --git a/src/release.tcl b/src/release.tcl
new file mode 100755
index 0000000..998bc95
--- /dev/null
+++ b/src/release.tcl
@@ -0,0 +1,204 @@
+#!/usr/bin/tclsh
+
+# Copyright 2019 Alain Dargelas
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Either creates all releases, or just the one passed as argument:
+#
+# ./release.tcl
+#
+# Or
+#
+# ./release.tcl "<build_type> <lib_type>"
+#
+# Ex.: ./release.tcl  "release  tcmalloc"
+
+#  build_type: release, debug, advanced (debug)
+
+#set RELEASES { { "release"  "notcmalloc" }  { "release"  "tcmalloc" } \
+#               { "debug"    "notcmalloc" }  { "debug"    "tcmalloc" } \
+#	       { "advanced" "notcmalloc" }  { "advanced" "tcmalloc" } \
+#             } 
+
+set RELEASES { { "release"  "notcmalloc" }  { "release"  "tcmalloc" } \
+               { "debug"    "notcmalloc" }  { "debug"    "tcmalloc" } 
+             } 
+
+
+if {$argv != ""} {
+    set RELEASES $argv
+} 
+
+proc precompilePackages { } {
+    set source_file "../parser/SV3_1aParser.cpp"
+    set compiled_file "Release/GNU-Linux/pkg/work/uvm_pkg.sv.slpa"
+    set source_time 0
+    if [file exist $source_file] {
+	set source_time [file mtime $source_file]
+    }
+    set compiled_time 0
+    if [file exist $compiled_file] {
+	set compiled_time [file mtime $compiled_file]
+    }
+    exec sh -c "rm -rf Release/sv"
+    exec sh -c "mkdir -p Release/sv; cp ../API/builtin.sv Release/sv"
+    if {($compiled_time == 0) || ($source_time >= $compiled_time)} {
+	exec sh -c "rm -rf slpp_all"
+	exec sh -c "rm -rf slpp_unit"
+	exec sh -c "rm -rf dist/slpp_all"
+	exec sh -c "rm -rf dist/slpp_unit"
+	exec sh -c "rm -rf Release/GNU-Linux/pkg/work/"
+	exec sh -c "rm -f ovm-2.1.2 uvm-1.2 vmm-1.1.1a"
+	exec sh -c "ln -s ../../UVM/ovm-2.1.2 ovm-2.1.2"
+	exec sh -c "ln -s ../../UVM/uvm-1.2 uvm-1.2"
+	exec sh -c "ln -s ../../UVM/vmm-1.1.1a vmm-1.1.1a"
+	puts "Precompiling ovm_pkg..."
+	puts "Begin: The time is: [clock format [clock seconds] -format %H:%M:%S]"
+	exec sh -c "Release/GNU-Linux/surelog -profile -createcache +incdir+ovm-2.1.2/src/ +incdir+vmm-1.1.1a/sv ovm-2.1.2/src/ovm_pkg.sv -writepp -verbose  -mt 0 -parse; cp slpp_all/surelog.log ovm_pkg.log" 
+	puts "End: The time is: [clock format [clock seconds] -format %H:%M:%S]"
+	puts "Precompiling uvm_pkg..."
+	puts "Begin: The time is: [clock format [clock seconds] -format %H:%M:%S]"
+	exec sh -c "Release/GNU-Linux/surelog -profile -createcache +incdir+.+uvm-1.2/src/ uvm-1.2/src/uvm_pkg.sv -writepp -verbose  -mt 0 -parse; cp slpp_all/surelog.log uvm_pkg.log" 
+	puts "End: The time is: [clock format [clock seconds] -format %H:%M:%S]"
+	
+    } else {
+	puts "Skipping ovm_pkg..."
+	puts "Skipping uvm_pkg..."
+
+    }
+    
+    catch {exec sh -c "cp -R -f Release/GNU-Linux/pkg/work Debug/GNU-Linux/pkg"} dummy
+    catch {exec sh -c "cp -R -f Release/GNU-Linux/pkg/work AdvancedDebug/GNU-Linux/pkg"} dummy 
+    catch {exec sh -c "cp -R -f Release/GNU-Linux/pkg/work ReleaseNoTcMalloc/GNU-Linux/pkg"} dummy 
+
+}
+
+proc createReleases { } {
+    global RELEASES 
+    foreach release $RELEASES {
+	set build_type [lindex $release 0] 
+	set lib_type   [lindex $release 1] 
+	set tar_filename "surelog_${build_type}_${lib_type}"
+	catch {exec sh -c "chmod 777 -R surelog/"} dummy
+	exec sh -c "rm -rf surelog"
+	file mkdir surelog
+	file mkdir surelog/bin
+	file mkdir surelog/bin/pkg
+	file mkdir surelog/bin/pkg/work
+	file mkdir surelog/lib
+	file mkdir surelog/python
+	file mkdir surelog/sv
+	file copy  Release/GNU-Linux/pkg/work/uvm_pkg.sv.slpp surelog/bin/pkg/work
+	file copy  Release/GNU-Linux/pkg/work/uvm_pkg.sv.slpa surelog/bin/pkg/work
+	file copy  Release/GNU-Linux/pkg/work/ovm_pkg.sv.slpp surelog/bin/pkg/work
+	file copy  Release/GNU-Linux/pkg/work/ovm_pkg.sv.slpa surelog/bin/pkg/work
+	if {($build_type == "release")} {
+	    if {$lib_type == "tcmalloc"} {
+		file copy Release/GNU-Linux/surelog surelog/bin/surelog.exe
+		catch {exec sh -c "mkdir -p Release/python; ln -s ../../../API/slSV3_1aPythonListener.py Release/python"} dummy
+		catch {exec sh -c "mkdir -p Release/sv; ln -s ../../../API/builtin.sv Release/sv"} dummy
+	    } else {
+		file copy ReleaseNoTcMalloc/GNU-Linux/surelog surelog/bin/surelog.exe
+		catch {exec sh -c "mkdir -p ReleaseNoTcMalloc/python; ln -s ../../../API/slSV3_1aPythonListener.py ReleaseNoTcMalloc/python"} dummy
+		catch {exec sh -c "mkdir -p ReleaseNoTcMalloc/sv; ln -s ../../../API/builtin.sv ReleaseNoTcMalloc/sv"} dummy
+	    }
+	} elseif {$build_type == "debug"}  {
+	    file copy Debug/GNU-Linux/surelog surelog/bin/surelog.exe
+	    catch {exec sh -c "mkdir -p Debug/python; ln -s ../../../API/slSV3_1aPythonListener.py Debug/python"} dummy
+	    catch {exec sh -c "mkdir -p Debug/sv; ln -s ../../../API/builtin.sv Debug/sv"} dummy
+	} elseif {$build_type == "advanced"}  {
+	    file copy AdvancedDebug/GNU-Linux/surelog surelog/bin/surelog.exe
+	    catch {exec sh -c "mkdir -p AdvancedDebug/python; ln -s ../../../API/slSV3_1aPythonListener.py AdvancedDebug/python"} dummy
+	    catch {exec sh -c "mkdir -p AdvancedDebug/sv; ln -s ../../../API/builtin.sv AdvancedDebug/sv"} dummy
+	} else {
+	    puts "ERROR!!! UNSUPPORTED BUILD TYPE: $build_type"
+	    exit
+	}
+
+	if {$lib_type == "tcmalloc"} {
+	    catch {file copy /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4 surelog/lib/} dummy
+	    catch {file copy /usr/lib/x86_64-linux-gnu/libtcmalloc.so.4.2.6 surelog/lib/} dummy
+	    catch {file copy /usr/lib/libtcmalloc.so.4 surelog/lib/} dummy
+	    catch {file copy /usr/lib/libtcmalloc.so.4.2.6 surelog/lib/} dummy
+	    #if ![file exists "surelog/lib/libtcmalloc.so.4"] {
+	   #	error "No Tclmalloc found on system"
+	   # }
+
+	}
+
+	file copy ../API/slSV3_1aPythonListener.py surelog/python/
+	file copy ../API/slformatmsg.py surelog/python/slformatmsg.py
+	file copy ../API/slwaivers.py surelog/python/
+	file copy ../API/surelog.bash surelog/surelog
+	file copy ../API/yosys.tcl surelog/yosys.tcl
+	file copy ../API/builtin.sv surelog/sv
+	catch {set copy_result [file copy /usr/local/lib64/libstdc++.so.6.0.21 surelog/lib/libstdc++.so.6]} copy_result
+	catch {set copy_result [file copy /usr/local/lib64/libgcc_s.so.1 surelog/lib/]} copy_result
+	exec sh -c "chmod 555 -R surelog/"
+	
+	exec sh -c "tar cvzf ${tar_filename}.tar.gz surelog/"
+	puts "Created  dist/${tar_filename}.tar.gz"
+    }
+
+}
+
+proc testReleases { } {
+    global RELEASES 
+    foreach release $RELEASES {
+	set build_type [lindex $release 0] 
+	set lib_type   [lindex $release 1] 
+	set tar_filename "surelog_${build_type}_${lib_type}"
+
+	exec sh -c "chmod 777 -R surelog/"
+	exec sh -c "rm -rf surelog"
+
+	exec sh -c "tar xvzf ${tar_filename}.tar.gz"
+
+	catch {exec sh -c "chmod 777 -R surelog_test/"} dummy
+	exec sh -c "rm -rf surelog_test"
+	file mkdir surelog_test
+	file copy "../python_listener.py" "surelog_test/slSV3_1aPythonListener.py"
+	cd surelog_test
+	
+	set fid [open "test.v" "w"]
+	puts $fid "module toto();\
+                   `TOTO  \
+                   endmodule"
+	close $fid
+
+	catch {set result [exec sh -c "../surelog/surelog test.v -parse -pythonlistener"]} result
+	if {[regexp {PY0403} $result] && [regexp {module toto} $result]} {
+	    puts "PASS: $tar_filename"
+	} else {
+	    puts "FAIL: $tar_filename"
+	    puts "$result"
+	}
+
+	cd ..
+
+    }
+
+}
+
+cd dist
+
+precompilePackages
+
+createReleases 
+
+testReleases 
+
+cd ..
+
+