1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker########################################################################### 25*6236dae4SAndroid Build Coastguard Worker# 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Workeruse strict; 28*6236dae4SAndroid Build Coastguard Workeruse warnings; 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard Worker# the DISABLE options that can be set by configure 31*6236dae4SAndroid Build Coastguard Workermy %disable; 32*6236dae4SAndroid Build Coastguard Worker# the DISABLE options that can be set by CMakeLists.txt 33*6236dae4SAndroid Build Coastguard Workermy %disable_cmake; 34*6236dae4SAndroid Build Coastguard Worker# the DISABLE options propagated via curl_config.h.cmake 35*6236dae4SAndroid Build Coastguard Workermy %disable_cmake_config_h; 36*6236dae4SAndroid Build Coastguard Worker# the DISABLE options that are used in C files 37*6236dae4SAndroid Build Coastguard Workermy %file; 38*6236dae4SAndroid Build Coastguard Worker# the DISABLE options that are documented 39*6236dae4SAndroid Build Coastguard Workermy %docs; 40*6236dae4SAndroid Build Coastguard Worker 41*6236dae4SAndroid Build Coastguard Worker# we may get the dir root pointed out 42*6236dae4SAndroid Build Coastguard Workermy $root=$ARGV[0] || "."; 43*6236dae4SAndroid Build Coastguard Workermy $DOCS="CURL-DISABLE.md"; 44*6236dae4SAndroid Build Coastguard Worker 45*6236dae4SAndroid Build Coastguard Workersub scanconf { 46*6236dae4SAndroid Build Coastguard Worker my ($f)=@_; 47*6236dae4SAndroid Build Coastguard Worker open S, "<$f"; 48*6236dae4SAndroid Build Coastguard Worker while(<S>) { 49*6236dae4SAndroid Build Coastguard Worker if(/(CURL_DISABLE_[A-Z0-9_]+)/g) { 50*6236dae4SAndroid Build Coastguard Worker my ($sym)=($1); 51*6236dae4SAndroid Build Coastguard Worker $disable{$sym} = 1; 52*6236dae4SAndroid Build Coastguard Worker } 53*6236dae4SAndroid Build Coastguard Worker } 54*6236dae4SAndroid Build Coastguard Worker close S; 55*6236dae4SAndroid Build Coastguard Worker} 56*6236dae4SAndroid Build Coastguard Worker 57*6236dae4SAndroid Build Coastguard Workersub scan_configure { 58*6236dae4SAndroid Build Coastguard Worker opendir(my $m, "$root/m4") || die "Can't opendir $root/m4: $!"; 59*6236dae4SAndroid Build Coastguard Worker my @m4 = grep { /\.m4$/ } readdir($m); 60*6236dae4SAndroid Build Coastguard Worker closedir $m; 61*6236dae4SAndroid Build Coastguard Worker scanconf("$root/configure.ac"); 62*6236dae4SAndroid Build Coastguard Worker # scan all m4 files too 63*6236dae4SAndroid Build Coastguard Worker for my $e (@m4) { 64*6236dae4SAndroid Build Coastguard Worker scanconf("$root/m4/$e"); 65*6236dae4SAndroid Build Coastguard Worker } 66*6236dae4SAndroid Build Coastguard Worker} 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Workersub scanconf_cmake { 69*6236dae4SAndroid Build Coastguard Worker my ($hashr, $f)=@_; 70*6236dae4SAndroid Build Coastguard Worker open S, "<$f"; 71*6236dae4SAndroid Build Coastguard Worker while(<S>) { 72*6236dae4SAndroid Build Coastguard Worker if(/(CURL_DISABLE_[A-Z0-9_]+)/g) { 73*6236dae4SAndroid Build Coastguard Worker my ($sym)=($1); 74*6236dae4SAndroid Build Coastguard Worker if(not $sym =~ /^(CURL_DISABLE_INSTALL|CURL_DISABLE_TESTS|CURL_DISABLE_SRP)$/) { 75*6236dae4SAndroid Build Coastguard Worker $hashr->{$sym} = 1; 76*6236dae4SAndroid Build Coastguard Worker } 77*6236dae4SAndroid Build Coastguard Worker } 78*6236dae4SAndroid Build Coastguard Worker } 79*6236dae4SAndroid Build Coastguard Worker close S; 80*6236dae4SAndroid Build Coastguard Worker} 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard Workersub scan_cmake { 83*6236dae4SAndroid Build Coastguard Worker scanconf_cmake(\%disable_cmake, "$root/CMakeLists.txt"); 84*6236dae4SAndroid Build Coastguard Worker} 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Workersub scan_cmake_config_h { 87*6236dae4SAndroid Build Coastguard Worker scanconf_cmake(\%disable_cmake_config_h, "$root/lib/curl_config.h.cmake"); 88*6236dae4SAndroid Build Coastguard Worker} 89*6236dae4SAndroid Build Coastguard Worker 90*6236dae4SAndroid Build Coastguard Workersub scan_file { 91*6236dae4SAndroid Build Coastguard Worker my ($source)=@_; 92*6236dae4SAndroid Build Coastguard Worker open F, "<$source"; 93*6236dae4SAndroid Build Coastguard Worker while(<F>) { 94*6236dae4SAndroid Build Coastguard Worker while(s/(CURL_DISABLE_[A-Z0-9_]+)//) { 95*6236dae4SAndroid Build Coastguard Worker my ($sym)=($1); 96*6236dae4SAndroid Build Coastguard Worker $file{$sym} = $source; 97*6236dae4SAndroid Build Coastguard Worker } 98*6236dae4SAndroid Build Coastguard Worker } 99*6236dae4SAndroid Build Coastguard Worker close F; 100*6236dae4SAndroid Build Coastguard Worker} 101*6236dae4SAndroid Build Coastguard Worker 102*6236dae4SAndroid Build Coastguard Workersub scan_dir { 103*6236dae4SAndroid Build Coastguard Worker my ($dir)=@_; 104*6236dae4SAndroid Build Coastguard Worker opendir(my $dh, $dir) || die "Can't opendir $dir: $!"; 105*6236dae4SAndroid Build Coastguard Worker my @cfiles = grep { /\.[ch]\z/ && -f "$dir/$_" } readdir($dh); 106*6236dae4SAndroid Build Coastguard Worker closedir $dh; 107*6236dae4SAndroid Build Coastguard Worker for my $f (sort @cfiles) { 108*6236dae4SAndroid Build Coastguard Worker scan_file("$dir/$f"); 109*6236dae4SAndroid Build Coastguard Worker } 110*6236dae4SAndroid Build Coastguard Worker} 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Workersub scan_sources { 113*6236dae4SAndroid Build Coastguard Worker scan_dir("$root/src"); 114*6236dae4SAndroid Build Coastguard Worker scan_dir("$root/lib"); 115*6236dae4SAndroid Build Coastguard Worker scan_dir("$root/lib/vtls"); 116*6236dae4SAndroid Build Coastguard Worker scan_dir("$root/lib/vauth"); 117*6236dae4SAndroid Build Coastguard Worker} 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard Workersub scan_docs { 120*6236dae4SAndroid Build Coastguard Worker open F, "<$root/docs/$DOCS"; 121*6236dae4SAndroid Build Coastguard Worker my $line = 0; 122*6236dae4SAndroid Build Coastguard Worker while(<F>) { 123*6236dae4SAndroid Build Coastguard Worker $line++; 124*6236dae4SAndroid Build Coastguard Worker if(/^## `(CURL_DISABLE_[A-Z0-9_]+)`/g) { 125*6236dae4SAndroid Build Coastguard Worker my ($sym)=($1); 126*6236dae4SAndroid Build Coastguard Worker $docs{$sym} = $line; 127*6236dae4SAndroid Build Coastguard Worker } 128*6236dae4SAndroid Build Coastguard Worker } 129*6236dae4SAndroid Build Coastguard Worker close F; 130*6236dae4SAndroid Build Coastguard Worker} 131*6236dae4SAndroid Build Coastguard Worker 132*6236dae4SAndroid Build Coastguard Workerscan_configure(); 133*6236dae4SAndroid Build Coastguard Workerscan_cmake(); 134*6236dae4SAndroid Build Coastguard Workerscan_cmake_config_h(); 135*6236dae4SAndroid Build Coastguard Workerscan_sources(); 136*6236dae4SAndroid Build Coastguard Workerscan_docs(); 137*6236dae4SAndroid Build Coastguard Worker 138*6236dae4SAndroid Build Coastguard Worker 139*6236dae4SAndroid Build Coastguard Workermy $error = 0; 140*6236dae4SAndroid Build Coastguard Worker# Check the configure symbols for use in code 141*6236dae4SAndroid Build Coastguard Workerfor my $s (sort keys %disable) { 142*6236dae4SAndroid Build Coastguard Worker if(!$file{$s}) { 143*6236dae4SAndroid Build Coastguard Worker printf "Present in configure.ac, not used by code: %s\n", $s; 144*6236dae4SAndroid Build Coastguard Worker $error++; 145*6236dae4SAndroid Build Coastguard Worker } 146*6236dae4SAndroid Build Coastguard Worker if(!$docs{$s}) { 147*6236dae4SAndroid Build Coastguard Worker printf "Present in configure.ac, not documented in $DOCS: %s\n", $s; 148*6236dae4SAndroid Build Coastguard Worker $error++; 149*6236dae4SAndroid Build Coastguard Worker } 150*6236dae4SAndroid Build Coastguard Worker} 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker# Check the CMakeLists.txt symbols for use in code 153*6236dae4SAndroid Build Coastguard Workerfor my $s (sort keys %disable_cmake) { 154*6236dae4SAndroid Build Coastguard Worker if(!$file{$s}) { 155*6236dae4SAndroid Build Coastguard Worker printf "Present in CMakeLists.txt, not used by code: %s\n", $s; 156*6236dae4SAndroid Build Coastguard Worker $error++; 157*6236dae4SAndroid Build Coastguard Worker } 158*6236dae4SAndroid Build Coastguard Worker if(!$docs{$s}) { 159*6236dae4SAndroid Build Coastguard Worker printf "Present in CMakeLists.txt, not documented in $DOCS: %s\n", $s; 160*6236dae4SAndroid Build Coastguard Worker $error++; 161*6236dae4SAndroid Build Coastguard Worker } 162*6236dae4SAndroid Build Coastguard Worker} 163*6236dae4SAndroid Build Coastguard Worker 164*6236dae4SAndroid Build Coastguard Worker# Check the CMakeLists.txt symbols for use in curl_config.h.cmake 165*6236dae4SAndroid Build Coastguard Workerfor my $s (sort keys %disable_cmake) { 166*6236dae4SAndroid Build Coastguard Worker if(!$disable_cmake_config_h{$s}) { 167*6236dae4SAndroid Build Coastguard Worker printf "Present in CMakeLists.txt, not propagated via curl_config.h.cmake: %s\n", $s; 168*6236dae4SAndroid Build Coastguard Worker $error++; 169*6236dae4SAndroid Build Coastguard Worker } 170*6236dae4SAndroid Build Coastguard Worker} 171*6236dae4SAndroid Build Coastguard Worker 172*6236dae4SAndroid Build Coastguard Worker# Check the code symbols for use in configure 173*6236dae4SAndroid Build Coastguard Workerfor my $s (sort keys %file) { 174*6236dae4SAndroid Build Coastguard Worker if(!$disable{$s}) { 175*6236dae4SAndroid Build Coastguard Worker printf "Not set by configure: %s (%s)\n", $s, $file{$s}; 176*6236dae4SAndroid Build Coastguard Worker $error++; 177*6236dae4SAndroid Build Coastguard Worker } 178*6236dae4SAndroid Build Coastguard Worker if(!$disable_cmake{$s}) { 179*6236dae4SAndroid Build Coastguard Worker printf "Not set by CMakeLists.txt: %s (%s)\n", $s, $file{$s}; 180*6236dae4SAndroid Build Coastguard Worker $error++; 181*6236dae4SAndroid Build Coastguard Worker } 182*6236dae4SAndroid Build Coastguard Worker if(!$docs{$s}) { 183*6236dae4SAndroid Build Coastguard Worker printf "Used in code, not documented in $DOCS: %s\n", $s; 184*6236dae4SAndroid Build Coastguard Worker $error++; 185*6236dae4SAndroid Build Coastguard Worker } 186*6236dae4SAndroid Build Coastguard Worker} 187*6236dae4SAndroid Build Coastguard Worker 188*6236dae4SAndroid Build Coastguard Worker# Check the documented symbols 189*6236dae4SAndroid Build Coastguard Workerfor my $s (sort keys %docs) { 190*6236dae4SAndroid Build Coastguard Worker if(!$disable{$s}) { 191*6236dae4SAndroid Build Coastguard Worker printf "Documented but not in configure: %s\n", $s; 192*6236dae4SAndroid Build Coastguard Worker $error++; 193*6236dae4SAndroid Build Coastguard Worker } 194*6236dae4SAndroid Build Coastguard Worker if(!$disable_cmake{$s}) { 195*6236dae4SAndroid Build Coastguard Worker printf "Documented but not in CMakeLists.txt: %s\n", $s; 196*6236dae4SAndroid Build Coastguard Worker $error++; 197*6236dae4SAndroid Build Coastguard Worker } 198*6236dae4SAndroid Build Coastguard Worker if(!$file{$s}) { 199*6236dae4SAndroid Build Coastguard Worker printf "Documented, but not used by code: %s\n", $s; 200*6236dae4SAndroid Build Coastguard Worker $error++; 201*6236dae4SAndroid Build Coastguard Worker } 202*6236dae4SAndroid Build Coastguard Worker} 203*6236dae4SAndroid Build Coastguard Worker 204*6236dae4SAndroid Build Coastguard Workerexit $error; 205