]>
git.saurik.com Git - apple/libc.git/blob - xcodescripts/generate_features.pl
3 # Generates the libc-features.h files used to control #ifdef behaviour in Libc
6 use File
::Path
qw(mkpath);
13 if (scalar(@ARGV) > 0) {
14 $unifdef = 1 if $ARGV[0] =~ /--unifdef/;
15 $bash = 1 if $ARGV[0] =~ /--bash/;
18 for my $arch (split(/ /, $ENV{"ARCHS"}))
20 # set ENV{"CURRENT_ARCH"} so we can predicate on it
21 $ENV{"CURRENT_ARCH"} = $arch;
23 # BridgeOS shares the same platform name than the watch so
24 # we need to fix it and pick the right configuration.
25 my $platformName = $ENV{"PLATFORM_NAME"};
26 if ($ENV{"RC_BRIDGE"} eq "YES") {
27 $platformName = "bridgeos";
30 $platformName =~ s/simulator/os/;
32 my $platformPath = $ENV{"SRCROOT"} . "/Platforms/" . $platformName . "/Makefile.inc";
33 my $featuresHeaderDir = $ENV{"DERIVED_FILES_DIR"}."/".$arch;
34 my $featuresHeader = $featuresHeaderDir."/libc-features.h";
36 open FEATURESFILE
, "<$platformPath" or die "Unable to open: $platformPath";
42 while (<FEATURESFILE
>) {
45 if ($_ =~ /^.endif/) {
50 elsif ($_ =~ /^\.if\s+(\S+)\s+(\S+)/) {
51 # an if statement, very rudimentary regex against envvar
56 if (!defined($ENV{$envvar}) || ($ENV{$envvar} !~ /$regex/)) {
61 elsif ($_ =~ /^\s*([^= ]+)\s*=\s*(\d)/) {
65 } elsif (defined($features{$1})) {
75 for my $f (keys %features) {
76 print "$f=$features{$f} ";
82 elsif ($unifdef == 1) {
83 if ($platformName eq "macosx") {
84 $unifdefs{"__OSX_OPEN_SOURCE__"} = 1;
86 # assume FEATURE_BLOCKS was on by default
87 $unifdefs{"UNIFDEF_BLOCKS"} = 1;
88 $unifdefs{"UNIFDEF_LEGACY_64_APIS"} = defined($features{"FEATURE_LEGACY_64_APIS"});
89 $unifdefs{"UNIFDEF_LEGACY_RUNE_APIS"} = defined($features{"FEATURE_LEGACY_RUNE_APIS"});
90 $unifdefs{"UNIFDEF_LEGACY_UTMP_APIS"} = defined($features{"FEATURE_LEGACY_UTMP_APIS"});
91 $unifdefs{"UNIFDEF_MOVE_LOCALTIME"} = defined($features{"FEATURE_MOVE_LOCALTIME"});
92 $unifdefs{"UNIFDEF_TZDIR_SYMLINK"} = defined($features{"FEATURE_TZDIR_SYMLINK"});
95 for my $d (keys %unifdefs) {
96 $output .= " " . ($unifdefs{$d} == 1 ? "-D" : "-U") . $d;
104 elsif ($unifdef == 0) {
105 # If we touch this file on every build, then every other iterative build in Xcode will rebuild *everything*
106 my $platform_mtime = (stat($platformPath))[9];
107 my $header_mtime = (stat($featuresHeader))[9];
109 if (defined($header_mtime) && defined($platform_mtime) && ($header_mtime > $platform_mtime)) {
113 printf $arch." features:\n";
114 printf Dumper
(\
%features);
117 die "Unbalanced .if/.endif directive";
120 # And the meat, new header options should go under here
121 if (! -d
$featuresHeaderDir) {
122 mkpath
$featuresHeaderDir or die "Unable to mkdir: $featuresHeaderDir";
124 open HEADER
, ">$featuresHeader" or die "Unable to open (for writing): $featuresHeader";
126 printf HEADER
"#ifndef _LIBC_FEATURES_H_\n";
127 printf HEADER
"#define _LIBC_FEATURES_H_\n\n";
129 my $shortarch = $arch;
130 $shortarch =~ s/armv\d+[a-z]?/arm/g;
131 $shortarch =~ s/arm64_32/arm64/g;
133 printf HEADER
"#if !defined(__".$shortarch."__)\n";
134 printf HEADER
"#error Mismatched libc-features.h architecture\n";
135 printf HEADER
"#endif\n\n";
137 if (defined($features{"FEATURE_LEGACY_RUNE_APIS"})) {
138 printf HEADER
"#define UNIFDEF_LEGACY_RUNE_APIS 1\n";
140 printf HEADER
"/* #undef UNIFDEF_LEGACY_RUNE_APIS */\n";
143 if (defined($features{"FEATURE_LEGACY_CRT1_ENVIRON"})) {
144 printf HEADER
"#define LEGACY_CRT1_ENVIRON 1\n";
146 printf HEADER
"/* #undef LEGACY_CRT1_ENVIRON */\n";
149 if (defined($features{"FEATURE_LEGACY_UTMP_APIS"})) {
150 printf HEADER
"#define UNIFDEF_LEGACY_UTMP_APIS 1\n";
152 printf HEADER
"/* #undef UNIFDEF_LEGACY_UTMP_APIS */\n";
155 if (defined($features{"FEATURE_MOVE_LOCALTIME"})) {
156 printf HEADER
"#define UNIFDEF_MOVE_LOCALTIME 1\n";
158 printf HEADER
"/* #undef UNIFDEF_MOVE_LOCALTIME */\n";
161 if (defined($features{"FEATURE_TZDIR_SYMLINK"})) {
162 printf HEADER
"#define UNIFDEF_TZDIR_SYMLINK 1\n";
164 printf HEADER
"/* #undef UNIFDEF_TZDIR_SYMLINK */\n";
167 if (defined($features{"FEATURE_ONLY_1050_VARIANTS"})) {
168 printf HEADER
"#if !__DARWIN_ONLY_VERS_1050\n";
169 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 0\n";
170 printf HEADER
"#endif /* !__DARWIN_ONLY_VERS_1050 */\n";
172 printf HEADER
"#if __DARWIN_ONLY_VERS_1050\n";
173 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 1\n";
174 printf HEADER
"#endif /* __DARWIN_ONLY_VERS_1050 */\n";
177 if (defined($features{"FEATURE_ONLY_UNIX_CONFORMANCE"})) {
178 printf HEADER
"#if !__DARWIN_ONLY_UNIX_CONFORMANCE\n";
179 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 0\n";
180 printf HEADER
"#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */\n";
182 printf HEADER
"#if __DARWIN_ONLY_UNIX_CONFORMANCE\n";
183 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 1\n";
184 printf HEADER
"#endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */\n";
187 if (defined($features{"FEATURE_ONLY_64_BIT_INO_T"})) {
188 printf HEADER
"#if !__DARWIN_ONLY_64_BIT_INO_T\n";
189 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 0\n";
190 printf HEADER
"#endif /* !__DARWIN_ONLY_64_BIT_INO_T */\n";
192 printf HEADER
"#if __DARWIN_ONLY_64_BIT_INO_T\n";
193 printf HEADER
"# error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 1\n";
194 printf HEADER
"#endif /* __DARWIN_ONLY_64_BIT_INO_T */\n";
197 if (defined($features{"FEATURE_PATCH_3417676"})) {
198 printf HEADER
"#define __APPLE_PR3417676_HACK__ 1\n";
200 printf HEADER
"/* #undef __APPLE_PR3417676_HACK__ */\n";
203 if (defined($features{"FEATURE_PLOCKSTAT"})) {
204 printf HEADER
"#define PLOCKSTAT 1\n";
206 printf HEADER
"/* #undef PLOCKSTAT */\n";
209 if (defined($features{"FEATURE_TIMEZONE_CHANGE_NOTIFICATION"})) {
210 printf HEADER
"#define NOTIFY_TZ 1\n";
212 printf HEADER
"/* #undef NOTIFY_TZ */\n";
215 if (defined($features{"FEATURE_NO_LIBCRASHREPORTERCLIENT"})) {
216 printf HEADER
"#define LIBC_NO_LIBCRASHREPORTERCLIENT 1\n";
218 printf HEADER
"/* #undef LIBC_NO_LIBCRASHREPORTERCLIENT */\n";
221 if (defined($features{"FEATURE_SMALL_STDIOBUF"})) {
222 printf HEADER
"#define FEATURE_SMALL_STDIOBUF 1\n";
224 printf HEADER
"/* #undef FEATURE_SMALL_STDIOBUF */\n";
227 if (defined($features{"FEATURE_XPRINTF_PERF"})) {
228 printf HEADER
"#define XPRINTF_PERF 1\n";
230 printf HEADER
"/* #undef XPRINTF_PERF */\n";
233 if (defined($features{"FEATURE_SIGNAL_RESTRICTION"})) {
234 printf HEADER
"#define FEATURE_SIGNAL_RESTRICTION 1\n";
236 printf HEADER
"/* #undef FEATURE_SIGNAL_RESTRICTION */\n";
239 printf HEADER
"#endif // _LIBC_FEATURES_H_\n";