1

我试图让 ctags 在我执行 scons 时自动运行。我有一个基于这个答案的自定义构建器,它允许我从我的 SConscript 文件中运行 ctags。只要我tags在适当的目录中获得一个文件,这就是有效的。但是,由于构建器在根目录而不是子目录中运行,因此对于文件中包含的所有文件,我得到了错误的路径(也就是从根目录,而不是子目录)tags。除了sed用于去除标签文件中的路径之外,任何人都可以提供有关如何使 scons 生成正确路径的建议?

实际上,我想在特定目录(也就是 SConscript 所在的目录,可能作为选项传递?)而不是从项目根目录中运行构建器。

4

1 回答 1

0

这是我最终使用的构建器代码。请注意,ctags 命令有一个--tag-relative=yes选项。

# -*- coding: utf-8 -*-
import SCons.Builder
import SCons.Action

def complain_ctags(target, source, env):
    print 'INFORMATION: ctags binary was not found (see above). Tags have not been built.'

def generate(env):
    env['CTAGS'] = find_ctags(env)
    if env['CTAGS'] != None:
        #env['CTAGSCOM'] = 'cd $TARGET.dir; ctags -R .'
        env['CTAGSCOM'] = '$CTAGS --tag-relative=yes -f $TARGET $SOURCES'
        env['BUILDERS']['ctags'] = SCons.Builder.Builder(action=env['CTAGSCOM'])
    else:
        env['BUILDERS']['ctags'] = SCons.Builder.Builder(action=env.Action(complain_ctags))

def find_ctags(env):
    b=env.WhereIs('ctags')
    if b == None:
        print 'Searching for ctags: not found. Tags will not be built'
    else:
        print 'Searching for ctags: ', b
    return b

def exists(env):
    if find_ctags(env) == None:
        return 0
    return 1

在我的Sconscript文件中,我现在可以执行以下操作:

Alias('tags', env.ctags(source=all_python_files, target='tags'))

tags文件现在包含标签,其路径相对于标签文件的位置,而不是来自 scons 根目录。

于 2012-08-06T07:43:05.680 回答