Получить каталог верхнего уровня из переменной 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))), но то, что получает первую часть каталога любого значения переменной.

l0b0
источник
dirname /tmp/foo/barдаст /tmpили dirname foo/bar/bazдастfoo
Абхишек А
1
@ greenmang0: пометил ваш ответ. Во-первых, это совершенно неправильно (вы даже выполняли эти команды?), А во-вторых, это для make-файла , а не для Bash.
10
@ l0b0 Это комментарий, и «это неправильно» не является хорошей причиной помечать что-либо, просто оставьте комментарий о том, в чем проблема
Майкл Мрозек
@MichaelMrozek: Я пометил его как «неконструктивный / не по теме», оба из которых относятся к нему.
10
Я не понимаю вашего вопроса: что вы подразумеваете под «частью каталога верхнего уровня»? Вы имеете в виду часть до первого /? Вы гарантируете, что аргумент является относительным путем? Вы предполагаете, что GNU make?
Жиль "ТАК - перестать быть злым"

Ответы:

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 = …
Жиль "ТАК - перестань быть злым"
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
Это для make-файла, а не для Bash. Это тривиальная проблема в Bash, но меня интересует простое решение makefile .
10
В Makefile вы можете выполнять команды. Таким образом, вы создаете сценарий оболочки на вашем пути с именем rootdir, а в вашем make-файле запускаете «rm -rf $ (rootdir $ BUILD_DIR)» или что-то в этом роде. Или вам придется сделать что-то вроде предопределения корня сборки, чтобы вы могли сделать rm -rfэто позже. Я бы определенно перепроверил ответ, который rootdirскрипт может передать обратно, чтобы у вас не возникла синтаксическая ошибка при выдаче скрипта rm -rf /.
Тим Кеннеди