swat: Remove swat.
[sfrench/samba-autobuild/.git] / buildtools / wafsamba / samba_patterns.py
1 # a waf tool to add extension based build patterns for Samba
2
3 import Task
4 from TaskGen import extension
5 from samba_utils import *
6 from wafsamba import samba_version_file
7
8 def write_version_header(task):
9     '''print version.h contents'''
10     src = task.inputs[0].srcpath(task.env)
11     tgt = task.outputs[0].bldpath(task.env)
12
13     version = samba_version_file(src, task.env.srcdir, env=task.env, is_install=task.env.is_install)
14     string = str(version)
15
16     f = open(tgt, 'w')
17     s = f.write(string)
18     f.close()
19     return 0
20
21
22 def SAMBA_MKVERSION(bld, target):
23     '''generate the version.h header for Samba'''
24     t = bld.SAMBA_GENERATOR('VERSION',
25                             rule=write_version_header,
26                             source= 'VERSION',
27                             target=target,
28                             always=True)
29     t.env.is_install = bld.is_install
30 Build.BuildContext.SAMBA_MKVERSION = SAMBA_MKVERSION
31
32
33 def write_build_options_header(fp):
34     '''write preamble for build_options.c'''
35     fp.write("/*\n")
36     fp.write("   Unix SMB/CIFS implementation.\n")
37     fp.write("   Build Options for Samba Suite\n")
38     fp.write("   Copyright (C) Vance Lankhaar <vlankhaar@linux.ca> 2003\n")
39     fp.write("   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2001\n")
40     fp.write("\n")
41     fp.write("   This program is free software; you can redistribute it and/or modify\n")
42     fp.write("   it under the terms of the GNU General Public License as published by\n")
43     fp.write("   the Free Software Foundation; either version 3 of the License, or\n")
44     fp.write("   (at your option) any later version.\n")
45     fp.write("\n")
46     fp.write("   This program is distributed in the hope that it will be useful,\n")
47     fp.write("   but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
48     fp.write("   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n")
49     fp.write("   GNU General Public License for more details.\n")
50     fp.write("\n")
51     fp.write("   You should have received a copy of the GNU General Public License\n")
52     fp.write("   along with this program; if not, see <http://www.gnu.org/licenses/>.\n")
53     fp.write("*/\n")
54     fp.write("\n")
55     fp.write("#include \"includes.h\"\n")
56     fp.write("#include \"build_env.h\"\n")
57     fp.write("#include \"dynconfig/dynconfig.h\"\n")
58     fp.write("\n")
59     fp.write("static int output(bool screen, const char *format, ...) PRINTF_ATTRIBUTE(2,3);\n")
60     fp.write("void build_options(bool screen);\n")
61     fp.write("\n")
62     fp.write("\n")
63     fp.write("/****************************************************************************\n")
64     fp.write("helper function for build_options\n")
65     fp.write("****************************************************************************/\n")
66     fp.write("static int output(bool screen, const char *format, ...)\n")
67     fp.write("{\n")
68     fp.write("       char *ptr = NULL;\n")
69     fp.write("       int ret = 0;\n")
70     fp.write("       va_list ap;\n")
71     fp.write("       \n")
72     fp.write("       va_start(ap, format);\n")
73     fp.write("       ret = vasprintf(&ptr,format,ap);\n")
74     fp.write("       va_end(ap);\n")
75     fp.write("\n")
76     fp.write("       if (screen) {\n")
77     fp.write("              d_printf(\"%s\", ptr ? ptr : \"\");\n")
78     fp.write("       } else {\n")
79     fp.write("              DEBUG(4,(\"%s\", ptr ? ptr : \"\"));\n")
80     fp.write("       }\n")
81     fp.write("       \n")
82     fp.write("       SAFE_FREE(ptr);\n")
83     fp.write("       return ret;\n")
84     fp.write("}\n")
85     fp.write("\n")
86     fp.write("/****************************************************************************\n")
87     fp.write("options set at build time for the samba suite\n")
88     fp.write("****************************************************************************/\n")
89     fp.write("void build_options(bool screen)\n")
90     fp.write("{\n")
91     fp.write("       if ((DEBUGLEVEL < 4) && (!screen)) {\n")
92     fp.write("              return;\n")
93     fp.write("       }\n")
94     fp.write("\n")
95     fp.write("#ifdef _BUILD_ENV_H\n")
96     fp.write("       /* Output information about the build environment */\n")
97     fp.write("       output(screen,\"Build environment:\\n\");\n")
98     fp.write("       output(screen,\"   Built by:    %s@%s\\n\",BUILD_ENV_USER,BUILD_ENV_HOST);\n")
99     fp.write("       output(screen,\"   Built on:    %s\\n\",BUILD_ENV_DATE);\n")
100     fp.write("\n")
101     fp.write("       output(screen,\"   Built using: %s\\n\",BUILD_ENV_COMPILER);\n")
102     fp.write("       output(screen,\"   Build host:  %s\\n\",BUILD_ENV_UNAME);\n")
103     fp.write("       output(screen,\"   SRCDIR:      %s\\n\",BUILD_ENV_SRCDIR);\n")
104     fp.write("       output(screen,\"   BUILDDIR:    %s\\n\",BUILD_ENV_BUILDDIR);\n")
105     fp.write("\n")
106     fp.write("\n")
107     fp.write("#endif\n")
108     fp.write("\n")
109     fp.write("       /* Output various paths to files and directories */\n")
110     fp.write("       output(screen,\"\\nPaths:\\n\");\n")
111     fp.write("       output(screen,\"   SBINDIR: %s\\n\", get_dyn_SBINDIR());\n")
112     fp.write("       output(screen,\"   BINDIR: %s\\n\", get_dyn_BINDIR());\n")
113     fp.write("       output(screen,\"   CONFIGFILE: %s\\n\", get_dyn_CONFIGFILE());\n")
114     fp.write("       output(screen,\"   LOGFILEBASE: %s\\n\", get_dyn_LOGFILEBASE());\n")
115     fp.write("       output(screen,\"   LMHOSTSFILE: %s\\n\",get_dyn_LMHOSTSFILE());\n")
116     fp.write("       output(screen,\"   LIBDIR: %s\\n\",get_dyn_LIBDIR());\n")
117     fp.write("       output(screen,\"   MODULESDIR: %s\\n\",get_dyn_MODULESDIR());\n")
118     fp.write("       output(screen,\"   SHLIBEXT: %s\\n\",get_dyn_SHLIBEXT());\n")
119     fp.write("       output(screen,\"   LOCKDIR: %s\\n\",get_dyn_LOCKDIR());\n")
120     fp.write("       output(screen,\"   STATEDIR: %s\\n\",get_dyn_STATEDIR());\n")
121     fp.write("       output(screen,\"   CACHEDIR: %s\\n\",get_dyn_CACHEDIR());\n")
122     fp.write("       output(screen,\"   PIDDIR: %s\\n\", get_dyn_PIDDIR());\n")
123     fp.write("       output(screen,\"   SMB_PASSWD_FILE: %s\\n\",get_dyn_SMB_PASSWD_FILE());\n")
124     fp.write("       output(screen,\"   PRIVATE_DIR: %s\\n\",get_dyn_PRIVATE_DIR());\n")
125     fp.write("\n")
126
127 def write_build_options_footer(fp):
128     fp.write("       /* Output the sizes of the various types */\n")
129     fp.write("       output(screen, \"\\nType sizes:\\n\");\n")
130     fp.write("       output(screen, \"   sizeof(char):         %lu\\n\",(unsigned long)sizeof(char));\n")
131     fp.write("       output(screen, \"   sizeof(int):          %lu\\n\",(unsigned long)sizeof(int));\n")
132     fp.write("       output(screen, \"   sizeof(long):         %lu\\n\",(unsigned long)sizeof(long));\n")
133     fp.write("#if HAVE_LONGLONG\n")
134     fp.write("       output(screen, \"   sizeof(long long):    %lu\\n\",(unsigned long)sizeof(long long));\n")
135     fp.write("#endif\n")
136     fp.write("       output(screen, \"   sizeof(uint8):        %lu\\n\",(unsigned long)sizeof(uint8));\n")
137     fp.write("       output(screen, \"   sizeof(uint16):       %lu\\n\",(unsigned long)sizeof(uint16));\n")
138     fp.write("       output(screen, \"   sizeof(uint32):       %lu\\n\",(unsigned long)sizeof(uint32));\n")
139     fp.write("       output(screen, \"   sizeof(short):        %lu\\n\",(unsigned long)sizeof(short));\n")
140     fp.write("       output(screen, \"   sizeof(void*):        %lu\\n\",(unsigned long)sizeof(void*));\n")
141     fp.write("       output(screen, \"   sizeof(size_t):       %lu\\n\",(unsigned long)sizeof(size_t));\n")
142     fp.write("       output(screen, \"   sizeof(off_t):        %lu\\n\",(unsigned long)sizeof(off_t));\n")
143     fp.write("       output(screen, \"   sizeof(ino_t):        %lu\\n\",(unsigned long)sizeof(ino_t));\n")
144     fp.write("       output(screen, \"   sizeof(dev_t):        %lu\\n\",(unsigned long)sizeof(dev_t));\n")
145     fp.write("\n")
146     fp.write("       output(screen, \"\\nBuiltin modules:\\n\");\n")
147     fp.write("       output(screen, \"   %s\\n\", STRING_STATIC_MODULES);\n")
148     fp.write("}\n")
149
150 def write_build_options_section(fp, keys, section):
151     fp.write("\n\t/* Show %s */\n" % section)
152     fp.write("       output(screen, \"\\n%s:\\n\");\n\n" % section)
153
154     for k in sorted(keys):
155         fp.write("#ifdef %s\n" % k)
156         fp.write("       output(screen, \"   %s\\n\");\n" % k)
157         fp.write("#endif\n")
158     fp.write("\n")
159
160 def write_build_options(task):
161     tbl = task.env['defines']
162     keys_option_with = []
163     keys_option_utmp = []
164     keys_option_have = []
165     keys_header_sys = []
166     keys_header_other = []
167     keys_misc = []
168     for key in tbl:
169         if key.startswith("HAVE_UT_UT_") or key.find("UTMP") >= 0:
170             keys_option_utmp.append(key)
171         elif key.startswith("WITH_"):
172             keys_option_with.append(key)
173         elif key.startswith("HAVE_SYS_"):
174             keys_header_sys.append(key)
175         elif key.startswith("HAVE_"):
176             if key.endswith("_H"):
177                 keys_header_other.append(key)
178             else:
179                 keys_option_have.append(key)
180         else:
181             keys_misc.append(key)
182
183     tgt = task.outputs[0].bldpath(task.env)
184     f = open(tgt, 'w')
185     write_build_options_header(f)
186     write_build_options_section(f, keys_header_sys, "System Headers")
187     write_build_options_section(f, keys_header_other, "Headers")
188     write_build_options_section(f, keys_option_utmp, "UTMP Options")
189     write_build_options_section(f, keys_option_have, "HAVE_* Defines")
190     write_build_options_section(f, keys_option_with, "--with Options")
191     write_build_options_section(f, keys_misc, "Build Options")
192     write_build_options_footer(f)
193     f.close()
194     return 0
195
196
197 def SAMBA_BLDOPTIONS(bld, target):
198     '''generate the bld_options.c for Samba'''
199     t = bld.SAMBA_GENERATOR(target,
200                             rule=write_build_options,
201                             target=target,
202                             always=True)
203 Build.BuildContext.SAMBA_BLDOPTIONS = SAMBA_BLDOPTIONS