astxs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/perl
  2. my $astdir = $ENV{ASTSRC} || "/usr/src/asterisk";
  3. sub esystem($) {
  4. my $cmd = shift;
  5. print "$cmd\n";
  6. system($cmd);
  7. }
  8. sub usage($) {
  9. my $str = shift;
  10. print "\n$str\n\n";
  11. print "Usage $0 [ <module.c> [-set=<varname>:<value>] [-append=<varname>:<value>] [-install] ] | [-help] \n\n";
  12. print "varnames of interest:
  13. ===============================================================================
  14. 'INCLUDES' 'ASTLIBDIR' 'AGI_DIR' 'ASTVARRUNDIR' 'CC' 'ASTETCDIR' 'EXTOBJ'
  15. 'ASTSPOOLDIR' 'ASTLOGDIR' 'MODULES_DIR' 'ASTSBINDIR' 'ASTHEADERDIR' 'LDFLAGS'
  16. 'ASTVARLIBDIR' 'ASTBINDIR' 'INSTALL_PREFIX' 'ASTCONFPATH' 'ASTSRC' 'CFLAGS'
  17. ===============================================================================
  18. ";
  19. exit;
  20. }
  21. my %avars = ();
  22. my %svars = ();
  23. my %vars = ();
  24. my %args = ();
  25. foreach(@ARGV) {
  26. if(/^\-set=([^\:]+):(.*)/) {
  27. $svars{$1} = $2;
  28. }
  29. elsif(/^\-append=([^\:]+):(.*)/) {
  30. $avars{$1} .= " $2";
  31. }
  32. elsif(/^\-([^\=]+)=(.*)/) {
  33. $args{$1} = $2;
  34. }
  35. elsif(/^\-([^\=]+)$/) {
  36. $args{$1}++;
  37. }
  38. else {
  39. push(@{$args{plain}},$_);
  40. }
  41. }
  42. if($args{help} or $args{h}) {
  43. usage "Help";
  44. }
  45. my $pwd = `/bin/pwd`;
  46. chomp($pwd);
  47. $vars{astdir} ||= $astdir;
  48. chdir($vars{astdir});
  49. my $type = $args{type} || "apps";
  50. my $env = `make ${type}_env`;
  51. chdir($pwd);
  52. foreach(split("\n",$env)) {
  53. my($var,$val) = /([^\=]+)\=(.*)/;
  54. $vars{$var} = $val;
  55. }
  56. foreach(keys %svars) {
  57. $vars{$_} = $svars{$_};
  58. }
  59. foreach(keys %avars) {
  60. $vars{$_} .= $avars{$_};
  61. }
  62. if($args{print}) {
  63. print "$vars{$args{print}}";
  64. exit;
  65. }
  66. my($base,$ext);
  67. my $cfile = $args{plain}->[0];
  68. if($cfile =~ /http:\/\/.*?\/([^\/]+)$/) {
  69. my $f = $1;
  70. if(! -d "/tmp/astbld") {
  71. mkdir("/tmp/astbld");
  72. }
  73. my $pwd = `pwd`;
  74. chomp $pwd;
  75. chdir("/tmp/astbld");
  76. system("/bin/rm $f");
  77. system("wget $cfile");
  78. chdir($pwd);
  79. $cfile = "/tmp/astbld/$f";
  80. }
  81. if($cfile) {
  82. ($base,$ext) = $cfile =~ /^([^\.]+)\.(.+)/;
  83. }
  84. if($ext eq "so") {
  85. unless($args{linkonly}) {
  86. $args{installonly}++;
  87. }
  88. } elsif($ext ne "c") {
  89. usage "Bad Input File";
  90. }
  91. my $bad=0;
  92. $bad = esystem("$vars{CC} $vars{CFLAGS} -c ${base}.c -o ${base}.o") unless($args{linkonly} or $args{installonly});
  93. exit -1 if($bad);
  94. exit if($args{nolink});
  95. $vars{MAINOBJ} ||= "$base.o";
  96. $bad = esystem("$vars{CC} $vars{SOLINK} -o $vars{LDFLAGS} ${base}.so $vars{MAINOBJ} $vars{EXTOBJ}") if(!$bad and !$args{installonly});
  97. exit -1 if($bad);
  98. if(($args{install} or $args{installonly}) and $vars{MODULES_DIR}) {
  99. my $file = "${base}.so";
  100. my ($mod) = $file =~ /([^\/]*)$/;
  101. if($args{autoload}) {
  102. $bad = esystem("/usr/sbin/asterisk -rx 'unload $mod'");
  103. }
  104. $bad = esystem("/bin/cp -p ${base}.so $vars{MODULES_DIR}") if(!$bad);
  105. if($args{autoload}) {
  106. $bad = esystem("/usr/sbin/asterisk -rx 'load $mod'");
  107. }
  108. }