123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- #!/usr/bin/perl
- #----------------------------------------------------------------------------
- # \file build/makepack-dolibarrmodule.pl
- # \brief Package builder (tgz, zip, rpm, deb, exe)
- # \author (c)2005-2006 Laurent Destailleur <eldy@users.sourceforge.net>
- #----------------------------------------------------------------------------
- use Cwd;
- @LISTETARGET=("TGZ"); # Possible packages
- %REQUIREMENTTARGET=( # Tool requirement for each package
- "TGZ"=>"tar",
- "ZIP"=>"7z"
- );
- %ALTERNATEPATH=(
- );
- use vars qw/ $REVISION $VERSION /;
- $REVISION='$Revision: 1.20 $'; $REVISION =~ /\s(.*)\s/; $REVISION=$1;
- $VERSION="1.0 (build $REVISION)";
- #------------------------------------------------------------------------------
- # MAIN
- #------------------------------------------------------------------------------
- ($DIR=$0) =~ s/([^\/\\]+)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1;
- $DIR||='.'; $DIR =~ s/([^\/\\])[\\\/]+$/$1/;
- # Detect OS type
- # --------------
- if ("$^O" =~ /linux/i || (-d "/etc" && -d "/var" && "$^O" !~ /cygwin/i)) { $OS='linux'; $CR=''; }
- elsif (-d "/etc" && -d "/Users") { $OS='macosx'; $CR=''; }
- elsif ("$^O" =~ /cygwin/i || "$^O" =~ /win32/i) { $OS='windows'; $CR="\r"; }
- if (! $OS) {
- print "makepack-dolbarrmodule.pl was not able to detect your OS.\n";
- print "Can't continue.\n";
- print "makepack-dolibarrmodule.pl aborted.\n";
- sleep 2;
- exit 1;
- }
- # Define buildroot
- # ----------------
- if ($OS =~ /linux/) {
- $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp";
- }
- if ($OS =~ /macos/) {
- $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp";
- }
- if ($OS =~ /windows/) {
- $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"c:/temp";
- $PROGPATH=$ENV{"ProgramFiles"};
- }
- if (! $TEMP || ! -d $TEMP) {
- print "Error: A temporary directory can not be find.\n";
- print "Check that TEMP or TMP environment variable is set correctly.\n";
- print "makepack-dolibarrmodule.pl aborted.\n";
- sleep 2;
- exit 2;
- }
- $BUILDROOT="$TEMP/dolibarr-buildroot";
- my $copyalreadydone=0;
- my $batch=0;
- for (0..@ARGV-1) {
- if ($ARGV[$_] =~ /^-*target=(\w+)/i) { $target=$1; $batch=1; }
- if ($ARGV[$_] =~ /^-*desti=(.+)/i) { $DESTI=$1; }
- if ($ARGV[$_] =~ /^-*prefix=(.+)/i) {
- $PREFIX=$1;
- $FILENAMESNAPSHOT.="-".$PREFIX;
- }
- }
- print "Makepack for modules version $VERSION\n";
- # Ask and set version $MAJOR and $MINOR
- print "Enter value for version: ";
- $PROJVERSION=<STDIN>;
- chomp($PROJVERSION);
- ($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3);
- if ($MINOR eq '')
- {
- print "Enter value for minor version: ";
- $MINOR=<STDIN>;
- chomp($MINOR);
- }
- # Ask module
- print "Enter name for your module (mymodule, mywonderfulmondule, ... or 'all') : ";
- $PROJECTINPUT=<STDIN>;
- chomp($PROJECTINPUT);
- print "Move to ".$DIR." directory.\n";
- chdir($DIR);
- $SOURCE="$DIR/..";
- $DESTI="$SOURCE/build";
- print "Source directory: $SOURCE\n";
- print "Target directory: $DESTI\n";
- my @PROJECTLIST=();
- if ($PROJECTINPUT eq "all")
- {
- opendir(DIR, $DIR) || return;
- local @rv = grep { /^makepack\-(.*)\.conf$/ } sort readdir(DIR);
- closedir(DIR);
- foreach my $xxx (0..@rv-1) {
- if ($rv[$xxx] =~ /^makepack\-(.*)\.conf$/)
- {
- @PROJECTLIST[$xxx]=$1;
- }
- }
- }
- else
- {
- @PROJECTLIST=($PROJECTINPUT);
- }
- # Loop on each projects
- foreach my $PROJECT (@PROJECTLIST) {
-
- if (! -f "makepack-".$PROJECT.".conf")
- {
- print "Error: can't open conf file makepack-".$PROJECT.".conf\n";
- print "\n";
- print "For help on building a module package, see web page\n";
- print "http://wiki.dolibarr.org/index.php/Module_development#Create_a_package_to_distribute_and_install_your_module\n";
- print "makepack-dolibarrmodule.pl aborted.\n";
- sleep 2;
- exit 2;
- }
-
- $FILENAME="$PROJECT";
- $FILENAMETGZ="module_$PROJECT-$MAJOR.$MINOR";
- $FILENAMEZIP="module_$PROJECT-$MAJOR.$MINOR";
- if (-d "/usr/src/redhat") {
- # redhat
- $RPMDIR="/usr/src/redhat";
- }
- if (-d "/usr/src/RPM") {
- # mandrake
- $RPMDIR="/usr/src/RPM";
- }
-
-
- # Choose package targets
- #-----------------------
- $target="ZIP"; # Dolibarr modules are this format
- $CHOOSEDTARGET{uc($target)}=1;
-
-
- # Test if requirement is ok
- #--------------------------
- foreach my $target (keys %CHOOSEDTARGET) {
- foreach my $req (split(/[,\s]/,$REQUIREMENTTARGET{$target})) {
- # Test
- print "Test requirement for target $target: Search '$req'... ";
- $ret=`"$req" 2>&1`;
- $coderetour=$?; $coderetour2=$coderetour>>8;
- if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/)) && $PROGPATH) {
- # Not found error, we try in PROGPATH
- $ret=`"$PROGPATH/$ALTERNATEPATH{$req}/$req\" 2>&1`;
- $coderetour=$?; $coderetour2=$coderetour>>8;
- $REQUIREMENTTARGET{$target}="$PROGPATH/$ALTERNATEPATH{$req}/$req";
- }
-
- if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/))) {
- # Not found error
- print "Not found\nCan't build target $target. Requirement '$req' not found in PATH\n";
- $CHOOSEDTARGET{$target}=-1;
- last;
- } else {
- # Pas erreur ou erreur autre que programme absent
- print " Found ".$REQUIREMENTTARGET{$target}."\n";
- }
- }
- }
-
- print "\n";
-
- # Check if there is at least on target to build
- #----------------------------------------------
- $nboftargetok=0;
- $nboftargetneedbuildroot=0;
- $nboftargetneedcvs=0;
- foreach my $target (keys %CHOOSEDTARGET) {
- if ($CHOOSEDTARGET{$target} < 0) { next; }
- if ($target ne 'EXE' && $target ne 'EXEDOLIWAMP')
- {
- $nboftargetneedbuildroot++;
- }
- if ($target eq 'SNAPSHOT')
- {
- $nboftargetneedcvs++;
- }
- $nboftargetok++;
- }
-
- if ($nboftargetok) {
-
- # Update CVS if required
- #-----------------------
- if ($nboftargetneedcvs)
- {
- print "Go to directory $SOURCE\n";
- $olddir=getcwd();
- chdir("$SOURCE");
- print "Run cvs update -P -d\n";
- $ret=`cvs update -P -d 2>&1`;
- chdir("$olddir");
- }
-
- # Update buildroot if required
- #-----------------------------
- if ($nboftargetneedbuildroot)
- {
- if (! $copyalreadydone) {
- print "Delete directory $BUILDROOT\n";
- $ret=`rm -fr "$BUILDROOT"`;
-
- mkdir "$BUILDROOT";
- mkdir "$BUILDROOT/$PROJECT";
-
- $result=open(IN,"<makepack-".$PROJECT.".conf");
- if (! $result) { die "Error: Can't open conf file makepack-".$PROJECT.".conf for reading.\n"; }
- while(<IN>)
- {
- if ($_ =~ /^#/) { next; } # Do not process comments
-
- $_ =~ s/\n//;
- $_ =~ /^(.*)\/[^\/]+/;
- print "Create directory $BUILDROOT/$PROJECT/$1\n";
- $ret=`mkdir -p "$BUILDROOT/$PROJECT/$1"`;
- if ($_ !~ /version\-/)
- {
- print "Copy $SOURCE/$_ into $BUILDROOT/$PROJECT/$_\n";
- $ret=`cp -pr "$SOURCE/$_" "$BUILDROOT/$PROJECT/$_"`;
- }
- }
- close IN;
-
- @timearray=localtime(time());
- $fulldate=($timearray[5]+1900).'-'.($timearray[4]+1).'-'.$timearray[3].' '.$timearray[2].':'.$timearray[1];
- open(VF,">$BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt");
-
- print "Create version file $BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt with date ".$fulldate."\n";
- $ret=`mkdir -p "$BUILDROOT/$PROJECT/build"`;
- print VF "Version: ".$MAJOR.".".$MINOR."\n";
- print VF "Build : ".$fulldate."\n";
- close VF;
- }
- print "Clean $BUILDROOT\n";
- $ret=`rm -fr $BUILDROOT/$PROJECT/.cache`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/.project`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/.settings`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/index.php`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/build/html`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/documents`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/document`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.mysql`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.old`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.postgres`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf*sav*`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom2`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/theme/bureau2crea`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/test`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/Thumbs.db $BUILDROOT/$PROJECT/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/*/Thumbs.db`;
- $ret=`rm -fr $BUILDROOT/$PROJECT/CVS* $BUILDROOT/$PROJECT/*/CVS* $BUILDROOT/$PROJECT/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/*/CVS*`;
- }
-
- # Build package for each target
- #------------------------------
- foreach my $target (keys %CHOOSEDTARGET) {
- if ($CHOOSEDTARGET{$target} < 0) { next; }
-
- print "\nBuild package for target $target\n";
-
- if ($target eq 'TGZ') {
- print "Remove target $FILENAMETGZ.tgz...\n";
- unlink("$DESTI/$FILENAMETGZ.tgz");
- print "Compress $BUILDROOT/* into $FILENAMETGZ.tgz...\n";
- $cmd="tar --exclude-vcs --exclude *.tgz --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$FILENAMETGZ.tgz\" .";
- $ret=`$cmd`;
- if ($OS =~ /windows/i) {
- print "Move $FILENAMETGZ.tgz to $DESTI/$FILENAMETGZ.tgz\n";
- $ret=`mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
- }
- else
- {
- $ret=`mv "$FILENAMETGZ.tgz" "$DESTI/$FILENAMETGZ.tgz"`;
- }
- next;
- }
-
- if ($target eq 'ZIP') {
- print "Remove target $FILENAMEZIP.zip...\n";
- unlink "$DESTI/$FILENAMEZIP.zip";
- print "Compress $FILENAMEZIP into $FILENAMEZIP.zip...\n";
-
- print "Go to directory $BUILDROOT/$PROJECT\n";
- $olddir=getcwd();
- chdir("$BUILDROOT/$PROJECT");
- $cmd= "7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip *";
- print $cmd."\n";
- $ret= `$cmd`;
- chdir("$olddir");
-
- print "Move $FILENAMEZIP.zip to $DESTI/$FILENAMEZIP.zip\n";
- $ret=`mv "$BUILDROOT/$FILENAMEZIP.zip" "$DESTI/$FILENAMEZIP.zip"`;
- next;
- }
-
- if ($target eq 'EXE') {
- print "Remove target $FILENAMEEXE.exe...\n";
- unlink "$DESTI/$FILENAMEEXE.exe";
- print "Compress into $FILENAMEEXE.exe by $FILENAMEEXE.nsi...\n";
- $command="\"$REQUIREMENTTARGET{$target}\" /DMUI_VERSION_DOT=$MAJOR.$MINOR.$BUILD /X\"SetCompressor bzip2\" \"$SOURCE\\build\\exe\\$FILENAME.nsi\"";
- print "$command\n";
- $ret=`$command`;
- print "Move $FILENAMEEXE.exe to $DESTI\n";
- rename("$SOURCE\\build\\exe\\$FILENAMEEXE.exe","$DESTI/$FILENAMEEXE.exe");
- next;
- }
-
- }
-
- }
-
- print "\n----- Summary -----\n";
- foreach my $target (keys %CHOOSEDTARGET) {
- if ($CHOOSEDTARGET{$target} < 0) {
- print "Package $target not built (bad requirement).\n";
- } else {
- print "Package $target built successfully in $DESTI\n";
- }
- }
- }
- if (! $batch) {
- print "\nPress key to finish...";
- my $WAITKEY=<STDIN>;
- }
- 0;
|