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