]>
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         my $platformName = $ENV{"VARIANT_PLATFORM_NAME"}; 
  24         $platformName =~ s/simulator/os/; 
  26         my $platformPath = $ENV{"SRCROOT"} . "/Platforms/" . $platformName . "/Makefile.inc"; 
  27         my $featuresHeaderDir = $ENV{"DERIVED_FILES_DIR"}."/".$arch; 
  28         my $featuresHeader = $featuresHeaderDir."/libc-features.h"; 
  30         open FEATURESFILE
, "<$platformPath" or die "Unable to open: $platformPath"; 
  36         while (<FEATURESFILE
>) { 
  39                 if ($_ =~ /^.endif/) { 
  44                 elsif ($_ =~ /^\.if\s+(\S+)\s+(\S+)/) { 
  45                         # an if statement, very rudimentary regex against envvar 
  50                         if (!defined($ENV{$envvar}) || ($ENV{$envvar} !~ /$regex/)) { 
  55                 elsif ($_ =~ /^\s*([^= ]+)\s*=\s*(\d)/) { 
  59                                 } elsif (defined($features{$1})) { 
  69                 for my $f (keys %features) { 
  70                         print "$f=$features{$f} "; 
  76         elsif ($unifdef == 1) { 
  77                 # assume FEATURE_BLOCKS was on by default 
  78                 $unifdefs{"UNIFDEF_BLOCKS"} = 1; 
  79                 $unifdefs{"UNIFDEF_DRIVERKIT"} = defined($ENV{"DRIVERKITSDK"}); 
  80                 $unifdefs{"UNIFDEF_LEGACY_64_APIS"} = defined($features{"FEATURE_LEGACY_64_APIS"}); 
  81                 $unifdefs{"UNIFDEF_LEGACY_RUNE_APIS"} = defined($features{"FEATURE_LEGACY_RUNE_APIS"}); 
  82                 $unifdefs{"UNIFDEF_LEGACY_UTMP_APIS"} = defined($features{"FEATURE_LEGACY_UTMP_APIS"}); 
  83                 $unifdefs{"UNIFDEF_POSIX_ILP32_ALLOW"} = defined($features{"FEATURE_POSIX_ILP32_ALLOW"}); 
  86                 for my $d (keys %unifdefs) { 
  87                         $output .= " " . ($unifdefs{$d} == 1 ? "-D" : "-U") . $d; 
  95         elsif ($unifdef == 0) { 
  96                 # If we touch this file on every build, then every other iterative build in Xcode will rebuild *everything* 
  97                 my $platform_mtime = (stat($platformPath))[9]; 
  98                 my $header_mtime = (stat($featuresHeader))[9]; 
 100                 if (defined($header_mtime) && defined($platform_mtime) && ($header_mtime > $platform_mtime)) { 
 104                 printf $arch." features:\n"; 
 105                 printf Dumper
(\
%features); 
 108                         die "Unbalanced .if/.endif directive"; 
 111                 # And the meat, new header options should go under here 
 112                 if (! -d 
$featuresHeaderDir) { 
 113                         mkpath 
$featuresHeaderDir or die "Unable to mkdir: $featuresHeaderDir"; 
 115                 open HEADER
, ">$featuresHeader" or die "Unable to open (for writing): $featuresHeader"; 
 117                 printf HEADER 
"#ifndef _LIBC_FEATURES_H_\n"; 
 118                 printf HEADER 
"#define _LIBC_FEATURES_H_\n\n"; 
 120                 my $shortarch = $arch; 
 121                 $shortarch =~ s/armv\d+[a-z]?/arm/g; 
 123                 # map all arm64 subtypes to arm64 
 124                 $shortarch =~ s/arm64[_a-z0-9]*/arm64/g; 
 126                 printf HEADER 
"#if !defined(__".$shortarch."__)\n"; 
 127                 printf HEADER 
"#error Mismatched libc-features.h architecture\n"; 
 128                 printf HEADER 
"#endif\n\n"; 
 130                 if (defined($features{"FEATURE_LEGACY_RUNE_APIS"})) { 
 131                         printf HEADER 
"#define UNIFDEF_LEGACY_RUNE_APIS 1\n"; 
 133                         printf HEADER 
"/* #undef UNIFDEF_LEGACY_RUNE_APIS */\n"; 
 136                 if (defined($features{"FEATURE_LEGACY_CRT1_ENVIRON"})) { 
 137                         printf HEADER 
"#define LEGACY_CRT1_ENVIRON 1\n"; 
 139                         printf HEADER 
"/* #undef LEGACY_CRT1_ENVIRON */\n"; 
 142                 if (defined($features{"FEATURE_LEGACY_UTMP_APIS"})) { 
 143                         printf HEADER 
"#define UNIFDEF_LEGACY_UTMP_APIS 1\n"; 
 145                         printf HEADER 
"/* #undef UNIFDEF_LEGACY_UTMP_APIS */\n"; 
 148                 if (defined($features{"FEATURE_ONLY_1050_VARIANTS"})) { 
 149                         printf HEADER 
"#if !__DARWIN_ONLY_VERS_1050\n"; 
 150                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 0\n"; 
 151                         printf HEADER 
"#endif /* !__DARWIN_ONLY_VERS_1050 */\n"; 
 153                         printf HEADER 
"#if __DARWIN_ONLY_VERS_1050\n"; 
 154                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 1\n"; 
 155                         printf HEADER 
"#endif /* __DARWIN_ONLY_VERS_1050 */\n"; 
 158                 if (defined($features{"FEATURE_ONLY_UNIX_CONFORMANCE"})) { 
 159                         printf HEADER 
"#if !__DARWIN_ONLY_UNIX_CONFORMANCE\n"; 
 160                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 0\n"; 
 161                         printf HEADER 
"#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */\n"; 
 163                         printf HEADER 
"#if __DARWIN_ONLY_UNIX_CONFORMANCE\n"; 
 164                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 1\n"; 
 165                         printf HEADER 
"#endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */\n"; 
 168                 if (defined($features{"FEATURE_ONLY_64_BIT_INO_T"})) { 
 169                         printf HEADER 
"#if !__DARWIN_ONLY_64_BIT_INO_T\n"; 
 170                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 0\n"; 
 171                         printf HEADER 
"#endif /* !__DARWIN_ONLY_64_BIT_INO_T */\n"; 
 173                         printf HEADER 
"#if __DARWIN_ONLY_64_BIT_INO_T\n"; 
 174                         printf HEADER 
"#  error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 1\n"; 
 175                         printf HEADER 
"#endif /* __DARWIN_ONLY_64_BIT_INO_T */\n"; 
 178                 if (defined($features{"FEATURE_PATCH_3417676"})) { 
 179                         printf HEADER 
"#define __APPLE_PR3417676_HACK__ 1\n"; 
 181                         printf HEADER 
"/* #undef __APPLE_PR3417676_HACK__ */\n"; 
 184                 if (defined($features{"FEATURE_PLOCKSTAT"})) { 
 185                         printf HEADER 
"#define PLOCKSTAT 1\n"; 
 187                         printf HEADER 
"/* #undef PLOCKSTAT */\n"; 
 190                 if (defined($features{"FEATURE_TIMEZONE_CHANGE_NOTIFICATION"})) { 
 191                         printf HEADER 
"#define NOTIFY_TZ 1\n"; 
 193                         printf HEADER 
"/* #undef NOTIFY_TZ */\n"; 
 196                 if (defined($features{"FEATURE_SMALL_STDIOBUF"})) { 
 197                         printf HEADER 
"#define FEATURE_SMALL_STDIOBUF 1\n"; 
 199                         printf HEADER 
"/* #undef FEATURE_SMALL_STDIOBUF */\n"; 
 202                 if (defined($features{"FEATURE_XPRINTF_PERF"})) { 
 203                         printf HEADER 
"#define XPRINTF_PERF 1\n"; 
 205                         printf HEADER 
"/* #undef XPRINTF_PERF */\n"; 
 208                 if (defined($features{"FEATURE_SIGNAL_RESTRICTION"})) { 
 209                         printf HEADER 
"#define FEATURE_SIGNAL_RESTRICTION 1\n"; 
 211                         printf HEADER 
"/* #undef FEATURE_SIGNAL_RESTRICTION */\n"; 
 214                 printf HEADER 
"#endif // _LIBC_FEATURES_H_\n";