首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用预制作生成Syntastic文件?

如何使用预制作生成Syntastic文件?
EN

Stack Overflow用户
提问于 2021-12-17 08:19:16
回答 1查看 69关注 0票数 0

同步是Vim编辑器的源代码linter插件。

它使用外部工具进行各种语法和启发式检查。在C和C++代码中,这经常涉及在代码上运行编译器。

为了调用编译器,Syntastic会读取一个配置文件,其中包含应该用于调用编译器的命令行参数。

显然,项目中的“真正”编译是由预制件处理的,但这意味着可能有两种真相来源--写入Syntastic文件的编译器标志和预生成脚本中编写的编译器标志。

我还想通过在Syntastic文件中预先生成编译器标志来解决这个问题。

这似乎是一项相当简单的任务,有各种可能的方法--生成一个假编译器,发明一个预构建任务,等等。但我不太了解premake的内部结构,不知道这些方法中的哪一种是正确的。

如何获得预制作以生成我的syntastic.config文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-01 13:47:53

我查看了premake5下的几个不同的项目--最近在文档中添加了几个。他们都没有把我弄到那里。

问题是,我想要做的要么是“始终创建文件”,要么是“在premake5.lua文件更改时创建文件”。这让事情变得很困难,但也并非完全不可能。

但是,生成的文件不是任何项目的输入文件,因此显然将其从困难的ATM推向“不可能的ATM”。

我试着做预制作所称的自定义生成命令,但这需要生成的文件是它可以用来构建的源代码的一部分。如果不是这种情况,显然依赖关系图会中断,生成makefile时不依赖于文件。:(

为了使这个工作正常进行,我选择一直使用预构建命令重新生成文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/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 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70390192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档