17db96d56Sopenharmony_ci#! /bin/sh 27db96d56Sopenharmony_ciset -e 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci# Convert templates into Makefile and config.c, based on the module 57db96d56Sopenharmony_ci# definitions found in the file Setup. 67db96d56Sopenharmony_ci# 77db96d56Sopenharmony_ci# Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...] 87db96d56Sopenharmony_ci# 97db96d56Sopenharmony_ci# Options: 107db96d56Sopenharmony_ci# -s directory: alternative source directory (default .) 117db96d56Sopenharmony_ci# -l directory: library source directory (default derived from $0) 127db96d56Sopenharmony_ci# -c file: alternative config.c template (default $libdir/config.c.in) 137db96d56Sopenharmony_ci# -c -: don't write config.c 147db96d56Sopenharmony_ci# -m file: alternative Makefile template (default ./Makefile.pre) 157db96d56Sopenharmony_ci# -m -: don't write Makefile 167db96d56Sopenharmony_ci# 177db96d56Sopenharmony_ci# Remaining arguments are one or more Setup files (default ./Setup). 187db96d56Sopenharmony_ci# Setup files after a -n option are used for their variables, modules 197db96d56Sopenharmony_ci# and libraries but not for their .o files. 207db96d56Sopenharmony_ci# 217db96d56Sopenharmony_ci# See Setup for a description of the format of the Setup file. 227db96d56Sopenharmony_ci# 237db96d56Sopenharmony_ci# The following edits are made: 247db96d56Sopenharmony_ci# 257db96d56Sopenharmony_ci# Copying config.c.in to config.c: 267db96d56Sopenharmony_ci# - insert an identifying comment at the start 277db96d56Sopenharmony_ci# - for each <module> mentioned in Setup before *noconfig*: 287db96d56Sopenharmony_ci# + insert 'extern PyObject* PyInit_<module>(void);' before MARKER 1 297db96d56Sopenharmony_ci# + insert '{"<module>", PyInit_<module>},' before MARKER 2 307db96d56Sopenharmony_ci# 317db96d56Sopenharmony_ci# Copying Makefile.pre to Makefile: 327db96d56Sopenharmony_ci# - insert an identifying comment at the start 337db96d56Sopenharmony_ci# - replace _MODBUILT_NAMES_ by the list of *static* and *shared* modules 347db96d56Sopenharmony_ci# from Setup 357db96d56Sopenharmony_ci# - replace _MODBSHARED_NAMES_ by the list of *shared* modules from Setup 367db96d56Sopenharmony_ci# - replace _MODDISABLED_NAMES_ by the list of *disabled* modules from Setup 377db96d56Sopenharmony_ci# - replace _MODOBJS_ by the list of objects from Setup (except for 387db96d56Sopenharmony_ci# Setup files after a -n option) 397db96d56Sopenharmony_ci# - replace _MODLIBS_ by the list of libraries from Setup 407db96d56Sopenharmony_ci# - for each object file mentioned in Setup, append a rule 417db96d56Sopenharmony_ci# '<file>.o: <file>.c; <build commands>' to the end of the Makefile 427db96d56Sopenharmony_ci# - for each module mentioned in Setup, append a rule 437db96d56Sopenharmony_ci# which creates a shared library version to the end of the Makefile 447db96d56Sopenharmony_ci# - for each variable definition found in Setup, insert the definition 457db96d56Sopenharmony_ci# before the comment 'Definitions added by makesetup' 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci# Loop over command line options 487db96d56Sopenharmony_ciusage=' 497db96d56Sopenharmony_ciusage: makesetup [-s srcdir] [-l libdir] [-c config.c.in] [-m Makefile.pre] 507db96d56Sopenharmony_ci [Setup] ... [-n [Setup] ...]' 517db96d56Sopenharmony_cisrcdir='.' 527db96d56Sopenharmony_cilibdir='' 537db96d56Sopenharmony_ciconfig='' 547db96d56Sopenharmony_cimakepre='' 557db96d56Sopenharmony_cinoobjects='' 567db96d56Sopenharmony_cidoconfig=yes 577db96d56Sopenharmony_ciwhile : 587db96d56Sopenharmony_cido 597db96d56Sopenharmony_ci case $1 in 607db96d56Sopenharmony_ci -s) shift; srcdir=$1; shift;; 617db96d56Sopenharmony_ci -l) shift; libdir=$1; shift;; 627db96d56Sopenharmony_ci -c) shift; config=$1; shift;; 637db96d56Sopenharmony_ci -m) shift; makepre=$1; shift;; 647db96d56Sopenharmony_ci --) shift; break;; 657db96d56Sopenharmony_ci -n) noobjects=yes;; 667db96d56Sopenharmony_ci -*) echo "$usage" 1>&2; exit 2;; 677db96d56Sopenharmony_ci *) break;; 687db96d56Sopenharmony_ci esac 697db96d56Sopenharmony_cidone 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci# Set default libdir and config if not set by command line 727db96d56Sopenharmony_ci# (Not all systems have dirname) 737db96d56Sopenharmony_cicase $libdir in 747db96d56Sopenharmony_ci'') case $0 in 757db96d56Sopenharmony_ci */*) libdir=`echo $0 | sed 's,/[^/]*$,,'`;; 767db96d56Sopenharmony_ci *) libdir=.;; 777db96d56Sopenharmony_ci esac;; 787db96d56Sopenharmony_ciesac 797db96d56Sopenharmony_cicase $config in 807db96d56Sopenharmony_ci'') config=$libdir/config.c.in;; 817db96d56Sopenharmony_ciesac 827db96d56Sopenharmony_cicase $makepre in 837db96d56Sopenharmony_ci'') makepre=Makefile.pre;; 847db96d56Sopenharmony_ciesac 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci# Newline for sed i and a commands 877db96d56Sopenharmony_ciNL='\ 887db96d56Sopenharmony_ci' 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci# Setup to link with extra libraries when making shared extensions. 917db96d56Sopenharmony_ci# Currently, only Cygwin needs this baggage. 927db96d56Sopenharmony_cicase `uname -s` in 937db96d56Sopenharmony_ciCYGWIN*) if test $libdir = . 947db96d56Sopenharmony_ci then 957db96d56Sopenharmony_ci ExtraLibDir=. 967db96d56Sopenharmony_ci else 977db96d56Sopenharmony_ci ExtraLibDir='$(LIBPL)' 987db96d56Sopenharmony_ci fi 997db96d56Sopenharmony_ci ExtraLibs="-L$ExtraLibDir -lpython\$(LDVERSION)";; 1007db96d56Sopenharmony_ciesac 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci# Main loop 1037db96d56Sopenharmony_cifor i in ${*-Setup} 1047db96d56Sopenharmony_cido 1057db96d56Sopenharmony_ci case $i in 1067db96d56Sopenharmony_ci -n) echo '*noobjects*';; 1077db96d56Sopenharmony_ci *) echo '*doconfig*'; cat "$i";; 1087db96d56Sopenharmony_ci esac 1097db96d56Sopenharmony_cidone | 1107db96d56Sopenharmony_cised -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | 1117db96d56Sopenharmony_ci( 1127db96d56Sopenharmony_ci rulesf="@rules.$$" 1137db96d56Sopenharmony_ci trap 'rm -f $rulesf' 0 1 2 3 1147db96d56Sopenharmony_ci echo " 1157db96d56Sopenharmony_ci# Rules appended by makesetup 1167db96d56Sopenharmony_ci" >$rulesf 1177db96d56Sopenharmony_ci DEFS= 1187db96d56Sopenharmony_ci BUILT= 1197db96d56Sopenharmony_ci BUILT_SHARED= 1207db96d56Sopenharmony_ci DISABLED= 1217db96d56Sopenharmony_ci CONFIGURED= 1227db96d56Sopenharmony_ci MODS= 1237db96d56Sopenharmony_ci SHAREDMODS= 1247db96d56Sopenharmony_ci OBJS= 1257db96d56Sopenharmony_ci LIBS= 1267db96d56Sopenharmony_ci LOCALLIBS= 1277db96d56Sopenharmony_ci BASELIBS= 1287db96d56Sopenharmony_ci while read line 1297db96d56Sopenharmony_ci do 1307db96d56Sopenharmony_ci # to handle backslashes for sh's that don't automatically 1317db96d56Sopenharmony_ci # continue a read when the last char is a backslash 1327db96d56Sopenharmony_ci while echo $line | grep '\\$' > /dev/null 1337db96d56Sopenharmony_ci do 1347db96d56Sopenharmony_ci read extraline 1357db96d56Sopenharmony_ci line=`echo $line| sed s/.$//`$extraline 1367db96d56Sopenharmony_ci done 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci # Output DEFS in reverse order so first definition overrides 1397db96d56Sopenharmony_ci case $line in 1407db96d56Sopenharmony_ci *=*) DEFS="$line$NL$DEFS"; continue;; 1417db96d56Sopenharmony_ci 'include '*) DEFS="$line$NL$DEFS"; continue;; 1427db96d56Sopenharmony_ci '*noobjects*') 1437db96d56Sopenharmony_ci case $noobjects in 1447db96d56Sopenharmony_ci yes) ;; 1457db96d56Sopenharmony_ci *) LOCALLIBS=$LIBS; LIBS=;; 1467db96d56Sopenharmony_ci esac 1477db96d56Sopenharmony_ci noobjects=yes; 1487db96d56Sopenharmony_ci continue;; 1497db96d56Sopenharmony_ci '*doconfig*') doconfig=yes; continue;; 1507db96d56Sopenharmony_ci '*static*') doconfig=yes; continue;; 1517db96d56Sopenharmony_ci '*noconfig*') doconfig=no; continue;; 1527db96d56Sopenharmony_ci '*shared*') doconfig=no; continue;; 1537db96d56Sopenharmony_ci '*disabled*') doconfig=disabled; continue;; 1547db96d56Sopenharmony_ci esac 1557db96d56Sopenharmony_ci srcs= 1567db96d56Sopenharmony_ci cpps= 1577db96d56Sopenharmony_ci libs= 1587db96d56Sopenharmony_ci mods= 1597db96d56Sopenharmony_ci mods_upper= 1607db96d56Sopenharmony_ci skip= 1617db96d56Sopenharmony_ci for arg in $line 1627db96d56Sopenharmony_ci do 1637db96d56Sopenharmony_ci case $skip in 1647db96d56Sopenharmony_ci libs) libs="$libs $arg"; skip=; continue;; 1657db96d56Sopenharmony_ci cpps) cpps="$cpps $arg"; skip=; continue;; 1667db96d56Sopenharmony_ci srcs) srcs="$srcs $arg"; skip=; continue;; 1677db96d56Sopenharmony_ci esac 1687db96d56Sopenharmony_ci case $arg in 1697db96d56Sopenharmony_ci -framework) libs="$libs $arg"; skip=libs; 1707db96d56Sopenharmony_ci # OSX/OSXS/Darwin framework link cmd 1717db96d56Sopenharmony_ci ;; 1727db96d56Sopenharmony_ci -[IDUCfF]*) cpps="$cpps $arg";; 1737db96d56Sopenharmony_ci -Xcompiler) skip=cpps;; 1747db96d56Sopenharmony_ci -Xlinker) libs="$libs $arg"; skip=libs;; 1757db96d56Sopenharmony_ci -rpath) libs="$libs $arg"; skip=libs;; 1767db96d56Sopenharmony_ci --rpath) libs="$libs $arg"; skip=libs;; 1777db96d56Sopenharmony_ci -[A-Zl]*) libs="$libs $arg";; 1787db96d56Sopenharmony_ci *.a) libs="$libs $arg";; 1797db96d56Sopenharmony_ci *.so) libs="$libs $arg";; 1807db96d56Sopenharmony_ci *.sl) libs="$libs $arg";; 1817db96d56Sopenharmony_ci /*.o) libs="$libs $arg";; 1827db96d56Sopenharmony_ci *.def) libs="$libs $arg";; 1837db96d56Sopenharmony_ci *.o) srcs="$srcs `basename $arg .o`.c";; 1847db96d56Sopenharmony_ci *.[cC]) srcs="$srcs $arg";; 1857db96d56Sopenharmony_ci *.m) srcs="$srcs $arg";; # Objective-C src 1867db96d56Sopenharmony_ci *.cc) srcs="$srcs $arg";; 1877db96d56Sopenharmony_ci *.c++) srcs="$srcs $arg";; 1887db96d56Sopenharmony_ci *.cxx) srcs="$srcs $arg";; 1897db96d56Sopenharmony_ci *.cpp) srcs="$srcs $arg";; 1907db96d56Sopenharmony_ci \$\(*_CFLAGS\)) cpps="$cpps $arg";; 1917db96d56Sopenharmony_ci \$\(*_INCLUDES\)) cpps="$cpps $arg";; 1927db96d56Sopenharmony_ci \$\(*_LIBS\)) libs="$libs $arg";; 1937db96d56Sopenharmony_ci \$\(*_LDFLAGS\)) libs="$libs $arg";; 1947db96d56Sopenharmony_ci \$\(*_RPATH\)) libs="$libs $arg";; 1957db96d56Sopenharmony_ci \$*) libs="$libs $arg" 1967db96d56Sopenharmony_ci cpps="$cpps $arg";; 1977db96d56Sopenharmony_ci *.*) echo 1>&2 "bad word $arg in $line" 1987db96d56Sopenharmony_ci exit 1;; 1997db96d56Sopenharmony_ci -u) skip=libs; libs="$libs -u";; 2007db96d56Sopenharmony_ci [a-zA-Z_]*) 2017db96d56Sopenharmony_ci mods="$mods $arg" 2027db96d56Sopenharmony_ci mods_upper=$(echo $mods | tr '[a-z]' '[A-Z]');; 2037db96d56Sopenharmony_ci *) echo 1>&2 "bad word $arg in $line" 2047db96d56Sopenharmony_ci exit 1;; 2057db96d56Sopenharmony_ci esac 2067db96d56Sopenharmony_ci done 2077db96d56Sopenharmony_ci if test -z "$cpps" -a -z "$libs"; then 2087db96d56Sopenharmony_ci cpps="\$(MODULE_${mods_upper}_CFLAGS)" 2097db96d56Sopenharmony_ci libs="\$(MODULE_${mods_upper}_LDFLAGS)" 2107db96d56Sopenharmony_ci fi 2117db96d56Sopenharmony_ci for mod in $mods 2127db96d56Sopenharmony_ci do 2137db96d56Sopenharmony_ci case $CONFIGURED in 2147db96d56Sopenharmony_ci *,${mod},*) 2157db96d56Sopenharmony_ci # Detected multiple rules for a module, first rule wins. This 2167db96d56Sopenharmony_ci # allows users to disable modules in Setup.local. 2177db96d56Sopenharmony_ci echo 1>&2 "maksetup: '$mod' was handled by previous rule." 2187db96d56Sopenharmony_ci continue 2;; 2197db96d56Sopenharmony_ci esac 2207db96d56Sopenharmony_ci CONFIGURED="$CONFIGURED,${mod}," 2217db96d56Sopenharmony_ci done 2227db96d56Sopenharmony_ci case $doconfig in 2237db96d56Sopenharmony_ci yes) 2247db96d56Sopenharmony_ci LIBS="$LIBS $libs" 2257db96d56Sopenharmony_ci MODS="$MODS $mods" 2267db96d56Sopenharmony_ci BUILT="$BUILT $mods" 2277db96d56Sopenharmony_ci ;; 2287db96d56Sopenharmony_ci no) 2297db96d56Sopenharmony_ci BUILT="$BUILT $mods" 2307db96d56Sopenharmony_ci ;; 2317db96d56Sopenharmony_ci disabled) 2327db96d56Sopenharmony_ci DISABLED="$DISABLED $mods" 2337db96d56Sopenharmony_ci continue 2347db96d56Sopenharmony_ci ;; 2357db96d56Sopenharmony_ci esac 2367db96d56Sopenharmony_ci case $noobjects in 2377db96d56Sopenharmony_ci yes) continue;; 2387db96d56Sopenharmony_ci esac 2397db96d56Sopenharmony_ci objs='' 2407db96d56Sopenharmony_ci for src in $srcs 2417db96d56Sopenharmony_ci do 2427db96d56Sopenharmony_ci case $src in 2437db96d56Sopenharmony_ci *.c) obj=`basename $src .c`.o; cc='$(CC)';; 2447db96d56Sopenharmony_ci *.cc) obj=`basename $src .cc`.o; cc='$(CXX)';; 2457db96d56Sopenharmony_ci *.c++) obj=`basename $src .c++`.o; cc='$(CXX)';; 2467db96d56Sopenharmony_ci *.C) obj=`basename $src .C`.o; cc='$(CXX)';; 2477db96d56Sopenharmony_ci *.cxx) obj=`basename $src .cxx`.o; cc='$(CXX)';; 2487db96d56Sopenharmony_ci *.cpp) obj=`basename $src .cpp`.o; cc='$(CXX)';; 2497db96d56Sopenharmony_ci *.m) obj=`basename $src .m`.o; cc='$(CC)';; # Obj-C 2507db96d56Sopenharmony_ci *) continue;; 2517db96d56Sopenharmony_ci esac 2527db96d56Sopenharmony_ci case $src in 2537db96d56Sopenharmony_ci */*) obj="$srcdir/`dirname $src`/$obj";; 2547db96d56Sopenharmony_ci *) obj="$srcdir/$obj";; 2557db96d56Sopenharmony_ci esac 2567db96d56Sopenharmony_ci objs="$objs $obj" 2577db96d56Sopenharmony_ci case $src in 2587db96d56Sopenharmony_ci glmodule.c) ;; 2597db96d56Sopenharmony_ci /*) ;; 2607db96d56Sopenharmony_ci \$*) ;; 2617db96d56Sopenharmony_ci *) src='$(srcdir)/'"$srcdir/$src";; 2627db96d56Sopenharmony_ci esac 2637db96d56Sopenharmony_ci # custom flags first, PY_STDMODULE_CFLAGS may contain -I with system libmpdec 2647db96d56Sopenharmony_ci case $doconfig in 2657db96d56Sopenharmony_ci no) cc="$cc $cpps \$(PY_STDMODULE_CFLAGS) \$(CCSHARED)";; 2667db96d56Sopenharmony_ci *) 2677db96d56Sopenharmony_ci cc="$cc $cpps \$(PY_BUILTIN_MODULE_CFLAGS)";; 2687db96d56Sopenharmony_ci esac 2697db96d56Sopenharmony_ci # force rebuild when header file or module build flavor (static/shared) is changed 2707db96d56Sopenharmony_ci rule="$obj: $src \$(MODULE_${mods_upper}_DEPS) \$(PYTHON_HEADERS) Modules/config.c; $cc -c $src -o $obj" 2717db96d56Sopenharmony_ci echo "$rule" >>$rulesf 2727db96d56Sopenharmony_ci done 2737db96d56Sopenharmony_ci case $doconfig in 2747db96d56Sopenharmony_ci yes) OBJS="$OBJS $objs";; 2757db96d56Sopenharmony_ci esac 2767db96d56Sopenharmony_ci for mod in $mods 2777db96d56Sopenharmony_ci do 2787db96d56Sopenharmony_ci file="$srcdir/$mod\$(EXT_SUFFIX)" 2797db96d56Sopenharmony_ci case $doconfig in 2807db96d56Sopenharmony_ci no) 2817db96d56Sopenharmony_ci SHAREDMODS="$SHAREDMODS $file" 2827db96d56Sopenharmony_ci BUILT_SHARED="$BUILT_SHARED $mod" 2837db96d56Sopenharmony_ci ;; 2847db96d56Sopenharmony_ci esac 2857db96d56Sopenharmony_ci rule="$file: $objs" 2867db96d56Sopenharmony_ci rule="$rule; \$(BLDSHARED) $objs $libs $ExtraLibs -o $file" 2877db96d56Sopenharmony_ci echo "$rule" >>$rulesf 2887db96d56Sopenharmony_ci done 2897db96d56Sopenharmony_ci done 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci case $SHAREDMODS in 2927db96d56Sopenharmony_ci '') ;; 2937db96d56Sopenharmony_ci *) DEFS="SHAREDMODS=$SHAREDMODS$NL$DEFS";; 2947db96d56Sopenharmony_ci esac 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci case $noobjects in 2977db96d56Sopenharmony_ci yes) BASELIBS=$LIBS;; 2987db96d56Sopenharmony_ci *) LOCALLIBS=$LIBS;; 2997db96d56Sopenharmony_ci esac 3007db96d56Sopenharmony_ci LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)' 3017db96d56Sopenharmony_ci DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS" 3027db96d56Sopenharmony_ci DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS" 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci EXTDECLS= 3057db96d56Sopenharmony_ci INITBITS= 3067db96d56Sopenharmony_ci for mod in $MODS 3077db96d56Sopenharmony_ci do 3087db96d56Sopenharmony_ci EXTDECLS="${EXTDECLS}extern PyObject* PyInit_$mod(void);$NL" 3097db96d56Sopenharmony_ci INITBITS="${INITBITS} {\"$mod\", PyInit_$mod},$NL" 3107db96d56Sopenharmony_ci done 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci case $config in 3147db96d56Sopenharmony_ci -) ;; 3157db96d56Sopenharmony_ci *) sed -e " 3167db96d56Sopenharmony_ci 1i$NL/* Generated automatically from $config by makesetup. */ 3177db96d56Sopenharmony_ci /MARKER 1/i$NL$EXTDECLS 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci /MARKER 2/i$NL$INITBITS 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci " $config >config.c 3227db96d56Sopenharmony_ci ;; 3237db96d56Sopenharmony_ci esac 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci case $makepre in 3267db96d56Sopenharmony_ci -) ;; 3277db96d56Sopenharmony_ci *) 3287db96d56Sopenharmony_ci # macOS' sed has issues with 'a' command. Use 'r' command with an 3297db96d56Sopenharmony_ci # external replacement file instead. 3307db96d56Sopenharmony_ci sedf="@sed.in.$$" 3317db96d56Sopenharmony_ci sedr="@sed.replace.$$" 3327db96d56Sopenharmony_ci trap 'rm -f $sedf $sedr' 0 1 2 3 3337db96d56Sopenharmony_ci echo "$NL$NL$DEFS" | sed 's/\\$//' > $sedr 3347db96d56Sopenharmony_ci echo "1i\\" >$sedf 3357db96d56Sopenharmony_ci str="# Generated automatically from $makepre by makesetup." 3367db96d56Sopenharmony_ci echo "$str" >>$sedf 3377db96d56Sopenharmony_ci echo "s%_MODBUILT_NAMES_%$BUILT%" >>$sedf 3387db96d56Sopenharmony_ci echo "s%_MODSHARED_NAMES_%$BUILT_SHARED%" >>$sedf 3397db96d56Sopenharmony_ci echo "s%_MODDISABLED_NAMES_%$DISABLED%" >>$sedf 3407db96d56Sopenharmony_ci echo "s%_MODOBJS_%$OBJS%" >>$sedf 3417db96d56Sopenharmony_ci echo "s%_MODLIBS_%$LIBS%" >>$sedf 3427db96d56Sopenharmony_ci echo "/Definitions added by makesetup/r $sedr" >>$sedf 3437db96d56Sopenharmony_ci sed -f $sedf $makepre >Makefile 3447db96d56Sopenharmony_ci cat $rulesf >>Makefile 3457db96d56Sopenharmony_ci rm -f $sedf $sedr 3467db96d56Sopenharmony_ci ;; 3477db96d56Sopenharmony_ci esac 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci rm -f $rulesf 3507db96d56Sopenharmony_ci) 351