summaryrefslogtreecommitdiff
path: root/buildtools/mktowscript
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/mktowscript')
-rw-r--r--buildtools/mktowscript/mklist.txt85
-rwxr-xr-xbuildtools/mktowscript/mktowscript.pl294
-rwxr-xr-xbuildtools/mktowscript/rebuild_all.sh29
3 files changed, 408 insertions, 0 deletions
diff --git a/buildtools/mktowscript/mklist.txt b/buildtools/mktowscript/mklist.txt
new file mode 100644
index 0000000000..3e0e1a1959
--- /dev/null
+++ b/buildtools/mktowscript/mklist.txt
@@ -0,0 +1,85 @@
+source4/main.mk
+pidl/config.mk
+nsswitch/config.mk
+nsswitch/libwbclient/config.mk
+source4/lib/ldb-samba/config.mk
+source4/librpc/config.mk
+source4/utils/config.mk
+source4/utils/net/config.mk
+source4/scripting/python/config.mk
+source4/auth/config.mk
+source4/auth/gensec/config.mk
+source4/auth/kerberos/config.mk
+source4/auth/ntlm/config.mk
+source4/auth/credentials/config.mk
+source4/auth/ntlmssp/config.mk
+source4/libnet/config.mk
+source4/nbt_server/config.mk
+source4/wrepl_server/config.mk
+source4/ntvfs/config.mk
+source4/ntvfs/unixuid/config.mk
+source4/ntvfs/sysdep/config.mk
+source4/ntvfs/common/config.mk
+source4/ntvfs/posix/config.mk
+source4/selftest/config.mk
+source4/cldap_server/config.mk
+source4/smb_server/config.mk
+source4/smb_server/smb2/config.mk
+source4/smb_server/smb/config.mk
+source4/smbd/config.mk
+source4/kdc/config.mk
+source4/dsdb/config.mk
+source4/dsdb/samdb/ldb_modules/config.mk
+source4/web_server/config.mk
+source4/param/config.mk
+source4/winbind/config.mk
+source4/cluster/config.mk
+source4/client/config.mk
+source4/ntptr/config.mk
+source4/rpc_server/config.mk
+source4/libcli/config.mk
+source4/libcli/smb2/config.mk
+source4/libcli/wbclient/config.mk
+source4/libcli/security/config.mk
+source4/libcli/ldap/config.mk
+source4/ntp_signd/config.mk
+source4/torture/config.mk
+source4/torture/smb2/config.mk
+source4/torture/local/config.mk
+source4/torture/drs/config.mk
+source4/torture/winbind/config.mk
+source4/torture/libsmbclient/config.mk
+source4/torture/libnetapi/config.mk
+source4/lib/messaging/config.mk
+source4/lib/events/config.mk
+source4/lib/stream/config.mk
+source4/lib/cmdline/config.mk
+source4/lib/com/config.mk
+source4/lib/registry/config.mk
+source4/lib/wmi/config.mk
+source4/lib/socket/config.mk
+source4/lib/tls/config.mk
+source4/lib/samba3/config.mk
+source4/ldap_server/config.mk
+libgpo/config.mk
+libcli/cldap/config.mk
+libcli/samsync/config.mk
+libcli/nbt/config.mk
+libcli/auth/config.mk
+libcli/drsuapi/config.mk
+libcli/security/config.mk
+libcli/smb/config.mk
+libcli/named_pipe_auth/config.mk
+libcli/ldap/config.mk
+lib/uid_wrapper/config.mk
+lib/crypto/config.mk
+lib/socket_wrapper/config.mk
+lib/util/config.mk
+lib/util/charset/config.mk
+lib/nss_wrapper/config.mk
+lib/tsocket/config.mk
+lib/popt/config.mk
+lib/async_req/config.mk
+lib/tdr/config.mk
+lib/torture/config.mk
+lib/smbconf/config.mk
diff --git a/buildtools/mktowscript/mktowscript.pl b/buildtools/mktowscript/mktowscript.pl
new file mode 100755
index 0000000000..d3dd67f4a5
--- /dev/null
+++ b/buildtools/mktowscript/mktowscript.pl
@@ -0,0 +1,294 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Data::Dumper;
+use File::Basename;
+
+my $filename=$ARGV[0];
+my $dname=dirname($filename);
+
+sub read_file($)
+{
+ my $filename = shift;
+ open(CONFIG_MK, "$filename");
+ my @lines = <CONFIG_MK>;
+ close(CONFIG_MK);
+ return @lines;
+}
+
+sub trim($)
+{
+ my $string = shift;
+ $string =~ s/^\s+//;
+ $string =~ s/\s+$//;
+ return $string;
+}
+
+sub strlist($)
+{
+ my $s = shift;
+ $s =~ s/\$\(SHLIBEXT\)/so/g;
+ $s =~ s/\$\(heimdalsrcdir\)/..\/heimdal/g;
+ $s =~ s/\$\(heimdalbuildsrcdir\)/..\/heimdal_build/g;
+ $s =~ s/\$\(nsswitchsrcdir\)/..\/nsswitch/g;
+ $s =~ s/\$\(param_OBJ_FILES\)/..\/pyparam.c/g;
+ $s =~ s/\$\(libclisrcdir\)\///g;
+
+ return trim(join(' ', split(/\s+/, $s)));
+}
+
+sub find_file($)
+{
+ my $f = shift;
+ my $orig = $f;
+
+ my $b = basename($f);
+ return $b if (-e $b);
+
+ return $f if (-e $f);
+ while ($f =~ /\//) {
+ $f =~ s/^[^\/]+\///g;
+ #printf(STDERR "Trying $f in $dname\n");
+ return $f if (-e $f);
+ }
+ my $f2;
+ $f2 = `find . -name $f -type f`;
+ return $f2 unless ($f2 eq "");
+ $f2 = `find .. -name $f -type f`;
+ return $f2 unless ($f2 eq "");
+ $f2 = `find ../.. -name $f -type f`;
+ return $f2 unless ($f2 eq "");
+ $f2 = `find ../../.. -name $f -type f`;
+ return $f2 unless ($f2 eq "");
+ printf(STDERR "Failed to find $orig in $dname\n");
+ exit(1);
+ return '';
+}
+
+sub find_files($)
+{
+ my $list = shift;
+ my $ret = '';
+ foreach my $f (split(/\s+/, $list)) {
+ $f = find_file($f);
+ $f =~ s/^[.]\///;
+ $ret .= ' ' . $f;
+ }
+ return strlist($ret);
+}
+
+sub read_config_mk($)
+{
+ my $filename = shift;
+ my @lines = read_file($filename);
+ my $prev = "";
+ my $linenum = 1;
+ my $section = "GLOBAL";
+ my $infragment;
+ my $result;
+ my $line = "";
+ my $secnumber = 1;
+
+ $result->{"GLOBAL"}->{SECNUMBER} = $secnumber++;
+
+ foreach (@lines) {
+ $linenum++;
+
+ # lines beginning with '#' are ignored
+ next if (/^\#.*$/);
+
+ if (/^(.*)\\$/) {
+ $prev .= $1;
+ next;
+ } else {
+ $line = "$prev$_";
+ $prev = "";
+ }
+
+ if ($line =~ /^\[(\w+)::([\w-]+)\]/)
+ {
+ my $type = $1;
+ $section = $2;
+ $infragment = 0;
+
+ $result->{$section}->{TYPE} = $type;
+ $result->{$section}->{SECNUMBER} = $secnumber++;
+ next;
+ }
+
+ # include
+ if ($line =~ /^mkinclude (.*)$/) {
+ my $subfile = $1;
+ $result->{$subfile}->{TYPE} = 'SUBCONFIG';
+ $result->{$subfile}->{SECNUMBER} = $secnumber++;
+ next;
+ }
+
+ # empty line
+ if ($line =~ /^[ \t]*$/) {
+ next;
+ }
+
+ # global stuff is considered part of the makefile
+ if ($section eq "GLOBAL") {
+ $infragment = 1;
+ next;
+ }
+
+ # Assignment
+ if ($line =~ /^([a-zA-Z0-9_-]+)[\t ]*=(.*)$/) {
+ $result->{$section}->{$1} = $2;
+ next;
+ }
+
+ # +=
+ if ($line =~ /^([a-zA-Z0-9_-]+)[\t ]*\+=(.*)$/) {
+ if (!$result->{$section}->{$1}) {
+ $result->{$section}->{$1}="";
+ }
+ $result->{$section}->{$1} .= " " . $2;
+ next;
+ }
+
+ if ($line =~ /^\$\(eval/) {
+ # skip eval lines for now
+ next;
+ }
+
+ printf(STDERR "$linenum: Bad line: $line\n");
+ }
+
+ return $result;
+}
+
+
+my $result = read_config_mk($filename);
+
+#print Dumper $result;
+
+print "# AUTOGENERATED by mktowscript.pl\n# Please remove this notice if hand editing\n\n";
+
+chdir($dname);
+
+foreach my $s (sort {$result->{$a}->{SECNUMBER} <=> $result->{$b}->{SECNUMBER}} keys %{$result}) {
+ next if ($s eq "GLOBAL");
+ my $sec = $result->{$s};
+ if ($sec->{TYPE} eq "SUBCONFIG") {
+ my $d = dirname($s);
+ next if ($d eq ".");
+ printf "bld.add_subdirs('%s')\n", dirname($s);
+ } else {
+ printf "\nbld.SAMBA_%s('%s'", $sec->{TYPE}, $s;
+ my $trailer="";
+ my $got_src = 0;
+
+ foreach my $k (keys %{$sec}) {
+ #print "key=$k\n";
+
+ next if ($k eq "SECNUMBER");
+ next if ($k eq "TYPE");
+ if ($k eq "INIT_FUNCTION") {
+ $trailer .= sprintf(",\n\tinit_function='%s'", trim($sec->{$k}));
+ next;
+ }
+ if ($k eq "INIT_FUNCTION_SENTINEL") {
+ $trailer .= sprintf(",\n\tinit_function_sentinal='%s'", trim($sec->{$k}));
+ next;
+ }
+ if ($k eq "_PY_FILES" ||
+ $k eq "EPYDOC_OPTIONS" ||
+ $k eq "COV_TARGET" ||
+ $k eq "GCOV" ||
+ $k eq "PC_FILES" ||
+ $k eq "PUBLIC_HEADERS" ||
+ $k eq "MANPAGES" ||
+ $k eq "CONFIG4FILE" ||
+ $k eq "LMHOSTSFILE4") {
+ $trailer .= sprintf(",\n\t# %s='%s'", $k, trim($sec->{$k}));
+ next;
+ }
+ if ($k eq "SUBSYSTEM") {
+ $trailer .= sprintf(",\n\tsubsystem='%s'", trim($sec->{$k}));
+ next;
+ }
+ if ($k eq "PRIVATE_DEPENDENCIES") {
+ $trailer .= sprintf(",\n\tdeps='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "PUBLIC_DEPENDENCIES") {
+ $trailer .= sprintf(",\n\tpublic_deps='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "ALIASES") {
+ $trailer .= sprintf(",\n\taliases='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "CFLAGS") {
+ $trailer .= sprintf(",\n\tcflags='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "LDFLAGS") {
+ $trailer .= sprintf(",\n\tldflags='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "INSTALLDIR") {
+ $trailer .= sprintf(",\n\tinstalldir='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "ENABLE") {
+ my $v = strlist($sec->{$k});
+ if ($v eq "NO") {
+ $trailer .= sprintf(",\n\tenabled=False");
+ next;
+ }
+ next if ($v eq "YES");
+ die("Unknown ENABLE value $v in $s\n");
+ }
+ if ($k eq "$s" . "_VERSION") {
+ $trailer .= sprintf(",\n\tvnum='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "$s" . "_SOVERSION") {
+ next;
+ }
+ if ($k eq "LIBRARY_REALNAME") {
+ $trailer .= sprintf(",\n\trealname='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "OUTPUT_TYPE") {
+ $trailer .= sprintf(",\n\toutput_type='%s'", strlist($sec->{$k}));
+ next;
+ }
+ if ($k eq "$s" . "_OBJ_FILES") {
+ my $list = trim(strlist($sec->{$k}));
+ $list =~ s/\.o/.c/g;
+ if ($list =~ /\$\(addprefix .*,(.*)\)(.*)$/) {
+ $list = trim("$1 $2");
+ $list = find_files($list);
+ $list = "'$list'";
+ } elsif ($list =~ /\$\(addprefix \$\((\w+)\)(.*),(.*)\)(.*)$/) {
+ my $src = trim($3);
+ my $dir = "$1$2";
+ $dir =~ s/\/$//;
+ my $res = "bld.SUBDIR('$dir', '$src')";
+ if ($4) {
+ $res = "$res + '$4'";
+ }
+ $list = $res;
+ } else {
+ $list = find_files($list);
+ $list="'$list'";
+ }
+ $list =~ s/\$\(\w+srcdir\)\///g;
+ printf(",\n\t%s", $list);
+ $got_src = 1;
+ next;
+ }
+ die("Unknown keyword $k in $s\n");
+ }
+ die("No source list in $s\n") unless $got_src;
+ printf("%s\n\t)\n\n", $trailer);
+ }
+}
+
+#print Dumper $result;
diff --git a/buildtools/mktowscript/rebuild_all.sh b/buildtools/mktowscript/rebuild_all.sh
new file mode 100755
index 0000000000..d13eb93a4b
--- /dev/null
+++ b/buildtools/mktowscript/rebuild_all.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+cat mklist.txt |
+while read f; do
+ echo "Processing $f"
+ f="../../$f"
+ test -f $f || {
+ echo "$f doesn't exist"
+ exit 1
+ }
+ ws="$(dirname $f)/wscript_build"
+ if [ -f $ws ]; then
+ if ! grep "AUTOGENERATED.by.mktowscript" $ws > /dev/null; then
+ echo "Skipping manually edited file $ws"
+ continue
+ fi
+ fi
+ ./mktowscript.pl $f > wscript_build.$$ || {
+ echo "Failed on $f"
+ rm -f wscript_build.$$
+ exit 1
+ }
+ if cmp wscript_build.$$ $ws 2> /dev/null; then
+ rm -f wscript_build.$$
+ else
+ mv wscript_build.$$ $ws || exit 1
+ fi
+ #exit 1
+done