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