2012-08-03 55 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的根目錄。