2016-10-04 14 views
1

私はAdaのプロジェクトに取り組んでいて、カスタムのmakefileを望んでいます(私はcとpythonとやりとりし、makefileの構文に精通していて、gnatmakeのプロジェクト構文に精通していません)。私はカスタムコンパイルを使いこなしていましたが、それは動作していると思っていましたが、バインディング段階で全く同じコマンドライン実行が問題に遭遇するような、少なくとも私のmakefileは見えます。Ada Makefileバインディングの問題

私はたぶんオフ・バイ・ワンのディレクトリ・エラーが発生しているか、何かを複雑にしています。

私のプロジェクトには現在、3つのソースディレクトリが含まれています(しかし、もっと来ています)。モデルには '論理'が含まれ、utilには一般的なユーティリティが含まれ、テストにはパッケージ化されていない 'メイン'手順が含まれています。最終的には、私のsrcディレクトリにいくつかの 'main'プロシージャもあります。 ASCIIの画像:問題はいつでもデバッグフラグこれは、作業ディレクトリにそれらb~*のファイルを作成することです

.PHONY: clean test 

MAKE=gnatmake 
INCLUDE_DIRS=-Imodel -Iutil -Itest 
GNATMAKEFLAGS=-g -fprofile-arcs -ftest-coverage --GNATLINK="gnatlink -v" --GNATBIND="gnatbind -v" 
GCCFLAGS=-g -fprofile-arcs -ftest-coverage 
OBJDIR=../obj 
BINDFLAGS=-a0$(OBJDIR) 

PLAYER_TEST_EXE=../bin/player_test.out 

test : $(PLAYER_TEST_EXE) 

$(PLAYER_TEST_EXE) : test/player_test.adb 
    gnatmake $< -D $(OBJDIR) $(INCLUDE_DIRS) -o [email protected] $(GNATMAKEFLAGS) 

