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