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