2017-01-15 5 views
0

アセンブリファイルを生成するメイクファイル (gccを-Sフラグで呼び出す)を作成しようとしていて、生成されたs-ファイル を変更してコンパイルします。アプローチを見つけるために私は短いサンプル makefileを作って、.s-sourcefilesの名前を正確に(main.s、mod1.sなど)リストするとうまく動作します。gcc/make - アセンブリ(.s)ファイルを生成してコンパイルするための依存関係の定義方法?

objects = main.o mod1.o 
    assembly = main.s mod1.s 

    app : $(objects) 
     gcc -o app $(objects) 
     chmod +x app 
    %.s : %.c 
     gcc -S $< 
    # here some code will be called to modify 
    # the .s file for some experimental purpose ..  
    main.o : main.s 
     gcc -c main.s 
    mod1.o : mod1.s 
     gcc -c mod1.s 
    cleanobj : 
     rm app $(objects) 
    cleanass : 
     rm $(assembly) 
    cleanall : cleanobj cleanass 

これは意図したとおりに動作します。 しかし、私はdependecy もう少し一般的な(「%はの.o:%の.S」)が定義するときときアセンブル(.S)ファイルが生成されていない 、それ以上:

objects = main.o mod1.o 
    assembly = main.s mod1.s 

    app : $(objects) 
     gcc -o app $(objects) 
     chmod +x app 
    %.s : %.c 
     gcc -S $< 
    # here some code will be called to modify 
    # the .s file for some experimental purpose .. 
    %.o : %.s 
     gcc -c $< 
    cleanobj : 
     rm app $(objects) 
    cleanass : 
     rm $(assembly) 
    cleanall : cleanobj cleanass 

どれ説明すなわちアイデアどのようにこれらのステップを実装するには?

答えて

2

あなたは貴重なとしてアセンブラファイルをマークする必要があります。

.SECONDARY: 

またthis questionを参照してください。

.PRECIOUS: %.s 

か、単に強制的すべての中間出力を維持するために、次の追加マーク。

+0

あなたの答えをありがとうが、これはうまくいきませんでした。これは、中間で削除されたファイルではなく、最初に生成されたファイルではありません。 ここに、最初のファイルの出力があります: gcc -S main.c gcc -c main.s gcc -S mod1.c gcc -c mod1.s gcc -o app main.o mod1.o と第2メークファイル: cc -c -o main.o main.c cc -c -o mod1.o mod1.c gcc -o app main.o mod1.o .s-filesはまったく私には生成されません。 – OliverJL

+0

ええ、私は再校正することができました。 「前提条件が実際に存在するか言及されているルールは、他の暗黙ルールを連鎖することによって行わなければならない前提条件を持つルールよりも優先されます」([ここ](https://ftp.gnu.org)から) /old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html))。したがって、あなたのルールは暗黙のルールによって上書きされます。暗黙のルールはmakeの '-r'フラグで無効にすることができます。 – yugr

0

ありがとうたくさんのyugr、-rフラグが関連するヒントでした! 同じ挙動をstruggeling誰に:(上記に比べ、.PRECIOUS:%の.Sが追加された) 次のメイクファイルは、所望の出力(.Sと.oファイル)を生成する:

objects = main.o mod1.o 
    assembly = main.s mod1.s 

    .PRECIOUS: %.s 
    app : $(objects) 
     gcc -o app $(objects) 
     chmod +x app 
    %.s : %.c 
     gcc -S $< 
    # here some code will be called to modify 
    # the .s file for some experimental purpose .. 
    %.o : %.s 
     gcc -c $< 
    cleanobj : 
     rm app $(objects) 
    cleanass : 
     rm $(assembly) 
    cleanall : cleanobj cleanass 

を生成します、

make 
    cc -c -o main.o main.c 
    cc -c -o mod1.o mod1.c 
    gcc -o app main.o mod1.o 
    chmod +x app 

と呼ばれるが、

make -r 
    gcc -S main.c 
    gcc -c main.s 
    gcc -S mod1.c 
    gcc -c mod1.s 
    gcc -o app main.o mod1.o 
    chmod +x app 

すなわちで呼び出されたとき。要求された.sファイルが作成され、実行可能な 'app'にもつながりました。

対象のフォルダに.oまたは.sファイルが存在しないことに注意してください。

関連する問題