1# a waf tool to add extension based build patterns for Samba
2
3import sys
4from waflib import Build
5from wafsamba import samba_version_file
6
7def write_version_header(task):
8    '''print version.h contents'''
9    src = task.inputs[0].srcpath(task.env)
10
11    version = samba_version_file(src, task.env.srcdir, env=task.env, is_install=task.generator.bld.is_install)
12    string = str(version)
13
14    task.outputs[0].write(string)
15    return 0
16
17
18def SAMBA_MKVERSION(bld, target, source='VERSION'):
19    '''generate the version.h header for Samba'''
20
21    # We only force waf to re-generate this file if we are installing,
22    # because only then is information not included in the deps (the
23    # git revision) included in the version.
24    t = bld.SAMBA_GENERATOR('VERSION',
25                            rule=write_version_header,
26                            source=source,
27                            target=target,
28                            always=bld.is_install)
29Build.BuildContext.SAMBA_MKVERSION = SAMBA_MKVERSION
30
31
32def 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 \"dynconfig/dynconfig.h\"\n")
56    fp.write("#include \"lib/cluster_support.h\"\n")
57
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("\n")
96    fp.write("       /* Output various paths to files and directories */\n")
97    fp.write("       output(screen,\"\\nPaths:\\n\");\n")
98    fp.write("       output(screen,\"   SBINDIR: %s\\n\", get_dyn_SBINDIR());\n")
99    fp.write("       output(screen,\"   BINDIR: %s\\n\", get_dyn_BINDIR());\n")
100    fp.write("       output(screen,\"   CONFIGFILE: %s\\n\", get_dyn_CONFIGFILE());\n")
101    fp.write("       output(screen,\"   LOGFILEBASE: %s\\n\", get_dyn_LOGFILEBASE());\n")
102    fp.write("       output(screen,\"   LMHOSTSFILE: %s\\n\",get_dyn_LMHOSTSFILE());\n")
103    fp.write("       output(screen,\"   LIBDIR: %s\\n\",get_dyn_LIBDIR());\n")
104    fp.write("       output(screen,\"   MODULESDIR: %s\\n\",get_dyn_MODULESDIR());\n")
105    fp.write("       output(screen,\"   SHLIBEXT: %s\\n\",get_dyn_SHLIBEXT());\n")
106    fp.write("       output(screen,\"   LOCKDIR: %s\\n\",get_dyn_LOCKDIR());\n")
107    fp.write("       output(screen,\"   STATEDIR: %s\\n\",get_dyn_STATEDIR());\n")
108    fp.write("       output(screen,\"   CACHEDIR: %s\\n\",get_dyn_CACHEDIR());\n")
109    fp.write("       output(screen,\"   PIDDIR: %s\\n\", get_dyn_PIDDIR());\n")
110    fp.write("       output(screen,\"   SMB_PASSWD_FILE: %s\\n\",get_dyn_SMB_PASSWD_FILE());\n")
111    fp.write("       output(screen,\"   PRIVATE_DIR: %s\\n\",get_dyn_PRIVATE_DIR());\n")
112    fp.write("       output(screen,\"   BINDDNS_DIR: %s\\n\",get_dyn_BINDDNS_DIR());\n")
113    fp.write("\n")
114
115def write_build_options_footer(fp):
116    fp.write("       /* Output the sizes of the various cluster features */\n")
117    fp.write("       output(screen, \"\\n%s\", cluster_support_features());\n")
118    fp.write("\n")
119    fp.write("       /* Output the sizes of the various types */\n")
120    fp.write("       output(screen, \"\\nType sizes:\\n\");\n")
121    fp.write("       output(screen, \"   sizeof(char):         %lu\\n\",(unsigned long)sizeof(char));\n")
122    fp.write("       output(screen, \"   sizeof(int):          %lu\\n\",(unsigned long)sizeof(int));\n")
123    fp.write("       output(screen, \"   sizeof(long):         %lu\\n\",(unsigned long)sizeof(long));\n")
124    fp.write("       output(screen, \"   sizeof(long long):    %lu\\n\",(unsigned long)sizeof(long long));\n")
125    fp.write("       output(screen, \"   sizeof(uint8_t):      %lu\\n\",(unsigned long)sizeof(uint8_t));\n")
126    fp.write("       output(screen, \"   sizeof(uint16_t):     %lu\\n\",(unsigned long)sizeof(uint16_t));\n")
127    fp.write("       output(screen, \"   sizeof(uint32_t):     %lu\\n\",(unsigned long)sizeof(uint32_t));\n")
128    fp.write("       output(screen, \"   sizeof(short):        %lu\\n\",(unsigned long)sizeof(short));\n")
129    fp.write("       output(screen, \"   sizeof(void*):        %lu\\n\",(unsigned long)sizeof(void*));\n")
130    fp.write("       output(screen, \"   sizeof(size_t):       %lu\\n\",(unsigned long)sizeof(size_t));\n")
131    fp.write("       output(screen, \"   sizeof(off_t):        %lu\\n\",(unsigned long)sizeof(off_t));\n")
132    fp.write("       output(screen, \"   sizeof(ino_t):        %lu\\n\",(unsigned long)sizeof(ino_t));\n")
133    fp.write("       output(screen, \"   sizeof(dev_t):        %lu\\n\",(unsigned long)sizeof(dev_t));\n")
134    fp.write("\n")
135    fp.write("       output(screen, \"\\nBuiltin modules:\\n\");\n")
136    fp.write("       output(screen, \"   %s\\n\", STRING_STATIC_MODULES);\n")
137    fp.write("}\n")
138
139def write_build_options_section(fp, keys, section):
140    fp.write("\n\t/* Show %s */\n" % section)
141    fp.write("       output(screen, \"\\n%s:\\n\");\n\n" % section)
142
143    for k in sorted(keys):
144        fp.write("#ifdef %s\n" % k)
145        fp.write("       output(screen, \"   %s\\n\");\n" % k)
146        fp.write("#endif\n")
147    fp.write("\n")
148
149def write_build_options(task):
150    tbl = task.env
151    keys_option_with = []
152    keys_option_utmp = []
153    keys_option_have = []
154    keys_header_sys = []
155    keys_header_other = []
156    keys_misc = []
157    if sys.hexversion>0x300000f:
158        trans_table = bytes.maketrans(b'.-()', b'____')
159    else:
160        import string
161        trans_table = string.maketrans('.-()', '____')
162
163    for key in tbl:
164        if key.startswith("HAVE_UT_UT_") or key.find("UTMP") >= 0:
165            keys_option_utmp.append(key)
166        elif key.startswith("WITH_"):
167            keys_option_with.append(key)
168        elif key.startswith("HAVE_SYS_"):
169            keys_header_sys.append(key)
170        elif key.startswith("HAVE_"):
171            if key.endswith("_H"):
172                keys_header_other.append(key)
173            else:
174                keys_option_have.append(key)
175        elif key.startswith("static_init_"):
176            l = key.split("(")
177            keys_misc.append(l[0])
178        else:
179            keys_misc.append(key.translate(trans_table))
180
181    tgt = task.outputs[0].bldpath(task.env)
182    f = open(tgt, 'w')
183    write_build_options_header(f)
184    write_build_options_section(f, keys_header_sys, "System Headers")
185    write_build_options_section(f, keys_header_other, "Headers")
186    write_build_options_section(f, keys_option_utmp, "UTMP Options")
187    write_build_options_section(f, keys_option_have, "HAVE_* Defines")
188    write_build_options_section(f, keys_option_with, "--with Options")
189    write_build_options_section(f, keys_misc, "Build Options")
190    write_build_options_footer(f)
191    f.close()
192    return 0
193
194
195def SAMBA_BLDOPTIONS(bld, target):
196    '''generate the bld_options.c for Samba'''
197    t = bld.SAMBA_GENERATOR(target,
198                            rule=write_build_options,
199                            dep_vars=['defines'],
200                            target=target)
201Build.BuildContext.SAMBA_BLDOPTIONS = SAMBA_BLDOPTIONS
202