3

プロジェクトのMakefileについてサポートが必要です。ソースディレクトリは次のようになります。

|-- Makefile
|-- drivers
|   |-- Makefile
|   |-- tty
|       |-- Makefile
|       |-- console.c
|       |-- keyboard.c
|-- kernel
|   |-- Makefile
|   |-- kmain.c

一番上のMakefileで、オブジェクトファイルを取り込む変数OBJECTSをエクスポートして、一番上のMakefileでそれらをビルドしてリンクできるようにしました。

たとえば、drivers / tty / MakefileのOBJECTSを、次のようにして更新したいと思います。

OBJECTS += $(CURDIR)console.o
OBJECTS += $(CURDIR)keyboard.o

ただし、OBJECTSへの変更は、最上位のMakefileにバブルアップしません。LinuxソースツリーのMakefileを見てきましたが、似たようなことをしているようです。しかし、私はそれを動作させることができません。ここで何かが足りませんか?

4

2 に答える 2

1

makeを再帰的に実行すると、後続の呼び出しごとに新しいサブシェルが開き、エクスポートでチェーンに戻ることができなくなります。1つの方法は、サブメイクを呼び出すたびにオブジェクトリストファイルに追加し、場合によってはそのファイルを含めることです。includeより良い解決策は、おそらく、makeを呼び出すのではなく、メインのmakefileにこれらのサブmakeファイルのそれぞれを直接持たせるという方針に沿って何かを行うことです。このメソッドを使用すると、ステートメントで各submakeファイルを使用してOBJECTS変数を作成できますOBJECTS +=。もう1つの追加の利点は、複数のサブメイクではなく、makeのインスタンスを1つだけ実行することです。これにより、makeで依存関係の生成を改善できます。「再帰的に有害と見なされる」をご覧くださいhttp://aegis.sourceforge.net/auug97.pdf

以前にユーザーDanMoldingによってここに投稿された1つのクールなmakefileビルドシステムhttps://stackoverflow.com/users/95706/dan-mouldingは、1つだけでサブメイクファイルを使用して実行できる多くのクールな機能を実際に披露しましたマスターmakefile。ダンのboilermakeプロジェクトはここにあります:https ://github.com/dmoulding/boilermake

于 2012-10-05T13:41:00.920 に答える
1

Makeを再帰的に使用しているようです。

# Makefile:

export OBJECTS :=
all:
    $(MAKE) -C drivers/tty
    @echo OBJECTS is $(OBJECTS)

# drivers/tty/Makefile:

OBJECTS += $(CURDIR)console.o
all:
    whatever

各Makeには独自のOBJECTS;があるため、これは機能しません。子Makeは、親Makeの変数を変更できません。それexportは、ではなくimport/export、またはです(またはshareのようなものはありません、私はただ説明しようとしています)。import/exportshare

他のmakefileを呼び出す代わりに含めることで、必要な効果を得ることができます。

# Makefile:

OBJECTS :=
all: DRIVERS_TTY
    @echo OBJECTS is $(OBJECTS)

include drivers/tty/Makefile

# drivers/tty/Makefile:

OBJECTS += drivers/tty/console.o

DRIVERS_TTY:
    whatever

そこには不快な場所依存性があることに気付くでしょう。drivers/tty/Makefile内部に「drivers/tty」と綴られているため、メンテナンスが面倒です。includeこの基本的なトリックを機能させたら、それを修正する方法があります。

于 2012-10-05T13:45:14.373 に答える