Fixed data races in EllenBinTree (TSan)
[libcds.git] / tools / make_distrib.pl
1 #!/usr/bin/perl\r
2 \r
3 my $curDir = `cd`;\r
4 \r
5 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\r
6 $year += 1900;\r
7 \r
8 \r
9 # Get libcds version\r
10 my $Version = get_version();\r
11 print "Make libcds-$Version distributive\n";\r
12 \r
13 my $DistrDir = get_distrib_dir();\r
14 print "Distrib dir: $DistrDir\n";\r
15 \r
16 # Git clone\r
17 my $GitBranch = get_git_branch();\r
18 my $GitRepo = get_git_repo();\r
19 print "Clone git: repo=$GitRepo, branch=$GitBranch\n";\r
20 `git clone -b $GitBranch $GitRepo $DistrDir` or die "Error cloning branch $GitBranch to $DistrDir\n";\r
21 print "Remove $DistrDir/.git directory\n";\r
22 `rm -fr $DistrDir/.git`;\r
23 `rm -f $DistrDir/.gitignore $DistrDir/tools/brush_cds.pl $DistrDir/tools/make_distrib.pl $DistrDir/tools/make_distrib.bat`;\r
24 \r
25 print "make copyright...\n" ;\r
26 makeCopyright($DistrDir);\r
27 \r
28 print "patch files...\n";\r
29 patch_file("$DistrDir/build/Makefile", 'VERSION=\d+\.\d+\.\d+', "VERSION=$Version" );\r
30 patch_file("$DistrDir/CMakeList.txt", 'PROJECT_VERSION \d+\.\d+\.\d+', "PROJECT_VERSION $Version" );\r
31 patch_file("$DistrDir/doxygen/cds.doxy", 'PROJECT_NUMBER\s*=\s*\d+\.\d+\.\d+', "PROJECT_NUMBER = $Version" ) ;\r
32 patch_file("$DistrDir/projects/android/jni/Android.mk", 'CDS_LIBRARY_VERSION\s*:=\s*\d+\.\d+\.\d+', \r
33    "CDS_LIBRARY_VERSION := $Version" );\r
34 \r
35 print "Make docs\n";\r
36 `cd $DistrDir/tools && make_docs.bat && rm doxygen.log && cd $curDir`;\r
37   \r
38 print "make zip...\n" ;\r
39 `rm -f $DistrDir/../cds-$Version.zip` ;\r
40 `cd $DistrDir/.. && 7za a cds-$Version.zip cds-$Version` ;\r
41 \r
42 print "Done\n" ;\r
43 exit ;\r
44 \r
45   \r
46 sub get_version()\r
47 {\r
48         my $version;\r
49         open( my $fh, 'cds/version.h' ) or die "ERROR: Cannot find ../cds/version.h file";\r
50         binmode $fh ;\r
51         \r
52         while (<$fh>) {\r
53                 if ( /CDS_VERSION_STRING.+(\d+\.\d+\.\d+)/ ) {\r
54                         $version = $1 ;\r
55                         last    ;\r
56                 }\r
57         }\r
58         close $fh ;\r
59         die "ERROR: cannot find version in ../cds/version.h" unless $version ;\r
60 }\r
61 \r
62 sub get_distrib_dir()\r
63 {\r
64         my $dir = "../cds-distrib/cds-$Version";\r
65         `rm -fr $dir` if -d $dir;\r
66         mkdir $dir;\r
67         return $dir;\r
68 }\r
69 \r
70 sub get_git_repo()\r
71 {\r
72         return 'git@github.com:khizmax/libcds.git';\r
73 }\r
74 \r
75 sub get_git_branch()\r
76 {\r
77         my $branchList = `git branch`;\r
78         #print "$branchList\n";\r
79         \r
80         # Search "v$Version-rc" branch\r
81         my ($branch) = $branchList =~ /(v$Version-rc\d*)/g;\r
82         return $branch || 'master';\r
83 }\r
84 \r
85 sub makeCopyright($) \r
86 {\r
87         my $distrDir = shift;\r
88         processDir( "$distrDir/cds" ) ;\r
89         processDir( "$distrDir/src" ) ;\r
90         processDir( "$distrDir/tests/test-hdr" ) ;\r
91         processDir( "$distrDir/tests/unit" ) ;\r
92         processDir( "$distrDir/tests/cppunit" ) ;\r
93 }\r
94 \r
95 sub processDir( $ )\r
96 {\r
97         my $dirName = shift ;\r
98         \r
99         opendir(my $dh, $dirName) || die "can't opendir $dirName: $!";\r
100     my @files = grep { /^[^\.]/ } readdir($dh);\r
101     closedir $dh;\r
102         \r
103         foreach my $file ( @files ) {\r
104                 if ( -d "$dirName/$file" ) {\r
105                         processDir("$dirName/$file")    ;\r
106                 }\r
107                 elsif ( $file =~ /\.(h|cpp)$/ ) {\r
108                         processFile( "$dirName/$file" ) ;\r
109                 }\r
110         }\r
111 }\r
112 \r
113 sub processFile( $ ) \r
114 {\r
115         my $file = shift        ;\r
116 \r
117         \r
118         if ( open( my $fh, $file )) {\r
119                 binmode $fh     ;\r
120                 my $str = ''            ;\r
121                 while (<$fh>) {\r
122                         if ( /^\/\/\$\$CDS-header\$\$/ ) {\r
123                                 $str .= \r
124 "/*\r
125     This file is a part of libcds - Concurrent Data Structures library\r
126     Version: $Version\r
127 \r
128     (C) Copyright Maxim Khizhinsky (libcds.dev\@gmail.com) 2006-$year\r
129     Distributed under the BSD license (see accompanying file license.txt)\r
130 \r
131     Source code repo: http://github.com/khizmax/libcds/\r
132     Download: http://sourceforge.net/projects/libcds/files/\r
133 */\n" ;\r
134                         }\r
135                         elsif ( /^\/\/\$\$CDS-\/\*\$\$/ ) {\r
136                                 $str .= "/*\n" ;\r
137                         }\r
138                         elsif ( /^\/\/\$\$CDS-\*\/\$\$/ ) {\r
139                                 $str .= "*/\n" ;\r
140                         }\r
141                         else {\r
142                 $nTabsFound += $_ =~ s/\t/    /g;\r
143                 $_ =~ s/\s+$//  ;\r
144                                 $_ =~ s/\s+;$/;/;\r
145                                 $str .= $_      ;\r
146                 $str .= "\n"    ;\r
147                         }\r
148                 }\r
149                 close $fh       ;\r
150                 \r
151                 if ( open( my $fh, ">$file" )) {\r
152                         binmode $fh     ;\r
153                         print $fh $str  ;\r
154                         close $fh               ;\r
155                 }\r
156         }\r
157 }\r
158 \r
159 sub patch_file(@) {\r
160         my $file = shift        ;\r
161         my $seek = shift        ;\r
162         my $repl = shift        ;\r
163         \r
164         if ( open( my $fh, $file )) {\r
165                 binmode $fh     ;\r
166                 \r
167                 my $str = ''    ;\r
168                 $str .= $_ while <$fh>  ;\r
169                 close $fh ;\r
170                 \r
171                 $str =~ s/$seek/$repl/g ;\r
172                 \r
173                 if ( open( my $fh, ">$file" )) {\r
174                         binmode $fh     ;\r
175                         print $fh $str  ;\r
176                         close $fh               ;\r
177                 }\r
178         }\r
179 }\r