介绍
make clean
make -j8 > build_log
./si_tool.sh build_log file_list_kernel5.15
make distclean
make V=1 > log.log
应该可以再一步优化:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=OUTPUT -j8 > log.txt
通过上述的O=OUTPUT
指定输出文件结果目录。方便查找o文件
新建工程
浏览模式(只读)
Edit ->Browser Mode
创建一个名为"si.sh"的文件,内容如下:
#!/bin/bash
rm -f *.si
part1_all_file=part1_all.si
part1_out_file=part1_out_file.si
#rm -f $part1_all_file
#rm -f $part1_out_file
object_files=$(find ./ -type f -name "*.o")
for object_file in $object_files; do
tmp_file="${object_file%o*}*"
echo $tmp_file >> $part1_all_file
done
sed -i 's/ /\n/g' $part1_all_file
grep -E '\.(c|h|S|s)$' $part1_all_file > $part1_out_file
#ls -l $part1_out_file
#--------------------------------------------------------------------
logfile="log.log"
part2_all_path="all.si"
no_pwd_path="no_pwd.si"
char_path="char.si"
repeat_path="repeat.si"
part2_out_file="part2_out_file.si"
#rm -f $part2_all_path
#rm -f $no_pwd_path
#rm -f $char_path
#rm -f $part2_out_file
grep -oE '\b\S+\.S\b' $logfile | grep -v '/\.' | grep -v '=' >> $part2_all_path
grep -oE '\b\S+\.s\b' $logfile | grep -v '/\.' | grep -v '=' >> $part2_all_path
grep -oE '\b\S+\.c\b' $logfile | grep -v '/\.' | grep -v '=' >> $part2_all_path
grep -oE '\b\S+\.h\b' $logfile | grep -v '/\.' | grep -v '=' >> $part2_all_path
current_path=$(pwd)
#echo $current_path
tmp_path="${current_path:1}"
#echo $tmp_path
# delet current_path
while IFS= read -r line; do
modified_line="${line//$tmp_path/}"
echo "$modified_line" >> "$no_pwd_path"
done < "$part2_all_path"
# detect char "/"
while IFS= read -r line; do
if [[ ${line:0:1} != '/' ]]; then
modified_line="/${line}"
else
modified_line="${line}"
fi
echo "$modified_line" >> "$char_path"
done < "$no_pwd_path"
# add char "."
while IFS= read -r line; do
modified_line=".$line"
echo "$modified_line" >> "$repeat_path"
done < "$char_path"
# 使用awk命令对文件进行处理,只保留第一次出现的字符串
awk '!seen[$0]++' "$repeat_path" > "$part2_out_file"
#ls -l $part2_out_file
#--------------------------------------------------------------------
part1_file="part1_out_file.si"
part2_file="part2_out_file.si"
all_out_file="all_out_file.si"
# 读取part1_out_file.si文件的每一行,并将其存储到part1_lines数组中
mapfile -t part1_lines < "$part1_file"
# 创建共同拥有的字符串数组和各自独立拥有的字符串数组
declare -a common_strings
declare -a unique_part1_strings
declare -a unique_part2_strings
# 检查part1_out_file.si文件的每一行是否在part2_out_file.si文件中存在,根据情况将其添加到相应的数组中
for part1_line in "${part1_lines[@]}"; do
if grep -qFx "$part1_line" "$part2_file"; then
common_strings+=("$part1_line")
else
unique_part1_strings+=("$part1_line")
fi
done
# 读取part2_out_file.si文件的每一行,并将其与common_strings数组进行比较,将独立拥有的字符串添加到相应的数组中
mapfile -t part2_lines < "$part2_file"
for part2_line in "${part2_lines[@]}"; do
if ! grep -qFx "$part2_line" "$part1_file"; then
unique_part2_strings+=("$part2_line")
fi
done
# 将共同拥有的字符串、part1_out_file.si独立拥有的字符串和part2_out_file.si独立拥有的字符串整合到all_out_file.si文件中
{
echo "共同拥有的字符串:"
printf "%s\n" "${common_strings[@]}"
echo
echo "part1_out_file.si独立拥有的字符串:"
printf "%s\n" "${unique_part1_strings[@]}"
echo
echo "part2_out_file.si独立拥有的字符串:"
printf "%s\n" "${unique_part2_strings[@]}"
} > "$all_out_file"
echo "整合结果已保存到 $all_out_file 文件中。"
#--------------------------------------------------------------------
all_out_file="all_out_file.si"
final_out_file="final_out_file.si"
# 从all_out_file.si文件中读取每一行字符串,并剔除不是以"."字符开头的行
grep '^\.' "$all_out_file" > "$final_out_file"
echo "剔除非\".\"开头的字符串后的结果已保存到 $final_out_file 文件中。"
ls -l $final_out_file
在 Makefile 文件中,
make clean
和make distclean
是常见的用于清理构建过程中生成的文件的标。
make clean
:这个目标通常用于清理编过程中生成的中文件和目标文件,但保留用户自定义的配置选项和生成的执行文件。它会删除编译过程生成的临时文件,例如目标文件.o)、预处理文件(.i)和编译器生成的其他间文件。这样可以确保下次构建时从干净状态开始,而不会受到前构建过程中遗留的文件的影响。
make distclean
:这个目标通常于更彻底地清理构过程中生成的文件,包括用户自定义的配置选项生成的可执行文件。它会执行make clean
的操作,并进一步删除由配置过生成的文件,例如配置脚本生成的 Makefile、配置头文件等。这样可以还源代码目录到一个类似初始状态的状态,以便重新进行完整的配置和构建。总结来,
make clean
用于清理编译过程中生成的时文件,而make distclean
则更彻底地清理构建过程中生成文件,包括用户自定义的配置选项和生成可执行文件。