2011-10-21 6 views
2

私のC++プロジェクトにGNU AutoToolsを使用しようとしています。私はconfigure.ac、makefile.amなどを書いています。実行中にプログラムによって使用されるいくつかのファイルがあります。今GNU AutoToolsでのデータディレクトリへのパスの設定と使用

abcdir = $(bindir)/../data/abc/ 
abc_DATA = ../data/knowledge/abc.cc 

次のようにコピーし、正しくファイルと私のプログラムのインストール構造が代に見える::などのテンプレートファイル、XMLスキーマは、だから、私は、実行可能に沿ってこれらのファイルをコピー/インストールするために、私は次のようなものを使用

<installation_dir>/bin/<executableFile> 
<installation_dir>/data/abc/abc.cc 

ここで問題は、ソースコードでは実際にこれらのファイル(abc.ccなど)を使用しているため、これらのファイルが存在する場所のパスが必要です。 1つの解決策は、(AC_DEFINEを使用して)いくつかの変数を定義することです。 _ABC_PATH_はインストールのパスを指していますが、これを正確に行う方法は?またはそれを行うための良い方法がありますか?

... 
ifstream input(<path-to-abc-folder> + "abc.cc"); // how to find <path-to-abc-folder>? 
.. 

答えて

4

AC_DEFINE液原則的に細かいですが、場所を取るために、シェルのような変数の展開が必要です。たとえば、ソースコードで、私のような何かを行います。つまり、_ABC_PATH_は/ data/abcではなく、 "$ {bindir} /../ data/abs"に展開されます。原則的には正常に動作しますが、あなたは確認する必要があり

myprogram_CPPFLAGS += -D_ABC_PATH='\"${abcdir}\"' 

がMYPROGRAMの依存関係にconfig.statusを含める:

一つの方法は、メイクによって拡張され-Dフラグを介してパスを定義することです。

あなたは、このような置換変数の数を持っている場合は、あなたのようなルールではautomakeによって生成 あるpaths.hファイルにロールアウトする必要がありますサイドノートとして

paths.h : $(srcdir)/paths.h.in config.status 
    sed -e 's:@[email protected]:${abcdir}:' $< > [email protected] 

を、あなたは知っています$ {prefix}と$ {datarootdir}とお友達についてはどうでしょうか?そうでない場合は、それをよく読んでください。ユーザーが$ {exec_prefix}を設定した場合、$ {bindir}/..は$ {prefix}と必ずしも同じではありません。

+0

AC_DEFINE([ABC_PATH]、["$ {prefix}/data/abc"])を使用しているので、AC_DEFINEでそれを行うことはできますか?ABC_PATH = "$ {prefix}/data/abc "、私は" $ {prefix} "をどうすればいいのですか? – usman

+2

AC_DEFINE_UNQUOTEDはAC_DEFINEと同じように動作しますが、引数をちょうど一度に拡張します**。したがって、通常は$ {prefix}展開で動作しますが、一般的には、シェルの拡張を処理できないソースにパスを挿入するのには適していません。 – thiton

+0

これはサイドノート以上のものでなければなりません:OPは間違いなくdatadir –

関連する問題