2012-08-03 78 views
1

我想让ctags在我执行scons时自动运行。我有一个custom builder based on this answer,它允许我从我的SConscript文件中运行ctags。只要我在合适的目录中获得tags文件,这可以起作用。但是,由于构建器在根目录中运行,而不是在子目录中运行,所以我在tags文件中找到包含所有文件的路径(从根,不是子目录)。除了使用sed去除标签文件中的路径之外,任何人都可以提供关于如何使scons生成正确路径的建议?scons和ctags

在效果,我想在特定目录(又名一个在SConscript所在,也许作为一个选项传递?),而不是从项目root身份运行的建设者。

+0

你可以提供一些有关路径问题的细节,也可能是SConscript的一个片段。您可以使用#字符指定相对于项目根目录的路径。 – Brady 2012-08-03 16:51:24

+0

使用'#'制作项目根目录的路径(例如放置SConstruct)。 – Torsten 2012-08-03 17:44:16

+0

@Brady:代码与链接答案中的代码非常相似,但是'epydoc'替换为'ctags'。是的,我知道,我应该把它写得更通用。坏我。没有饼干。 – Sardathrion 2012-08-04 10:48:14

回答

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文件(S),我现在可以这样做:

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

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