#!/usr/bin/perl if (!$ENV{"INSTALL_DIR"} or !$ENV{"PUBLIC_HEADERS_FOLDER_PATH"} or !$ENV{"PRIVATE_HEADERS_FOLDER_PATH"}) { die "Cannot update headers, missing ENV vars\n"; } $DO_SPLIT = ($#ARGV >= 0 and $ARGV[0] eq "split"); $API_BASE = $ENV{"INSTALL_DIR"} . "/" . $ENV{"PUBLIC_HEADERS_FOLDER_PATH"}; $SPI_BASE = $ENV{"INSTALL_DIR"} . "/" . $ENV{"PRIVATE_HEADERS_FOLDER_PATH"}; sub clean_INC { my ($inc) = @_; $inc =~ s/#ifdef\s+USE_SYSTEMCONFIGURATION_PRIVATE_HEADERS\s*.*?\n#include\s+.*?\n#else.*?\n//; $inc =~ s/#endif\s+.*?USE_SYSTEMCONFIGURATION_PRIVATE_HEADERS.*?\n//; return $inc; } sub clean_API { my ($api) = @_; my ($api_new); $api_new = $DO_SPLIT ? $api : clean_INC($api); $api_new =~ s/(__MAC)_\w+\/\*SPI\*\//\1_NA/g; $api_new =~ s/(\(__MAC_OS_X_VERSION_MIN_REQUIRED >= \d+\)\/\*SPI\*\/ \|\| )//g; $api_new =~ s/(__IPHONE)_\w+\/\*SPI\*\//\1_NA/g; $api_new =~ s/( \|\| \(__IPHONE_OS_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\///g; return $api_new; } sub clean_SPI { my ($spi) = @_; my ($spi_new); $spi_new = clean_INC($spi); $spi_new =~ s/(__MAC_\w+)\/\*SPI\*\//\1/g; $api_new =~ s/(\(__MAC_OS_X_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\/( \|\| )/\1\2/g; $spi_new =~ s/(__IPHONE_\w+)\/\*SPI\*\//\1/g; $spi_new =~ s/( \|\| )(\(__IPHONE_OS_VERSION_MIN_REQUIRED >= \d+\))\/\*SPI\*\//\1\2/g; return $spi_new; } # # Update .../PrivateHeaders # opendir(HEADERS, $SPI_BASE); @headers = readdir(HEADERS); closedir(HEADERS); undef $/; for (@headers) { next if ($_ eq '.'); next if ($_ eq '..'); $spi_header = $_; $spi_path = $SPI_BASE . "/" . $spi_header; next if (! -f $spi_path); open(SPI, "<", $spi_path); $spi = ; close(SPI); $spi_new = clean_SPI($spi); if ($spi ne $spi_new) { # printf "cleaning .../PrivateHeaders/%s\n", $spi_header; open(SPI, ">", $spi_path); print SPI $spi_new; close(SPI); } } $/ = "\n"; # # Update .../Headers # opendir(HEADERS, $API_BASE); @headers = readdir(HEADERS); closedir(HEADERS); undef $/; for (@headers) { next if ($_ eq '.'); next if ($_ eq '..'); $api_header = $_; $api_path = $API_BASE . "/" . $api_header; next if (! -f $api_path); open(API, "<", $api_path); $api = ; close(API); $api_new = clean_API($api); if ($api ne $api_new) { # printf "cleaning .../Headers/%s\n", $api_header; open(API, ">", $api_path); print API $api_new; close(API); if ($DO_SPLIT) { $spi_new = clean_SPI($api); if ($api_new ne $spi_new) { if ((($spi_header) = ($api =~ /#ifdef\s+USE_SYSTEMCONFIGURATION_PRIVATE_HEADERS\s*.*?\n#include\s+\s*.*?\n/))) { if ($api_header eq $spi_header) { die "API & SPI header not unique: $api_header\n"; } } else { die "Header missing #ifdef/#else/#endif: $api_header\n"; # $spi_header = $api_header; # $spi_header =~ s/\.h$/PRIVATE.h/; } # printf " adding .../PrivateHeaders/%s\n", $spi_header; $spi_path = $SPI_BASE . "/" . $spi_header; open(SPI, ">", $spi_path); print SPI $spi_new; close(SPI); } } } } $/ = "\n"; exit 0;