GNUmakeによって解釈されるbasename関数はbashのbasenameと同じではないようです。前者はサフィックスを削除し、後者はパスも削除します。makefile内のフォルダのベース名を取得するにはどうすればよいですか?
また、なぜ彼らはそれを変えたのですか?(エラーの原因を見つけるのに20分かかりました)
このbasename(1)
コマンドには 2 つの直交する機能 (suffice の削除、先頭のディレクトリ部分の削除) があり、GNU make の作成者は各機能を個別に呼び出せるようにしたいと考えていました。もちろん、basenameという名前を取得できる概念は 1 つだけです。
確かに、makefile では、 foo/bar/baz.cをfoo/bar/bazに変換できると便利です。これにより、最後に新しいサフィックスを付けて、ソース ファイルと同じディレクトリに関連するファイル名を作成できます。
@ire_and_curses のコメントは$(notdir $(CURDIR))
、(ディレクトリであるため) CURDIR が次のように指定されている可能性があるため、目的には十分ではないことに注意してください。
CURDIR = /foo/bar/
末尾のnotdir
スラッシュにより、すべてが削除されます。この方法でディレクトリ パスを記述できるようにするには、末尾のスラッシュを明示的に削除する必要があります$(notdir $(CURDIR:%/=%))
。
ええ、それは奇妙です。notdir と basenameをチェーンすることで、必要な動作を得ることができます。
$(notdir names...)
Extracts all but the directory-part of each file name in names... For example,
$(notdir src/foo.c hacks)
produces the result ‘foo.c hacks’.
...
$(basename names...)
Extracts all but the suffix of each file name in names. If the file name
contains a period, the basename is everything starting up to (and not
including) the last period... For example,
$(basename src/foo.c src-1.0/bar hacks)
produces the result ‘src/foo src-1.0/bar hacks’.
したがって、たとえば、次のように関数をチェーン/home/ari/src/helloworld.c
することで変換できます。helloworld.html
SRC=/home/ari/src/helloworld.c
TARGET=$(addsuffix .html, $(notdir $(basename $(SRC))))
ただし、bash のバージョンは引き続き使用できます。
SHELL := /bin/bash
basename := $(shell basename /why/in/gods/name)
どう$(dir /path/to/file.txt)
ですか?
https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html