1

ダウンロードしたSCONSの「makereplacement」とFastLightToolKitGuiを使用するアプリケーションを作成しようとしています。

fltkの存在を検出するためのSConstructコードは次のとおりです。

guienv = Environment(CPPFLAGS = '')
guiconf = Configure(guienv)

if not guiconf.CheckLibWithHeader('lo', 'lo/lo.h','c'):
    print 'Did not find liblo for OSC, exiting!'
    Exit(1)

if not guiconf.CheckLibWithHeader('fltk', 'FL/Fl.H','c++'):
    print 'Did not find FLTK for the gui, exiting!'
    Exit(1)

残念ながら、私の(Gentoo Linux)システムや他の多くの(Linuxディストリビューション)では、パッケージマネージャーがFLTK-1とFLTK-2の同時インストールを許可している場合、これは非常に厄介なことがあります。

SConstructファイルを次のように追加して使用するように変更しようfltk-config --cflagsとしましたfltk-config --ldflags(またはそれfltk-config --libsよりも優れている可能性があります)。ldflags

guienv.Append(CPPPATH = os.popen('fltk-config --cflags').read())
guienv.Append(LIBPATH = os.popen('fltk-config --ldflags').read())

しかし、これによりlibloのテストが失敗します!調べると、config.logどのように失敗したかがわかります。

scons: Configure: Checking for C library lo...
gcc -o .sconf_temp/conftest_4.o -c "-I/usr/include/fltk-1.1 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT"
gcc: no input files
scons: Configure: no

これは実際にどのように行う必要がありますか?

そして、私の答えを完成させるために、どうすれば結果から引用符を削除できos.popen( 'command').read()ますか?

編集fltk-configここでの本当の問題は、gccがコンパイルするはずのfilename引数を受け取らない原因の出力を追加するのはなぜですか?

4

2 に答える 2

1

これは非常に複雑な問題であり、迅速な回答はありません

http://www.scons.org/wiki/UsingPkgConfigpkg-configでsconsを使用するための手順を参照しました。次の質問も役立ちます 実行可能ファイルがPythonに存在するかどうかをテストしますか?

しかし、これらについてはもう少し先に進む必要があります。

したがって、多くの調査の結果os.popen('command').read()、GCCに送信された引数の切り捨ての原因となった末尾の改行'\n'がトリミングされていないことがわかりました。

str.rstrip()を使用して、末尾の'\n'を削除できます。

次に、示されているように、SCONSが提供config.logする引数は、GCCに渡す前に二重引用符で囲みます。fltk-config詳細はよくわかりませんが、これはfltk-config(via os.popen)の出力にスペース文字が含まれているためです。

のようなものを使用strarray = str.split(" ", str.count(" "))して、出力をスペース文字が出現するサブストリングに分割できます。

fltk-config --ldflagsGUI環境内の間違った変数にを追加しようとしていたことも注目に値します。それらはに追加されているはずLINKFLAGSです。

残念ながら、これは解決策の半分にすぎません。

私たちがする必要があるのは:

  • システム上の実行可能ファイルのフルパスを見つける
  • 実行可能ファイルに引数を渡し、その出力をキャプチャします
  • 出力を適切な形式に変換して、CPPFLAGSおよびに追加しますLINKFLAGS

だから私は助けるためにいくつかの関数を定義しました...

1)システム上の実行可能ファイルのフルパスを検索します:( 参照:実行可能ファイルがPythonに存在するかどうかをテストしますか?

def ExecutablePath(program):
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK)
    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file
    return None

1b)実行可能ファイルの存在もテストする必要があります。

def CheckForExecutable(context, program):
    context.Message( 'Checking for program %s...' %program )
    if ExecutablePath(program):
        context.Result('yes')
    return program
    context.Result('no')

2)引数を実行可能ファイルに渡し、出力を配列に配置します。

def ExecutableOutputAsArray(program, args):
    pth = ExecutablePath(program)
    pargs = shlex.split('%s %s' %(pth, args))
    progout = subprocess.Popen( pargs , stdout=subprocess.PIPE).communicate()[0]
    flags = progout.rstrip()
    return flags.split(' ', flags.count(" "))

いくつかの使用法:

guienv.Append(CPPFLAGS =  ExecutableOutputAsArray('fltk-config', '--cflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('fltk-config', '--ldflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('pkg-config', '--libs liblo') )
于 2010-05-31T21:16:30.333 に答える
1

これを行うには2つの同様の方法があります:1)

conf = Configure(env)
status, _ = conf.TryAction("fltk-config --cflags")
if status:
  env.ParseConfig("fltk-config --cflags")
else:
  print "Failed fltk"

2)

  try:
    env.ParseConfig("fltk-config --cflags")
  except (OSError):
    print 'failed to run fltk-config you sure fltk is installed !?'
    sys.exit(1)
于 2010-06-04T18:16:30.343 に答える