1

次のような Makefile があります。

baud=19200
src=dimmer
avrType=attiny13
programmerDev=/dev/ttyUSB003
programmerType=stk500v1

object:
        avr-gcc -g -DF_CPU=$(avrFreq) -Wall -Os -mmcu=$(avrType) -c -o $(src).o $(src).cpp

read:
        @for memory in calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig; do \
                avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
        done

これは意図したとおりに機能します。入力するとmake read、マイクロコントローラーからいくつかのファイルが抽出されます。通信速度が遅いのとデータサイズが大きいので少し時間がかかるので、 だけ入力できればいいなと思っていたのですがmake read flash、やり方がわかりません。

もちろん・・・のようなエントリーもできますがread_flashread_hfuseもっとスマートにできる気がします。

make read allまた、コントローラーからすべてのファイルを順番に実行するようなコマンドを実行できるようにしたいと考えています。

今、私はMakfileの作成に慣れていないので、間違った方向に進んでいる可能性があります. どのようにすればよいか、お気軽にご説明ください。

私はLinuxを使用しています。

4

3 に答える 3

2

高度に GNU 固有の makefile が受け入れられる場合 (移植可能な makefile を作成するよりも、GNU などの移植可能な を使用する方がはるかに優れていると私は主張しmakeます)、これをかなり簡単に実装できます。

ALL = calibration eeprom efuse flash fuse hfuse lfuse lock signature \
      application apptable boot prodsig usersig

ifeq (read,$(firstword $(MAKECMDGOALS)))
  WANT := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
  ifneq ($(WANT),)
    $(eval $(WANT):;@:)
  endif
  UNKNOWN := $(filter-out $(ALL),$(WANT))
  ifneq ($(UNKNOWN),)
    $(error Invalid arguments: $(UNKNOWN))
  endif
endif

read-one = avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) \
        -b$(baud) -v -U $1:r:./$(avrType).$1.hex:i

.PHONY: read
read:
    $(foreach w,$(or $(WANT),$(ALL)),$(call read-one,$w) &&) :

コマンド ラインの最初の引数が "read" の場合、最初WANTの引数の後の引数のリストに変数が設定されます。次に、それらの名前を no-op ターゲットに変換し、名前ごとに、または名前が指定されていない場合に、readターゲットに関数を呼び出させます。read-one$(ALL)

ターゲットに関する情報をmake print VARIABLE...印刷$(VARIABLE)または表示するだけの のようなもののために、私はこれのバリエーションをかなり頻繁に使用します。make help TOPIC

于 2012-12-14T22:12:37.507 に答える
1

make flashまたは、次のMakefileを使用しmake hfuseます。make all

baud=19200
avrType=attiny13
programmerDev=/dev/ttyUSB003
programmerType=stk500v1

all: calibration eeprom efuse flash fuse hfuse lfuse lock signature \
    application apptable boot prodsig usersig

%:
        avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) \
        -v -U $@:r:./$(avrType).$$memory.hex:i || rm ./$(avrType).$@.hex;

これはおそらくポータブルMakeではありませんが、gnumakeでは機能します。これは他のルールを許可しませんが、このファイルreadに名前を付けて実行することができますmake -f read flash。これにより、他のルールを他のmakeファイルに配置できるようになります。

でavrdudeを実行するため、これは特に安全ではないことに注意してくださいmake foo。ターゲットをより厳密に制御するには、次のようにします。

.SUFFIXES: .ph
.PHONY: efuse.ph eeprom.ph ...
all: efuse eeprom ...
.ph:
        avrdude ...

このように、PHONYとしてリストされているターゲットのみが有効なターゲットになります。

于 2012-12-14T18:37:22.357 に答える
1

モジュールのリストをデフォルトで構成可能なリストにするのはどうですか:

LIST = calibration eeprom efuse flash fuse \
       hfuse lfuse lock signature application \
       apptable boot prodsig usersig

read:
        @for memory in $(LIST); do \
             avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) \
               -b$(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
        done

make次に、デフォルトの場合と同様に、またはmake LIST="eeprom efuse"2 つのモジュールのみに対してmake を呼び出します。

于 2012-12-14T18:55:12.157 に答える