Nhận thư mục cấp cao nhất từ ​​biến makefile


8

Mã đơn giản nhất để có được phần thư mục cấp cao nhất của biến makefile là gì? Thí dụ:

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

PS: Ý tôi không phải $(dir $(dir $(BUILD_DIR))), nhưng cái gì đó có được phần thư mục đầu tiên của bất kỳ giá trị biến nào .


dirname /tmp/foo/barsẽ cho /tmphoặc dirname foo/bar/bazsẽ chofoo
Abhishek A

1
@ greenmang0: Đánh dấu câu trả lời của bạn. Thứ nhất, đó là sai đơn giản (thậm chí bạn thực hiện những lệnh?), Và thứ hai đó là cho một makefile , không Bash.
l0b0

@ l0b0 Đó là một nhận xét và "nó sai" không phải là lý do chính đáng để gắn cờ bất cứ điều gì, chỉ cần để lại nhận xét cho biết vấn đề là gì
Michael Mrozek

@MichaelMrozek: Tôi đã gắn cờ "không mang tính xây dựng / tắt chủ đề", cả hai đều áp dụng cho nó.
l0b0

Tôi không hiểu câu hỏi của bạn: ý của bạn là gì về phần thư mục cấp cao nhất của thế giới? Bạn có nghĩa là phần trước đầu tiên /? Bạn có đảm bảo rằng đối số là một đường dẫn tương đối? Bạn có giả sử GNU làm?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


5

Bạn có nghĩa là thành phần đầu tiên của thư mục? Nếu vậy, biến đường dẫn thành một danh sách các thành phần, sau đó trích xuất thành phần đầu tiên. Tôi giả sử bạn đang sử dụng GNU make và bạn sẽ không làm điều gì đó điên rồ như mong đợi các tên tệp có khoảng trắng sẽ không bị ảnh hưởng. Đừng thử điều này với một con đường tuyệt đối.

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

Tôi BUILD_DIRghi đè bất cứ điều gì người dùng có thể đã truyền vào dòng lệnh, để tránh ai đó vô tình vượt qua nó và có một cái gì đó ngoài ý muốn bị xóa.


BUILD_DIRđược cho là một biến nội bộ, nhưng bạn nói đúng, vẫn có khả năng ai đó đặt nó thành một thứ nguy hiểm. Vì vậy, chấp nhận câu trả lời này, với lời cảnh báo rằng giải pháp không nên được sử dụng :)
l0b0

1
@ l0b0 Vì chúng tôi giả sử GNU tạo ra:override BUILD_DIR = …
Gilles 'SO- ngừng trở nên xấu xa'

0

Nếu bạn khẳng định rằng BUILD_DIR sẽ không bao giờ bắt đầu bằng '/':

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

Nếu không, bạn có thể cần tính đến các đường dẫn bắt đầu bằng '/':

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

echo $rootdir

Hoặc có lẽ tốt nhất là bỏ qua mọi đường dẫn bắt đầu bằng '/'.


1
Đây là cho một makefile, không phải Bash. Đây là một vấn đề nhỏ ở Bash, nhưng tôi quan tâm đến một giải pháp makefile đơn giản .
l0b0

Một điều bạn có thể làm trong Makefile là chạy các lệnh. Vì vậy, bạn tạo một tập lệnh shell, trong đường dẫn của bạn, được gọi là rootdir và trong tệp tạo tệp của bạn, chạy "rm -rf $ (rootdir $ BUILD_DIR)" hoặc đại loại như thế. Hoặc bạn sẽ phải làm một cái gì đó như xác định trước gốc xây dựng, để bạn có thể làm rm -rfđiều đó sau. Tôi chắc chắn sẽ kiểm tra lại phản hồi mà rootdirtập lệnh có thể trả lại, vì vậy bạn không gặp phải lỗi cú pháp khi đưa tập lệnh của mình rm -rf /.
Tim Kennedy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.