マニュアルには私が間違っていることを実際に書かれているのではないかと思いますが、解決策は実際にはわかりません。この問題は、ビルドする.cファイルと.oファイルが同じディレクトリになく、.cファイルがその場で生成する必要のある.hファイルに自動的に依存している場合に発生します。この問題は、.cファイルと.hファイルの間に依存関係を手動で設定することで解決できる可能性がありますが、それは避けたいと思います。
私は次のディレクトリ構造を持っています:
weird/
Jamfile
b.c
src/
a.c
c.c
src/acファイルは次のようになります。
#include "src/a.h"
int main(int argc, char *argv[])
{
return 0;
}
bcファイルは次のようになります。
#include "src/b.h"
int main(int argc, char *argv[])
{
return 0;
}
src/ccファイルは次のようになります。
#include "c.h"
int main(int argc, char *argv[])
{
return 0;
}
Jamfileは次のとおりです。
rule CreateHeader
{
Clean clean : $(1) ;
}
actions CreateHeader
{
echo "int x = 10;" > $(1)
}
Object a.o : src/a.c ;
Object b.o : b.c ;
Object c.o : src/c.c ;
CreateHeader src/a.h ;
CreateHeader src/b.h ;
CreateHeader src/c.h ;
次のコマンドは、boとsrc/bhを正しく作成します。
jam b.o
次のコマンドはsrc/ahを作成しますが、GCCはaoの作成に失敗します。その理由は、acの#includeがsrc / ahに言及しているのに対し、実際には単にahを参照していることは明らかです。
jam a.o
次のコマンドは完全に失敗し、chも作成しません。その理由はおそらく、Jamがccを分析すると、src / chではなくchへの依存関係が生成され、Jamfileにはchを生成するためのルールがないためです。
jam c.o
coを要求する前にsrc/chを生成するように明示的に要求すると、このコマンドは正しくコンパイルされます。
jam src/c.h
jam c.o
私の意見では、jam src/chは必要ないはずです。ここで何が問題になっていますか?詳細については、特にヘッダーファイルスキャンのセクションで、Jamのマニュアルを確認してください。
答えを受け入れた後に追加
受け入れられた回答の作成者によって提案された構成を少し実験し続けました。結果をここに投稿します。この設定では、次のように入力できます。
jam app
そして、アプリケーションはbin/appの下にリンクされます。残念ながら、LOCATE_TARGETを設定するときにUNIXパスを使用する必要がありましたが、これは必ずしも良い方法ではないことを理解しています。
ディレクトリ構造:
project/
Jamfile
src/
main.c
gen/
bin/
obj/
ファイルJamfile:
SubDir TOP ;
rule CreateHeader
{
MakeLocate $(1) : $(LOCATE_SOURCE) ;
Clean clean : $(1) ;
}
actions CreateHeader
{
BUILD_DATE=`date`
echo "char build_date[] = \"$BUILD_DATE\";" > $(1)
}
SEARCH_SOURCE = src ;
LOCATE_TARGET = bin/obj ;
SubDirHdrs gen ;
Object main.o : main.c ;
LOCATE_TARGET = bin ;
MainFromObjects app : main.o ;
LOCATE_SOURCE = gen ;
CreateHeader info.h ;
ファイルsrc/main.c
src/main.c
#include <stdio.h>
#include "info.h"
int main(int argc, char *argv[])
{
printf("Program built with Jam on %s.\n", build_date);
return 0;
}