#!/usr/bin/perl # # Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana # University Research and Technology # Corporation. All rights reserved. # Copyright (c) 2004-2005 The University of Tennessee and The University # of Tennessee Research Foundation. All rights # reserved. # Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, # University of Stuttgart. All rights reserved. # Copyright (c) 2004-2005 The Regents of the University of California. # All rights reserved. # $COPYRIGHT$ # # Additional copyrights may follow # # $HEADER$ # #this is the perl scripty foo which does the following tasks # 1. Extract the #include <*.h> files which are present in both header and source files # 2. Do some basic formatting # 3. Check if these included files are present on the platform which has been given if (scalar(@ARGV) != 2) { print "Usage: ./depend.pl \n"; exit(3); } $includes_file = "headers.txt"; $return = &get_header_files($includes_file); $test_file = "test_headers.txt"; $return = &parse_header_files($includes_file, $test_file); $source_tree = @ARGV[0]; $CC = @ARGV[1]; $result_file = "results.txt"; $return = &test_for_headers($test_file, $result_file, $CC); # this file is used to extract which header files are included in a particular # source file. Kind of a neat implementation sub get_header_files { local($dump_file) = @_; open(C_FILES, "find $source_tree -name \*.c |") || print "could not find source files\n"; open(H_FILES, "find $source_tree -name \*.c |") || print "could not find header files\n"; open(DUMP, "> $dump_file") || print "Could not open $dump_file\n"; while () { $file_h = $_; print DUMP "Processing $file_h"; open(FILE_H, "$file_h") || print "could not open file for reading\n"; #grep for the pattern which we want while () { if (/#include ) { $file_h = $_; print DUMP "Processing $file_h"; open(FILE_H, "$file_h") || print "could not open file for reading\n"; #grep for the pattern which we want while () { if (/#include $test_file") || print "Could not open $test_file for reading\n"; while () { if (/#include temp.txt") || print "Could not open temp.txt for writing\n"; while(
) { #remove leading white spaces s/^\s*//; #remove anything after <*.h> s/>{1,1}.*\n/>\n/; #remove anything before #include s/^.*#include/#include/; print TEMP $_; } close(HEADER); close(TEMP); #remove duplicate occurences of the file system("sort temp.txt | uniq > $test_file"); return 0; } #this suroutine is used to test if a particular header is present or absent in a particular language sub test_for_headers { local($test_file, $result_file, $CC) = @_; local($temp) = "temp.c"; print "CC = $CC\n"; open(HEADER, "$test_file") || print "Could not open $test_file for reading\n"; open(RESULTS, "> $result_file") || print "Could not open $result_file for writing\n"; while(
) { print $_; #create the file for compilation chomp $_; $string = " $_ /*this is the include file to be tested for*/ int main(int argc, char **argv) { return 0; } "; open(TEMP, "> $temp") || print "Could not open $temp for writing\n"; print TEMP $string; close(TEMP); $compiled = system("$CC $temp"); if ($compiled == 0) { print "$_ is present\n"; } else { print RESULTS "$_\n"; } system("rm -Rf $temp"); system("rm -Rf temp.*"); } close(HEADER); close(RESULTS); return 0; }