makepack-dolibarrlang.pl 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. #!/usr/bin/perl
  2. #----------------------------------------------------------------------------
  3. # \file build/makepack-dolibarrlang.pl
  4. # \brief Package builder (tgz, zip, rpm, deb, exe)
  5. # \author (c)2005 Laurent Destailleur <eldy@users.sourceforge.net>
  6. #----------------------------------------------------------------------------
  7. use Cwd;
  8. $PROJECT = "dolibarr";
  9. @LISTETARGET = ("TGZ"); # Possible packages
  10. %REQUIREMENTTARGET = ( # Tool requirement for each package
  11. "TGZ" => "tar",
  12. "ZIP" => "7z",
  13. "EXE" => "makensis.exe"
  14. );
  15. %ALTERNATEPATH = (
  16. "7z" => "7-ZIP",
  17. "makensis.exe" => "NSIS"
  18. );
  19. use vars qw/ $REVISION $VERSION /;
  20. $REVISION = '$Revision: 1.10 $';
  21. $REVISION =~ /\s(.*)\s/;
  22. $REVISION = $1;
  23. $VERSION = "1.0 (build $REVISION)";
  24. #------------------------------------------------------------------------------
  25. # MAIN
  26. #------------------------------------------------------------------------------
  27. ( $DIR = $0 ) =~ s/([^\/\\]+)$//;
  28. ( $PROG = $1 ) =~ s/\.([^\.]*)$//;
  29. $Extension = $1;
  30. $DIR ||= '.';
  31. $DIR =~ s/([^\/\\])[\\\/]+$/$1/;
  32. # Detect OS type
  33. # --------------
  34. if ( "$^O" =~ /linux/i || ( -d "/etc" && -d "/var" && "$^O" !~ /cygwin/i ) ) {
  35. $OS = 'linux';
  36. $CR = '';
  37. }
  38. elsif ( -d "/etc" && -d "/Users" ) { $OS = 'macosx'; $CR = ''; }
  39. elsif ( "$^O" =~ /cygwin/i || "$^O" =~ /win32/i ) {
  40. $OS = 'windows';
  41. $CR = "\r";
  42. }
  43. if ( !$OS ) {
  44. print "makepack-dolbarrlang.pl was not able to detect your OS.\n";
  45. print "Can't continue.\n";
  46. print "makepack-dolibarrlang.pl aborted.\n";
  47. sleep 2;
  48. exit 1;
  49. }
  50. # Define buildroot
  51. # ----------------
  52. if ( $OS =~ /linux/ ) {
  53. $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "/tmp";
  54. }
  55. if ( $OS =~ /macos/ ) {
  56. $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "/tmp";
  57. }
  58. if ( $OS =~ /windows/ ) {
  59. $TEMP = $ENV{"TEMP"} || $ENV{"TMP"} || "c:/temp";
  60. $PROGPATH = $ENV{"ProgramFiles"};
  61. }
  62. if ( !$TEMP || !-d $TEMP ) {
  63. print "Error: A temporary directory can not be find.\n";
  64. print "Check that TEMP or TMP environment variable is set correctly.\n";
  65. print "makepack-dolibarrlang.pl aborted.\n";
  66. sleep 2;
  67. exit 2;
  68. }
  69. $BUILDROOT = "$TEMP/dolibarr-buildroot";
  70. my $copyalreadydone = 0;
  71. my $batch = 0;
  72. print "Makepack langs version $VERSION\n";
  73. print "Enter language code to package (en_US, fr_FR, ...) : ";
  74. $PROJECT = <STDIN>;
  75. chomp($PROJECT);
  76. # Ask and set version $MAJOR and $MINOR
  77. print "Enter value for version: ";
  78. $PROJVERSION = <STDIN>;
  79. chomp($PROJVERSION);
  80. ( $MAJOR, $MINOR ) = split( /\./, $PROJVERSION, 2 );
  81. if ( $MINOR eq '' ) {
  82. print "Enter value for minor version: ";
  83. $MINOR = <STDIN>;
  84. chomp($MINOR);
  85. }
  86. $FILENAME = "$PROJECT";
  87. $FILENAMETGZ = "lang_$PROJECT-$MAJOR.$MINOR";
  88. if ( -d "/usr/src/redhat" ) {
  89. # redhat
  90. $RPMDIR = "/usr/src/redhat";
  91. }
  92. if ( -d "/usr/src/RPM" ) {
  93. # mandrake
  94. $RPMDIR = "/usr/src/RPM";
  95. }
  96. $SOURCE = "$DIR/../../dolibarr";
  97. $DESTI = "$SOURCE/build";
  98. # Choose package targets
  99. #-----------------------
  100. $target = "ZIP"; # Les langs sont au format zip
  101. if ($target) {
  102. $CHOOSEDTARGET{ uc($target) } = 1;
  103. }
  104. else {
  105. my $found = 0;
  106. my $NUM_SCRIPT;
  107. while ( !$found ) {
  108. my $cpt = 0;
  109. printf( " %d - %3s (%s)\n",
  110. $cpt, "All", "Need " . join( ",", values %REQUIREMENTTARGET ) );
  111. foreach my $target (@LISTETARGET) {
  112. $cpt++;
  113. printf( " %d - %3s (%s)\n",
  114. $cpt, $target, "Need " . $REQUIREMENTTARGET{$target} );
  115. }
  116. # Are asked to select the file to move
  117. print "Choose one package number or several separated with space: ";
  118. $NUM_SCRIPT = <STDIN>;
  119. chomp($NUM_SCRIPT);
  120. if ( $NUM_SCRIPT =~ s/-//g ) {
  121. # Do not do copy
  122. $copyalreadydone = 1;
  123. }
  124. if ( $NUM_SCRIPT !~ /^[0-$cpt\s]+$/ ) {
  125. print "This is not a valid package number list.\n";
  126. $found = 0;
  127. }
  128. else {
  129. $found = 1;
  130. }
  131. }
  132. print "\n";
  133. if ($NUM_SCRIPT) {
  134. foreach my $num ( split( /\s+/, $NUM_SCRIPT ) ) {
  135. $CHOOSEDTARGET{ $LISTETARGET[ $num - 1 ] } = 1;
  136. }
  137. }
  138. else {
  139. foreach my $key (@LISTETARGET) {
  140. $CHOOSEDTARGET{$key} = 1;
  141. }
  142. }
  143. }
  144. # Test if requirement is ok
  145. #--------------------------
  146. foreach my $target ( keys %CHOOSEDTARGET ) {
  147. foreach my $req ( split( /[,\s]/, $REQUIREMENTTARGET{$target} ) ) {
  148. # Test
  149. print "Test requirement for target $target: Search '$req'... ";
  150. $ret = `"$req" 2>&1`;
  151. $coderetour = $?;
  152. $coderetour2 = $coderetour >> 8;
  153. if (
  154. $coderetour != 0
  155. && ( ( $coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i )
  156. || ( $coderetour2 == 127 && $OS !~ /windows/ ) )
  157. && $PROGPATH
  158. )
  159. {
  160. # Not found error, we try in PROGPATH
  161. $ret = `"$PROGPATH/$ALTERNATEPATH{$req}/$req\" 2>&1`;
  162. $coderetour = $?;
  163. $coderetour2 = $coderetour >> 8;
  164. $REQUIREMENTTARGET{$target} = "$PROGPATH/$ALTERNATEPATH{$req}/$req";
  165. }
  166. if (
  167. $coderetour != 0
  168. && ( ( $coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i )
  169. || ( $coderetour2 == 127 && $OS !~ /windows/ ) )
  170. )
  171. {
  172. # Not found error
  173. print
  174. "Not found\nCan't build target $target. Requirement '$req' not found in PATH\n";
  175. $CHOOSEDTARGET{$target} = -1;
  176. last;
  177. }
  178. else {
  179. # Pas erreur ou erreur autre que programme absent
  180. print " Found " . $REQUIREMENTTARGET{$target} . "\n";
  181. }
  182. }
  183. }
  184. print "\n";
  185. # Check if there is at least on target to build
  186. #----------------------------------------------
  187. $nboftargetok = 0;
  188. foreach my $target ( keys %CHOOSEDTARGET ) {
  189. if ( $CHOOSEDTARGET{$target} < 0 ) { next; }
  190. $nboftargetok++;
  191. }
  192. if ($nboftargetok) {
  193. # Update buildroot
  194. #-----------------
  195. if ( !$copyalreadydone ) {
  196. print "Delete directory $BUILDROOT\n";
  197. $ret = `rm -fr "$BUILDROOT"`;
  198. mkdir "$BUILDROOT";
  199. mkdir "$BUILDROOT/htdocs";
  200. mkdir "$BUILDROOT/htdocs/langs";
  201. mkdir "$BUILDROOT/htdocs/langs/$PROJECT";
  202. print "Copy $SOURCE into $BUILDROOT\n";
  203. mkdir "$BUILDROOT";
  204. $ret =
  205. `cp -pr "$SOURCE/htdocs/langs/$PROJECT" "$BUILDROOT/htdocs/langs"`;
  206. }
  207. print "Clean $BUILDROOT\n";
  208. $ret =
  209. `rm -fr $BUILDROOT/htdocs/langs/$PROJECT/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/*/Thumbs.db $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/Thumbs.db`;
  210. $ret =
  211. `rm -fr $BUILDROOT/htdocs/langs/$PROJECT/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/*/CVS* $BUILDROOT/htdocs/langs/$PROJECT/*/*/*/*/*/CVS*`;
  212. # Build package for each target
  213. #------------------------------
  214. foreach my $target ( keys %CHOOSEDTARGET )
  215. {
  216. if ( $CHOOSEDTARGET{$target} < 0 ) { next; }
  217. print "\nBuild package for target $target\n";
  218. if ( $target eq 'TGZ' )
  219. {
  220. unlink $FILENAMETGZ . tgz;
  221. # unlink $BUILDROOT/$FILENAMETGZ.tgz;
  222. print "Compress $BUILDROOT/htdocs into $FILENAMETGZ.tgz...\n";
  223. $cmd =
  224. "tar --exclude-vcs --exclude-from \"$DESTI/tgz/tar.exclude\" --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$FILENAMETGZ.tgz\" htdocs";
  225. $ret = `$cmd`;
  226. # $cmd="tar --exclude-vcs --exclude-from \"$DESTI/tgz/tar.exclude\" --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$BUILDROOT/$FILENAMETGZ.tgz\" htdocs\n";
  227. # $ret=`$cmd`;
  228. if ( $OS =~ /windows/i ) {
  229. print "Move $FILENAMETGZ.tgz to $DESTI/$FILENAMETGZ.tgz\n";
  230. $ret = `mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
  231. # $ret=`mv "$BUILDROOT/$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
  232. }
  233. next;
  234. }
  235. if ( $target eq 'ZIP' )
  236. {
  237. unlink $FILENAMEZIP . zip;
  238. print "Compress $FILENAMETGZ into $FILENAMEZIP.zip...\n";
  239. chdir("$BUILDROOT");
  240. #print "cd $BUILDROOTNT & 7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*\n";
  241. #$ret=`cd $BUILDROOTNT & 7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*`;
  242. $ret =
  243. `7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip $FILENAMETGZ\\*.*`;
  244. print "Move $FILENAMEZIP.zip to $DESTI\n";
  245. rename( "$BUILDROOT/$FILENAMEZIP.zip", "$DESTI/$FILENAMEZIP.zip" );
  246. next;
  247. }
  248. }
  249. }
  250. print "\n----- Summary -----\n";
  251. foreach my $target ( keys %CHOOSEDTARGET ) {
  252. if ( $CHOOSEDTARGET{$target} < 0 ) {
  253. print "Package $target not built (bad requirement).\n";
  254. }
  255. else {
  256. print "Package $target built succeessfully in $DESTI\n";
  257. }
  258. }
  259. if ( !$btach ) {
  260. print "\nPress key to finish...";
  261. my $WAITKEY = <STDIN>;
  262. }
  263. 0;