1

scons を実行するときに ctags が自動的に実行されるようにしようとしています。SConscript ファイル内から ctags を実行できる、この回答に基づくカスタム ビルダーがあります。tagsこれは、適切なディレクトリにファイルを取得する限り機能します。ただし、ビルダーはサブディレクトリではなくルート ディレクトリ内で実行されるため、ファイル内に含まれるすべてのファイルの間違ったパス (サブディレクトリではなくルートから) を取得しtagsます。タグファイルのパスを削除するために使用することとは別に、sedscons が正しいパスを生成する方法について、誰でも提案できますか?

実際には、プロジェクト ルートからではなく、特定のディレクトリ(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 に答える