X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/7b00c0c43f52e9d27168e67a26aac19065cdb40c..ad3c9f2af814c84582fdd1649e49ec4f68572c5a:/xcodescripts/generate_features.pl diff --git a/xcodescripts/generate_features.pl b/xcodescripts/generate_features.pl new file mode 100755 index 0000000..ce710f4 --- /dev/null +++ b/xcodescripts/generate_features.pl @@ -0,0 +1,225 @@ +#!/usr/bin/perl + +if ($ENV{"ACTION"} eq "installhdrs") { + exit 0; +} + +# Generates the libc-features.h files used to control #ifdef behaviour in Libc +use warnings; +use Data::Dumper; +use File::Path qw(mkpath); + +#printf Dumper(\%ENV); + +my $unifdef = 0; +my %unifdefs = (); +my $bash = 0; +if (scalar(@ARGV) > 0) { + $unifdef = 1 if $ARGV[0] =~ /--unifdef/; + $bash = 1 if $ARGV[0] =~ /--bash/; +} + +for my $arch (split(/ /, $ENV{"ARCHS"})) +{ + # set ENV{"CURRENT_ARCH"} so we can predicate on it + $ENV{"CURRENT_ARCH"} = $arch; + + my $platformName = $ENV{"PLATFORM_NAME"}; + $platformName = "iphoneos" if ($platformName eq "iphonesimulator"); + + my $platformPath = $ENV{"SRCROOT"} . "/Platforms/" . $platformName . "/Makefile.inc"; + my $featuresHeaderDir = $ENV{"DERIVED_FILES_DIR"}."/".$arch; + my $featuresHeader = $featuresHeaderDir."/libc-features.h"; + + open FEATURESFILE, "<$platformPath" or die "Unable to open: $platformPath"; + + my %features = (); + my $skip = 0; + my $nested = 0; + + while () { + next if $_ =~ /\s*#/; + + if ($_ =~ /^.endif/) { + $skip-- if $skip > 0; + $nested--; + } + + elsif ($_ =~ /^\.if\s+(\S+)\s+(\S+)/) { + # an if statement, very rudimentary regex against envvar + my $envvar = $1; + my $regex = $2; + + $nested++; + if ($ENV{$envvar} !~ /$regex/) { + $skip += 1; + } + } + + elsif ($_ =~ /^\s*([^= ]+)\s*=\s*(\d)/) { + if ($skip == 0) { + if ($2 == 1) { + $features{$1} = $2; + } elsif (defined($features{$1})) { + delete $features{$1}; + } + } + } + } + + close FEATURESFILE; + + if ($bash == 1) { + for my $f (keys %features) { + print "$f=$features{$f} "; + } + printf "\n"; + exit 0; + } + + elsif ($unifdef == 1) { + # assume FEATURE_BLOCKS was on by default + $unifdefs{"UNIFDEF_BLOCKS"} = 1; + $unifdefs{"UNIFDEF_LEGACY_64_APIS"} = defined($features{"FEATURE_LEGACY_64_APIS"}); + $unifdefs{"UNIFDEF_LEGACY_RUNE_APIS"} = defined($features{"FEATURE_LEGACY_RUNE_APIS"}); + $unifdefs{"UNIFDEF_LEGACY_UTMP_APIS"} = defined($features{"FEATURE_LEGACY_UTMP_APIS"}); + $unifdefs{"UNIFDEF_MOVE_LOCALTIME"} = defined($features{"FEATURE_MOVE_LOCALTIME"}); + + my $output = ""; + for my $d (keys %unifdefs) { + $output .= " " . ($unifdefs{$d} == 1 ? "-D" : "-U") . $d; + } + + chomp $output; + print "$output\n"; + exit 0; + } + + elsif ($unifdef == 0) { + # If we touch this file on every build, then every other iterative build in Xcode will rebuild *everything* + my $platform_mtime = (stat($platformPath))[9]; + my $header_mtime = (stat($featuresHeader))[9]; + + if ($header_mtime > $platform_mtime) { + exit 0; + } + + printf $arch." features:\n"; + printf Dumper(\%features); + + if ($nested != 0) { + die "Unbalanced .if/.endif directive"; + } + + # And the meat, new header options should go under here + if (! -d $featuresHeaderDir) { + mkpath $featuresHeaderDir or die "Unable to mkdir: $featuresHeaderDir"; + } + open HEADER, ">$featuresHeader" or die "Unable to open (for writing): $featuresHeader"; + + printf HEADER "#ifndef _LIBC_FEATURES_H_\n"; + printf HEADER "#define _LIBC_FEATURES_H_\n\n"; + + my $shortarch = $arch; + $shortarch =~ s/armv\d+[a-z]?/arm/g; + + printf HEADER "#if !defined(__".$shortarch."__)\n"; + printf HEADER "#error Mismatched libc-features.h architecture\n"; + printf HEADER "#endif\n\n"; + + if (defined($features{"FEATURE_LEGACY_RUNE_APIS"})) { + printf HEADER "#define UNIFDEF_LEGACY_RUNE_APIS 1\n"; + } else { + printf HEADER "/* #undef UNIFDEF_LEGACY_RUNE_APIS */\n"; + } + + if (defined($features{"FEATURE_LEGACY_CRT1_ENVIRON"})) { + printf HEADER "#define LEGACY_CRT1_ENVIRON 1\n"; + } else { + printf HEADER "/* #undef LEGACY_CRT1_ENVIRON */\n"; + } + + if (defined($features{"FEATURE_LEGACY_UTMP_APIS"})) { + printf HEADER "#define UNIFDEF_LEGACY_UTMP_APIS 1\n"; + } else { + printf HEADER "/* #undef UNIFDEF_LEGACY_UTMP_APIS */\n"; + } + + if (defined($features{"FEATURE_MOVE_LOCALTIME"})) { + printf HEADER "#define UNIFDEF_MOVE_LOCALTIME 1\n"; + } else { + printf HEADER "/* #undef UNIFDEF_MOVE_LOCALTIME */\n"; + } + + if (defined($features{"FEATURE_ONLY_1050_VARIANTS"})) { + printf HEADER "#if !__DARWIN_ONLY_VERS_1050\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 0\n"; + printf HEADER "#endif /* !__DARWIN_ONLY_VERS_1050 */\n"; + } else { + printf HEADER "#if __DARWIN_ONLY_VERS_1050\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_VERS_1050 == 1\n"; + printf HEADER "#endif /* __DARWIN_ONLY_VERS_1050 */\n"; + } + + if (defined($features{"FEATURE_ONLY_UNIX_CONFORMANCE"})) { + printf HEADER "#if !__DARWIN_ONLY_UNIX_CONFORMANCE\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 0\n"; + printf HEADER "#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */\n"; + } else { + printf HEADER "#if __DARWIN_ONLY_UNIX_CONFORMANCE\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_UNIX_CONFORMANCE == 1\n"; + printf HEADER "#endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */\n"; + } + + if (defined($features{"FEATURE_ONLY_64_BIT_INO_T"})) { + printf HEADER "#if !__DARWIN_ONLY_64_BIT_INO_T\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 0\n"; + printf HEADER "#endif /* !__DARWIN_ONLY_64_BIT_INO_T */\n"; + } else { + printf HEADER "#if __DARWIN_ONLY_64_BIT_INO_T\n"; + printf HEADER "# error Feature mismatch: __DARWIN_ONLY_64_BIT_INO_T == 1\n"; + printf HEADER "#endif /* __DARWIN_ONLY_64_BIT_INO_T */\n"; + } + + if (defined($features{"FEATURE_PATCH_3417676"})) { + printf HEADER "#define __APPLE_PR3417676_HACK__ 1\n"; + } else { + printf HEADER "/* #undef __APPLE_PR3417676_HACK__ */\n"; + } + + if (defined($features{"FEATURE_PATCH_5243343"})) { + printf HEADER "#define PR_5243343 1\n"; + } else { + printf HEADER "/* #undef PR_5243343 */\n"; + } + + if (defined($features{"FEATURE_PLOCKSTAT"})) { + printf HEADER "#define PLOCKSTAT 1\n"; + } else { + printf HEADER "/* #undef PLOCKSTAT */\n"; + } + + if (defined($features{"FEATURE_TIMEZONE_CHANGE_NOTIFICATION"})) { + printf HEADER "#define NOTIFY_TZ 1\n"; + } else { + printf HEADER "/* #undef NOTIFY_TZ */\n"; + } + + if (defined($features{"FEATURE_NO_LIBCRASHREPORTERCLIENT"})) { + printf HEADER "#define LIBC_NO_LIBCRASHREPORTERCLIENT 1\n"; + } else { + printf HEADER "/* #undef LIBC_NO_LIBCRASHREPORTERCLIENT */\n"; + } + + if (defined($features{"FEATURE_MEMORYSTATUS"})) { + printf HEADER "#define CONFIG_MEMORYSTATUS 1\n"; + } else { + printf HEADER "/* #undef CONFIG_MEMORYSTATUS */\n"; + } + + printf HEADER "#endif // _LIBC_FEATURES_H_\n"; + close HEADER; + } +} + +exit 0;