同步是Vim编辑器的源代码linter插件。
它使用外部工具进行各种语法和启发式检查。在C和C++代码中,这经常涉及在代码上运行编译器。
为了调用编译器,Syntastic会读取一个配置文件,其中包含应该用于调用编译器的命令行参数。
显然,项目中的“真正”编译是由预制件处理的,但这意味着可能有两种真相来源--写入Syntastic文件的编译器标志和预生成脚本中编写的编译器标志。
我还想通过在Syntastic文件中预先生成编译器标志来解决这个问题。
这似乎是一项相当简单的任务,有各种可能的方法--生成一个假编译器,发明一个预构建任务,等等。但我不太了解premake的内部结构,不知道这些方法中的哪一种是正确的。
如何获得预制作以生成我的syntastic.config文件?
发布于 2022-01-01 13:47:53
我查看了premake5下的几个不同的项目--最近在文档中添加了几个。他们都没有把我弄到那里。
问题是,我想要做的要么是“始终创建文件”,要么是“在premake5.lua文件更改时创建文件”。这让事情变得很困难,但也并非完全不可能。
但是,生成的文件不是任何项目的输入文件,因此显然将其从困难的ATM推向“不可能的ATM”。
我试着做预制作所称的自定义生成命令,但这需要生成的文件是它可以用来构建的源代码的一部分。如果不是这种情况,显然依赖关系图会中断,生成makefile时不依赖于文件。:(
为了使这个工作正常进行,我选择一直使用预构建命令重新生成文件:
prebuildcommands {
"$(SILENT) "
..repo_dir.."etc/write-syntastic-config.sh $(ALL_CFLAGS)"
.." > "
..repo_dir.."etc/syntastic.config"
}其中的关键值是$(ALL_CFLAGS),Makefile生成器用来保存我想要的东西的变量。
Syntastic文件及其配置文件的使用有点棘手。它不接受-L和-l选项,或者gcc可能不接受在任何模式下调用它们。无论如何,需要进行某种过滤--可以使用args。
另外,语法处理专门寻找-I的行,然后以一种特殊的方式处理这些行:包含路径被视为绝对路径,或者是相对于配置文件。
最后,合成器似乎不了解-isystem,这是gcc的另一个包含目录选项。所以必须用不同的方法来处理。
如果有人关心的话,下面是我正在使用的脚本:
etc/write-syntastic-config.sh
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
PENDING=""
PENDING_DIR=false
printf '# Generated by %s\n' "$(basename "$0")"
CFG_FILE_DIR="$(dirname "$0")"
for ARG in "$@"
do
#printf >&2 "arg=>%s<\\n" "$ARG"
case "$ARG" in
-I| \
-L)
PENDING="$ARG"
PENDING_DIR=true
;;
-isystem)
# -isystem is like -I, except syntastic doesn't know it
printf '%s\n' "$ARG"
PENDING_DIR=true
;;
-I*| \
-L*) PENDING_DIR=true
PENDING="${ARG:0:2}"
ARG="${ARG/#-?/}"
;;& #<-- Resume matching cases (i.e, "goto next case")
*) if $PENDING_DIR
then
ARG="$(realpath -m \
--relative-to "$CFG_FILE_DIR" \
"$ARG")"
fi
case "$PENDING" in
-L) : ignore it ;;
"") printf '%s\n' "$ARG" ;;
*) printf '%s %s\n' "$PENDING" "$ARG" ;;
esac
PENDING=""
PENDING_DIR=false
;;
esac
done
exit 0https://stackoverflow.com/questions/70390192
复制相似问题