makepack-dolibarrmodule.pl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. #!/usr/bin/perl
  2. #----------------------------------------------------------------------------
  3. # \file build/makepack-dolibarrmodule.pl
  4. # \brief Package builder (tgz, zip, rpm, deb, exe)
  5. # \author (c)2005-2006 Laurent Destailleur <eldy@users.sourceforge.net>
  6. #----------------------------------------------------------------------------
  7. use Cwd;
  8. @LISTETARGET=("TGZ"); # Possible packages
  9. %REQUIREMENTTARGET=( # Tool requirement for each package
  10. "TGZ"=>"tar",
  11. "ZIP"=>"7z"
  12. );
  13. %ALTERNATEPATH=(
  14. );
  15. use vars qw/ $REVISION $VERSION /;
  16. $REVISION='$Revision: 1.20 $'; $REVISION =~ /\s(.*)\s/; $REVISION=$1;
  17. $VERSION="1.0 (build $REVISION)";
  18. #------------------------------------------------------------------------------
  19. # MAIN
  20. #------------------------------------------------------------------------------
  21. ($DIR=$0) =~ s/([^\/\\]+)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1;
  22. $DIR||='.'; $DIR =~ s/([^\/\\])[\\\/]+$/$1/;
  23. # Detect OS type
  24. # --------------
  25. if ("$^O" =~ /linux/i || (-d "/etc" && -d "/var" && "$^O" !~ /cygwin/i)) { $OS='linux'; $CR=''; }
  26. elsif (-d "/etc" && -d "/Users") { $OS='macosx'; $CR=''; }
  27. elsif ("$^O" =~ /cygwin/i || "$^O" =~ /win32/i) { $OS='windows'; $CR="\r"; }
  28. if (! $OS) {
  29. print "makepack-dolbarrmodule.pl was not able to detect your OS.\n";
  30. print "Can't continue.\n";
  31. print "makepack-dolibarrmodule.pl aborted.\n";
  32. sleep 2;
  33. exit 1;
  34. }
  35. # Define buildroot
  36. # ----------------
  37. if ($OS =~ /linux/) {
  38. $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp";
  39. }
  40. if ($OS =~ /macos/) {
  41. $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp";
  42. }
  43. if ($OS =~ /windows/) {
  44. $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"c:/temp";
  45. $PROGPATH=$ENV{"ProgramFiles"};
  46. }
  47. if (! $TEMP || ! -d $TEMP) {
  48. print "Error: A temporary directory can not be find.\n";
  49. print "Check that TEMP or TMP environment variable is set correctly.\n";
  50. print "makepack-dolibarrmodule.pl aborted.\n";
  51. sleep 2;
  52. exit 2;
  53. }
  54. $BUILDROOT="$TEMP/dolibarr-buildroot";
  55. my $copyalreadydone=0;
  56. my $batch=0;
  57. for (0..@ARGV-1) {
  58. if ($ARGV[$_] =~ /^-*target=(\w+)/i) { $target=$1; $batch=1; }
  59. if ($ARGV[$_] =~ /^-*desti=(.+)/i) { $DESTI=$1; }
  60. if ($ARGV[$_] =~ /^-*prefix=(.+)/i) {
  61. $PREFIX=$1;
  62. $FILENAMESNAPSHOT.="-".$PREFIX;
  63. }
  64. }
  65. print "Makepack for modules version $VERSION\n";
  66. # Ask and set version $MAJOR and $MINOR
  67. print "Enter value for version: ";
  68. $PROJVERSION=<STDIN>;
  69. chomp($PROJVERSION);
  70. ($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3);
  71. if ($MINOR eq '')
  72. {
  73. print "Enter value for minor version: ";
  74. $MINOR=<STDIN>;
  75. chomp($MINOR);
  76. }
  77. # Ask module
  78. print "Enter name for your module (mymodule, mywonderfulmondule, ... or 'all') : ";
  79. $PROJECTINPUT=<STDIN>;
  80. chomp($PROJECTINPUT);
  81. print "Move to ".$DIR." directory.\n";
  82. chdir($DIR);
  83. $SOURCE="$DIR/..";
  84. $DESTI="$SOURCE/build";
  85. print "Source directory: $SOURCE\n";
  86. print "Target directory: $DESTI\n";
  87. my @PROJECTLIST=();
  88. if ($PROJECTINPUT eq "all")
  89. {
  90. opendir(DIR, $DIR) || return;
  91. local @rv = grep { /^makepack\-(.*)\.conf$/ } sort readdir(DIR);
  92. closedir(DIR);
  93. foreach my $xxx (0..@rv-1) {
  94. if ($rv[$xxx] =~ /^makepack\-(.*)\.conf$/)
  95. {
  96. @PROJECTLIST[$xxx]=$1;
  97. }
  98. }
  99. }
  100. else
  101. {
  102. @PROJECTLIST=($PROJECTINPUT);
  103. }
  104. # Loop on each projects
  105. foreach my $PROJECT (@PROJECTLIST) {
  106. if (! -f "makepack-".$PROJECT.".conf")
  107. {
  108. print "Error: can't open conf file makepack-".$PROJECT.".conf\n";
  109. print "\n";
  110. print "For help on building a module package, see web page\n";
  111. print "http://wiki.dolibarr.org/index.php/Module_development#Create_a_package_to_distribute_and_install_your_module\n";
  112. print "makepack-dolibarrmodule.pl aborted.\n";
  113. sleep 2;
  114. exit 2;
  115. }
  116. $FILENAME="$PROJECT";
  117. $FILENAMETGZ="module_$PROJECT-$MAJOR.$MINOR";
  118. $FILENAMEZIP="module_$PROJECT-$MAJOR.$MINOR";
  119. if (-d "/usr/src/redhat") {
  120. # redhat
  121. $RPMDIR="/usr/src/redhat";
  122. }
  123. if (-d "/usr/src/RPM") {
  124. # mandrake
  125. $RPMDIR="/usr/src/RPM";
  126. }
  127. # Choose package targets
  128. #-----------------------
  129. $target="ZIP"; # Dolibarr modules are this format
  130. $CHOOSEDTARGET{uc($target)}=1;
  131. # Test if requirement is ok
  132. #--------------------------
  133. foreach my $target (keys %CHOOSEDTARGET) {
  134. foreach my $req (split(/[,\s]/,$REQUIREMENTTARGET{$target})) {
  135. # Test
  136. print "Test requirement for target $target: Search '$req'... ";
  137. $ret=`"$req" 2>&1`;
  138. $coderetour=$?; $coderetour2=$coderetour>>8;
  139. if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/)) && $PROGPATH) {
  140. # Not found error, we try in PROGPATH
  141. $ret=`"$PROGPATH/$ALTERNATEPATH{$req}/$req\" 2>&1`;
  142. $coderetour=$?; $coderetour2=$coderetour>>8;
  143. $REQUIREMENTTARGET{$target}="$PROGPATH/$ALTERNATEPATH{$req}/$req";
  144. }
  145. if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/))) {
  146. # Not found error
  147. print "Not found\nCan't build target $target. Requirement '$req' not found in PATH\n";
  148. $CHOOSEDTARGET{$target}=-1;
  149. last;
  150. } else {
  151. # Pas erreur ou erreur autre que programme absent
  152. print " Found ".$REQUIREMENTTARGET{$target}."\n";
  153. }
  154. }
  155. }
  156. print "\n";
  157. # Check if there is at least on target to build
  158. #----------------------------------------------
  159. $nboftargetok=0;
  160. $nboftargetneedbuildroot=0;
  161. $nboftargetneedcvs=0;
  162. foreach my $target (keys %CHOOSEDTARGET) {
  163. if ($CHOOSEDTARGET{$target} < 0) { next; }
  164. if ($target ne 'EXE' && $target ne 'EXEDOLIWAMP')
  165. {
  166. $nboftargetneedbuildroot++;
  167. }
  168. if ($target eq 'SNAPSHOT')
  169. {
  170. $nboftargetneedcvs++;
  171. }
  172. $nboftargetok++;
  173. }
  174. if ($nboftargetok) {
  175. # Update CVS if required
  176. #-----------------------
  177. if ($nboftargetneedcvs)
  178. {
  179. print "Go to directory $SOURCE\n";
  180. $olddir=getcwd();
  181. chdir("$SOURCE");
  182. print "Run cvs update -P -d\n";
  183. $ret=`cvs update -P -d 2>&1`;
  184. chdir("$olddir");
  185. }
  186. # Update buildroot if required
  187. #-----------------------------
  188. if ($nboftargetneedbuildroot)
  189. {
  190. if (! $copyalreadydone) {
  191. print "Delete directory $BUILDROOT\n";
  192. $ret=`rm -fr "$BUILDROOT"`;
  193. mkdir "$BUILDROOT";
  194. mkdir "$BUILDROOT/$PROJECT";
  195. $result=open(IN,"<makepack-".$PROJECT.".conf");
  196. if (! $result) { die "Error: Can't open conf file makepack-".$PROJECT.".conf for reading.\n"; }
  197. while(<IN>)
  198. {
  199. if ($_ =~ /^#/) { next; } # Do not process comments
  200. $_ =~ s/\n//;
  201. $_ =~ /^(.*)\/[^\/]+/;
  202. print "Create directory $BUILDROOT/$PROJECT/$1\n";
  203. $ret=`mkdir -p "$BUILDROOT/$PROJECT/$1"`;
  204. if ($_ !~ /version\-/)
  205. {
  206. print "Copy $SOURCE/$_ into $BUILDROOT/$PROJECT/$_\n";
  207. $ret=`cp -pr "$SOURCE/$_" "$BUILDROOT/$PROJECT/$_"`;
  208. }
  209. }
  210. close IN;
  211. @timearray=localtime(time());
  212. $fulldate=($timearray[5]+1900).'-'.($timearray[4]+1).'-'.$timearray[3].' '.$timearray[2].':'.$timearray[1];
  213. open(VF,">$BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt");
  214. print "Create version file $BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt with date ".$fulldate."\n";
  215. $ret=`mkdir -p "$BUILDROOT/$PROJECT/build"`;
  216. print VF "Version: ".$MAJOR.".".$MINOR."\n";
  217. print VF "Build : ".$fulldate."\n";
  218. close VF;
  219. }
  220. print "Clean $BUILDROOT\n";
  221. $ret=`rm -fr $BUILDROOT/$PROJECT/.cache`;
  222. $ret=`rm -fr $BUILDROOT/$PROJECT/.project`;
  223. $ret=`rm -fr $BUILDROOT/$PROJECT/.settings`;
  224. $ret=`rm -fr $BUILDROOT/$PROJECT/index.php`;
  225. $ret=`rm -fr $BUILDROOT/$PROJECT/build/html`;
  226. $ret=`rm -fr $BUILDROOT/$PROJECT/documents`;
  227. $ret=`rm -fr $BUILDROOT/$PROJECT/document`;
  228. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.mysql`;
  229. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.old`;
  230. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.postgres`;
  231. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf*sav*`;
  232. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom`;
  233. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom2`;
  234. $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/theme/bureau2crea`;
  235. $ret=`rm -fr $BUILDROOT/$PROJECT/test`;
  236. $ret=`rm -fr $BUILDROOT/$PROJECT/Thumbs.db $BUILDROOT/$PROJECT/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/*/Thumbs.db`;
  237. $ret=`rm -fr $BUILDROOT/$PROJECT/CVS* $BUILDROOT/$PROJECT/*/CVS* $BUILDROOT/$PROJECT/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/*/CVS*`;
  238. }
  239. # Build package for each target
  240. #------------------------------
  241. foreach my $target (keys %CHOOSEDTARGET) {
  242. if ($CHOOSEDTARGET{$target} < 0) { next; }
  243. print "\nBuild package for target $target\n";
  244. if ($target eq 'TGZ') {
  245. print "Remove target $FILENAMETGZ.tgz...\n";
  246. unlink("$DESTI/$FILENAMETGZ.tgz");
  247. print "Compress $BUILDROOT/* into $FILENAMETGZ.tgz...\n";
  248. $cmd="tar --exclude-vcs --exclude *.tgz --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$FILENAMETGZ.tgz\" .";
  249. $ret=`$cmd`;
  250. if ($OS =~ /windows/i) {
  251. print "Move $FILENAMETGZ.tgz to $DESTI/$FILENAMETGZ.tgz\n";
  252. $ret=`mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
  253. }
  254. else
  255. {
  256. $ret=`mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
  257. }
  258. next;
  259. }
  260. if ($target eq 'ZIP') {
  261. print "Remove target $FILENAMEZIP.zip...\n";
  262. unlink "$DESTI/$FILENAMEZIP.zip";
  263. print "Compress $FILENAMEZIP into $FILENAMEZIP.zip...\n";
  264. print "Go to directory $BUILDROOT/$PROJECT\n";
  265. $olddir=getcwd();
  266. chdir("$BUILDROOT/$PROJECT");
  267. $cmd= "7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip *";
  268. print $cmd."\n";
  269. $ret= `$cmd`;
  270. chdir("$olddir");
  271. print "Move $FILENAMEZIP.zip to $DESTI/$FILENAMEZIP.zip\n";
  272. $ret=`mv "$BUILDROOT/$FILENAMEZIP.zip" "$DESTI/$FILENAMEZIP.zip"`;
  273. next;
  274. }
  275. if ($target eq 'EXE') {
  276. print "Remove target $FILENAMEEXE.exe...\n";
  277. unlink "$DESTI/$FILENAMEEXE.exe";
  278. print "Compress into $FILENAMEEXE.exe by $FILENAMEEXE.nsi...\n";
  279. $command="\"$REQUIREMENTTARGET{$target}\" /DMUI_VERSION_DOT=$MAJOR.$MINOR.$BUILD /X\"SetCompressor bzip2\" \"$SOURCE\\build\\exe\\$FILENAME.nsi\"";
  280. print "$command\n";
  281. $ret=`$command`;
  282. print "Move $FILENAMEEXE.exe to $DESTI\n";
  283. rename("$SOURCE\\build\\exe\\$FILENAMEEXE.exe","$DESTI/$FILENAMEEXE.exe");
  284. next;
  285. }
  286. }
  287. }
  288. print "\n----- Summary -----\n";
  289. foreach my $target (keys %CHOOSEDTARGET) {
  290. if ($CHOOSEDTARGET{$target} < 0) {
  291. print "Package $target not built (bad requirement).\n";
  292. } else {
  293. print "Package $target built successfully in $DESTI\n";
  294. }
  295. }
  296. }
  297. if (! $batch) {
  298. print "\nPress key to finish...";
  299. my $WAITKEY=<STDIN>;
  300. }
  301. 0;