makefile変数から最上位ディレクトリを取得します


8

makefile変数の最上位ディレクトリ部分を取得する最も簡単なコードは何ですか?例:

BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>

PS:私は意味するものではありません$(dir $(dir $(BUILD_DIR)))が、最初のディレクトリ部分を取得何か任意の変数の値を。


dirname /tmp/foo/bar与える/tmpdirname foo/bar/baz与えるfoo
アビシェークA

1
@ greenmang0:回答にフラグを付けました。まず、それは明らかに間違っています(これらのコマンドを実行しましたか?)。次に、それはBashではなくmakefileに対するものです。
l0b0

@ l0b0これはコメントであり、「間違っている」というのはフラグを立てる理由にはなりません。問題の内容をコメントに残してください
Michael Mrozek

@MichaelMrozek:「建設的ではない/トピックから外れている」というフラグを立てましたが、どちらにも当てはまります。
l0b0

あなたの質問が理解できません。「トップレベルのディレクトリ部分」とはどういう意味ですか?最初の前の部分/ですか?引数が相対パスであることを保証しますか?GNU makeを想定していますか?
Gilles「SO-悪をやめなさい」

回答:


5

ディレクトリの最初のコンポーネントを意味しますか?その場合は、パスをコンポーネントのリストに変換してから、最初のコンポーネントを抽出します。私はあなたがGNU makeを使用していて、空白を含むファイル名が無傷で通過することを期待するような狂気のことをやっていないと思います。絶対パスでこれを試さないでください。

override BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf $(firstword $(subst /, ,$(BUILD_DIR)))

私が作るBUILD_DIR、ユーザが誰か誤ってそれを渡すと何かが削除意図しない持つを回避するために、コマンドラインに渡されている可能性があるものは何でもオーバーライドを。


BUILD_DIR内部変数であるはずでしたが、あなたが正しい、誰かがそれを危険な何かに設定する可能性はまだあります。したがって、この解決策は使用してはならないという警告とともに、この回答を受け入れます :)
l0b0

1
@ l0b0 GNU makeを想定しているため:override BUILD_DIR = …
Gilles「SO-邪悪なことをやめ

0

BUILD_DIRが '/'で始まらないことを確信している場合:

rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )

それ以外の場合は、「/」で始まるパスを考慮する必要があります。

if [[ $BUILD_DIR =~ "^/" ]]; then
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1,2 )
else
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )
fi

echo $rootdir

または、「/」で始まるパスはすべて無視するのが最善です。


1
これはメイクファイル用であり、Bash ではありません。これはBashのささいな問題ですが、私は単純なmakefileソリューションに興味があります。
l0b0

Makefileで実行できることの1つは、コマンドの実行です。したがって、rootdirというパスにシェルスクリプトを作成し、makefileで「rm -rf $(rootdir $ BUILD_DIR)」などを実行します。または、ビルドルートを事前に定義するなどして、rm -rf後で実行できるようにする必要があります。rootdirスクリプトが返す応答を間違いなく再確認するので、スクリプトで構文エラーが発生することはありませんrm -rf /
ティムケネディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.