clean : 
    @rm -rf $(OBJDIR)/* $(PLAYER_TEST_EXE) b~* 

project 
    \- bin 
     \- test 
      \- ....out 
     \- other_dirs_coming_soon 
      \- ....out 
     \- ....out 
    \- obj 
     \- all the mess that ada compilation makes 
     \- including .o, .ali, and b~whatever.ad(b/s) 
    \- src 
     \- model 
      \- ....ad(b/s) 
     \- util 
      \- ....ad(b/s) 
     \- ... 

私は私が望んでいたものに非常に近かった「基本」メイクを試してみました合格。私は多くの実行可能ファイルをたくさん持っているので、これは私の作業ディレクトリを著しく汚染します。このように

は、私はメイクのステップ・バイ・ステップを開き、剥離してしまった:それは結合に到達したときに、それを除いて、実際に近いと思わ

.PHONY: clean test 

GCC=gcc 
BINDER=gnatbind 

ADALIBLOC=`gnatls -v | grep adalib` 

FLAGS= 
LINKFLAGS=-gnatA -gnatWb -gnatiw -gnatws 

test: FLAGS+=-g -fprofile-arcs -ftest-coverage 
test: LINKFLAGS+=-g 

# Where to put the object files and ali extensions 
OBJDIR=../obj 

# Source directories 
MODEL_DIR=model 
UTIL_DIR=util 
TEST_DIR=test 

SRC_DIRS=$(MODEL_DIR) $(UTIL_DIR) $(TEST_DIR) 
INC_DIRS=${SRC_DIRS:%=-I%} 
LIB_DIRS=${SRC_DIRS:%=-L%} 
BIND_DIRS=${SRC_DIRS:%=-aO./%} 

# Model sources 
MODEL_SPECS=$(wildcard $(MODEL_DIR)/*.ads) 
MODEL_BODIES=$(wildcard $(MODEL_DIR)/*.adb) 
MODEL_OBJECTS=$(patsubst %.ads,$(OBJDIR)/%.o,$(MODEL_SPECS)) 
MODEL_ALI=$(patsubst %.ads,$(OBJDIR)/%.ali,$(MODEL_SPECS)) 

# Util sources 
UTIL_SPECS=$(wildcard $(UTIL_DIR)/*.ads) 
UTIL_BODIES=$(wildcard $(UTIL_DIR)/*.adb) 
UTIL_OBJECTS=$(patsubst %.ads,$(OBJDIR)/%.o,$(UTIL_SPECS)) 
UTIL_ALI=$(patsubst %.ads,$(OBJDIR)/%.ali,$(UTIL_SPECS)) 

# All sources 
ALL_SPECS=$(MODEL_SPECS) $(UTIL_SPECS) 
ALL_BODIES=$(MODEL_BODIES) $(UTIL_BODIES) 
ALL_OBJECTS=$(MODEL_OBJECTS) $(UTIL_OBJECTS) 
ALL_ALIS=$(MODEL_ALI) $(UTIL_ALI) 

# Executables 
EXE_DIR=../bin 
PLAYER_TEST_EXE=$(EXE_DIR)/test/player_test.out 

# Targets 
test : $(PLAYER_TEST_EXE) 

# Executable creation 
$(EXE_DIR)/%.out : $(EXE_DIR)/%.o $(ALL_OBJECTS) 
    cd $(EXE_DIR) 
    $(GCC) $*.o $(ALL_OBJECTS) $(FLAGS) -o [email protected] $(LIB_DIRS) -L$(ADALIBLOC)/libgnat.a --static-libgcc 

# Executable object creation 
$(EXE_DIR)/%.o : $(EXE_DIR)/%.adb 
    cd $(OBJBINDIR) 
    $(GCC) -c $(FLAGS) $(LINKFLAGS) $< -o [email protected] 

# Executable source creation 
$(EXE_DIR)/%.adb : $(OBJDIR)/%.ali $(ALL_OBJECTS) 
    cd $(EXE_DIR) 
    $(BINDER) $(BIND_DIRS) $(INC_DIRS) -v -x ../$< -o ../$*.adb 

# Object creation 
$(OBJDIR)/%.o : %.adb %.ads 
$(OBJDIR)/%.o : 
    if [ -a $*.adb ]; then \ 
     gcc -c $*.adb $(INC_DIRS) -o [email protected] $(FLAGS); \ 
    else \ 
     gcc -c $*.ads $(INC_DIRS) -o [email protected] $(FLAGS); \ 
    fi; 

# ALI creation 
$(OBJDIR)/%.ali : %.adb %.ads 
$(OBJDIR)/%.ali : 
    if [ -a $*.adb ]; then \ 
     gcc -c $*.adb $(INC_DIRS) -o $(OBJDIR)/$*.o $(FLAGS); \ 
    else \ 
     gcc -c $*.ads $(INC_DIRS) -o $(OBJDIR)/$*.o $(FLAGS); \ 
    fi; 

clean: 
    @rm -f $(ALL_OBJECTS) $(ALL_ALI) 

がplayer_test.aliを見つけることができませんステージ。

アドバイスはありますか?

+0

このようにすると、依存関係を正しく取得できません。 gnatmakeはMakefileフォームの依存関係を出力するために-Mをサポートするために使用されましたが、それ以上はありません。 –

答えて

5

私は、プロジェクトファイルなしで問題を完全に解決するというあなたの決定を再考することをお勧めします。私は通常GNATでAdaプロジェクトを構築するためにプロジェクトファイルとmakefileの組み合わせを使用します。

プロジェクトファイルは1つのオブジェクトディレクトリを指しているだけなので、オブジェクトディレクトリごとにGNATプロジェクトファイルが必要です。

ほとんどのプロジェクトで共通のコンパイラフラグがある場合は、他のプロジェクトファイルから派生した共通のプロジェクトファイルにそれらのコンパイラフラグを含めることが理にかなっています。

+0

これは、makeができることの範囲外の問題かもしれないと思いました。 GNATプロジェクトファイルの使い方を研究する時間! 現実の線量をありがとうございます。 – LambdaBeta

1

注:GNATプロジェクトを使用するのが理想的です。それでも、

私はシステムとしてGNATプロジェクトが非常に厄介であることを発見しました。特に、gprbuildはまだ私のシステムの標準パッケージではないので、gnatmakeは-Pフラグを駄目にしています。このように、私は中間の解決策を作りました。

私はディレクトリbuildと私のsrcディレクトリの両方を作成しました。 Inside build私はすべてのソースディレクトリをシンボリックリンクしました。私は、ビルド中にこのMakefileを追加しました:

.PHONY: clean test 
.SILENT: 

FLAGS=-d 
GNATLINKFLAGS= 
GNATBINDFLAGS= 

test: FLAGS+=-g -fprofile-arcs -ftest-coverage 

MAKE=gnatmake 
INCLUDE_DIRS=-Imodel -Iutil -Itest 
GNATLINK=--GNATLINK="gnatlink $(GNATLINKFLAGS)" 
GNATBIND=--GNATBIND="gnatbind $(GNATBINDFLAGS)" 
GNATMAKEFLAGS=$(FLAGS) $(GNATLINK) $(GNATBIND) 

OBJDIR=../obj 
SRCDIR=../src 

# Executable definitions 
PLAYER_TEST_SRC=test/player_test.adb 
PLAYER_TEST_EXE=../bin/player_test.out 

test : $(PLAYER_TEST_EXE) 

$(PLAYER_TEST_EXE) : force_make 
    gnatmake $(PLAYER_TEST_SRC) -D $(OBJDIR) $(INCLUDE_DIRS) -o [email protected] $(GNATMAKEFLAGS) 

force_make: 
    true 

clean : 
    @rm -rf $(OBJDIR)/* 

をそれから私は、SRC内のこの非常に最小限のMakefile作成:今、私は私のソースディレクトリ内からmake testを実行することができますし、それのように私のテスト実行ファイルを作成します

.SILENT: 
BUILD_DIR=../build 

% : force_make 
    cd $(BUILD_DIR); make [email protected] 

force_make: 
    true 

を期待される。

このシステムの利点は、純粋なGNU makeソリューションから純粋なGNATプロジェクトソリューションへの段階的な移行を可能にするために、私がプロジェクトファイルについて学ぶときに簡単にビルドディレクトリに追加できることです。