# Copyright © 2019 and later: Unicode, Inc. and others. # License & terms of use: http://www.unicode.org/copyright.html # Run this script from $ICU_ROOT/icu4c. # ~/icu/mine/src/icu4c$ source/test/hdrtest/testtagsguards.sh # set -x # echo on DEF=-DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 INCL="-Isource/common -Isource/i18n -Isource/io" TMPDIR=`mktemp -d` DIFF="diff -u --minimal" echo "*** testtagsguards.sh TMPDIR=$TMPDIR" for file in source/common/unicode/*.h source/i18n/unicode/*.h source/io/unicode/*.h ; do base=`basename $file` echo $file echo '#include "unicode/'$base'"' > $TMPDIR/ht-$base.cpp # Preprocess only. clang++ $INCL -C -E $DEF -o $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base.cpp # When hiding @draft, none should be in the output. TAG=draft GUARD=DRAFT echo " @$TAG" clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i" exit 1 fi # Only @draft should be hidden. # Except: Ok to hide nested @internal/@system/@obsolete. $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt if egrep '^-.*@(stable|deprecated)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt" cat $TMPDIR/ht-$base-normal-$TAG.txt exit 1 fi # @deprecated TAG=deprecated GUARD=DEPRECATED echo " @$TAG" clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i" exit 1 fi # In the egrep: All tags except $TAG and @internal & similar. $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt if egrep '^-.*@(stable|draft)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt" cat $TMPDIR/ht-$base-normal-$TAG.txt exit 1 fi # TODO: @internal # Hiding some @internal definitions, in particular in platform.h and similar, # tends to break even preprocessing of other headers. # @system TAG=system GUARD=SYSTEM echo " @$TAG" clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i" exit 1 fi # @system is orthogonal to @stable / @deprecated etc., # so we don't check that none of those are hidden. # @obsolete TAG=obsolete GUARD=OBSOLETE echo " @$TAG" clang++ $INCL -C -E -DU_HIDE_${GUARD}_API=1 -DU_FORCE_HIDE_${GUARD}_API=1 $DEF -o $TMPDIR/ht-$base-$TAG.i $TMPDIR/ht-$base.cpp if grep "@$TAG" -C 5 $TMPDIR/ht-$base-$TAG.i; then echo "*** error: @$TAG not hidden in $TMPDIR/ht-$base-$TAG.i" exit 1 fi # In the egrep: All tags except $TAG and @internal & similar. $DIFF $TMPDIR/ht-$base-normal.i $TMPDIR/ht-$base-$TAG.i > $TMPDIR/ht-$base-normal-$TAG.txt if egrep '^-.*@(stable|draft|deprecated)' -C 5 $TMPDIR/ht-$base-normal-$TAG.txt; then echo "*** error: Non-@$TAG hidden in $TMPDIR/ht-$base-$TAG.i see $TMPDIR/ht-$base-normal-$TAG.txt" cat $TMPDIR/ht-$base-normal-$TAG.txt exit 1 fi done echo "pass" rm -rf $TMPDIR