1

私はmakefilesを初めて使用しますが、この問題に悩まされています。見つかったディレクトリ内のすべてのファイルへのシンボリックリンクを作成する方法。これはすべてルール内にあります。

「find」を呼び出すと結果が取得されるかどうかを知りたいです。結果を「eval」(ルール内に変数を設定するために私が知っている唯一の方法)の変数に割り当てると、「ifdef」評価は機能しません。

「」と「ifneq」を比較してみましたが、うまくいきません。

おそらく私は間違った方向に進んでいるので、誰かが別のアプローチをとっていれば、私は非常に感謝します。

ここにMakefile全体があります:(######でマークされた興味深い行)

大いに感謝する!

DEFAULT_YCS_ROOT := /opt/yujin

all:
ifdef YCS_ROOT
    @echo Looking for Yujin maps in ${YCS_ROOT}
else
    $(eval YCS_ROOT := ${DEFAULT_YCS_ROOT})
    @echo WARNING: YCS_ROOT is undefined. Looking for Yujin maps in default path ${YCS_ROOT}
endif

    $(eval MAPS_DIR := $(shell find ${YCS_ROOT} -name yujin_maps))
    @echo ${MAPS_DIR}  "${MAPS_DIR}"
ifdef MAPS_DIR  ######
###### misguided alternative....  ifneq (${MAPS_DIR}, " ")
    $(eval DEST_DIR := $(shell pwd)/resources/yaml/stage/maps)
    @echo Creating symbolic links on ${DEST_DIR} for every PGM map on ${MAPS_DIR}/maps
    rm ${DEST_DIR}/*.pgm
    for f in ${MAPS_DIR}/maps/*.pgm; do ln -s $$f ${DEST_DIR}/; done
else
    @echo ERROR: Yujin maps package not found in ${YCS_ROOT}. Define YCS_ROOT variable properly
endif
4

1 に答える 1

3

まず、GNUMakeを使用していると仮定すると、より簡単な処理方法がYCS_ROOTありDEFAULT_YCS_ROOTます。

DEFAULT_YCS_ROOT := /opt/yujin
YCS_ROOT ?= DEFAULT_YCS_ROOT

これにより、が未定義の場合にのみ、の値がDEFAULT_YCS_ROOTに割り当てられます。YCS_ROOTYCS_ROOT

変数MAPS_DIRとについてはDEST_DIR、Make構文とシェル構文を混在させています。最も簡単なアプローチは、ルールの外で両方の変数を定義することだと思います。

MAPS_DIR := $(shell find ${YCS_ROOT} -name yujin_maps)
DEST_DIR := $(shell pwd)/resources/yaml/stage/maps

これらすべてをテストして、変数が期待する値を持っていることを確認する必要があります。;に1つのディレクトリしか期待していないようです。MAPS_DIR私はその慣習に従いますが、それは安全ではありません。これまでのmakefileが機能したら、ルールを追加できます。シェルループを使用できます。

all:
    rm ${DEST_DIR}/*.pgm
    for f in ${MAPS_DIR}/maps/*.pgm; do echo ln -s $$f ${DEST_DIR}/; done

または、Make構文を使用します(これにはいくつかの利点があります)。

MAPS := $(wildcard $(MAPS_DIR)/maps/*.pgm)
DEST_MAPS := $(patsubst $(MAPS_DIR)/maps/%.pgm, ${DEST_DIR}/%.pgm, $(MAPS))

all: $(DEST_MAPS)

${DEST_DIR}/%.pgm: $(MAPS_DIR)/maps/%.pgm
    rm $@
    ln -s $< ${DEST_DIR}/
于 2012-09-17T19:21:27.510 に答える