LINUX.ORG.RU

Вообще Makefile ручками пишут в очень редких случаях. Ты уверено, что это твой случай?
Обычно пользуют cmake, autotools и т.п.

UVV ★★★★★ ()

а зачем проверять? просто дергай mkdir

ananas ★★★★★ ()

добавить правило для создания директории. указать директорию как зависимость к содержимому.

myfolder:
    mkdir myfolder

content : myfolder ...
    ...

ddos3 ()
Ответ на: комментарий от farisey

> Уроды, правда?

Забанить бы тебя, правда? Выше три разных разумных решения получше того, что по твоей ссылке.

const86 ★★★★★ ()

как вариант. Ибо неплохо-бы проверять что тип существующего файла. А то вдруг это обычный регулярный файл ?

и кстати mkdir тоже не всегда можно использовать. Возможны случаи когда каталог должен изначально быть, а самому создавать его нельзя.

DIR=dir

all : checkdir primary

primary :
        touch -c $@

.NOPARALLEL : checkdir
.PHONY : checkdir
.ONESHELL:

checkdir :
        @if [ -f $(DIR) ] ; then
            echo FAIL
            exit 1
        fi
MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

> Возможны случаи когда каталог должен изначально быть, а самому создавать его нельзя.

а можно пример подобной ситуации? исключительно для общего развития

ananas ★★★★★ ()
Ответ на: комментарий от ananas

>а можно пример подобной ситуации? исключительно для общего развития

Элементарно: выхлоп внешнего генератора, создать наполнение соответствующей директории мы сами не можем (бессмысленно).

nuffsaid ()
Ответ на: комментарий от MKuznetsov

Так ругаться будет. Тогда уж как-то так, чтобы снять разногласия и сделать именно то, что просил вопрошающий:

#typically, this is not what you want 
#all: check_file
	
#answer
all : check_dir
	
FILE=test1
DIR=test2

check_file:
	$(if $(wildcard $(FILE)),,$(error "$(FILE) is missing, bye bye."))
	@echo "file or dir $(FILE) exists"
	

check_dir:
	@if [ ! -d $(DIR) ] ; then echo "creating $(DIR)" ; mkdir test2; fi
	@if [ -d $(DIR) ] ; then echo "$(DIR) exists"; else echo "$(DIR) not exists, error!"; exit 1; fi

        
.NOPARALLEL : check_dir check_file
.PHONY : check_dir check_file

P.S. не забывать, что отступы=табы, LORCODE не передаёт этого

nuffsaid ()
Ответ на: комментарий от nuffsaid

выхлоп вполне себе можно в цикле про-mkdir-ить

ananas ★★★★★ ()
Ответ на: комментарий от ananas

>выхлоп вполне себе можно в цикле про-mkdir-ить

Выхлоп может быть не только деревом каталогов, данные например.

tzukko ()
Ответ на: комментарий от tzukko

так и парсер выхлопа тоже может быть нетривиальным. но в любом случае он будет реализовавыться внешними по отношению к makefile средствами

ananas ★★★★★ ()
Ответ на: комментарий от tzukko

>Выхлоп может быть не только деревом каталогов, данные например.
facepalm


по теме:
если надо каталог создавать всегда, то проще добавить правило, в котором будет
mkdir -p — ${DIR}

xydo ★★ ()
Ответ на: комментарий от xydo

facepalm

Лоровцы всегда считают себя самыми умными. :> Ещё раз для самых-самых умных: внутри мэйкфайла некое действие нужно привязать к факту существования директории. Действие может быть работой с содержимым директории. Директория с её содержимым может быть создана, может быть не создана в результате работы внешней программы. Создавать директорию ручками не имеет смысла. Так понятно?

mkdir -p

не портабельно. И ещё раз для самых умных, курите мануал:

GNU Coding Standards; 7.2.2 Utilities in Makefiles

Generally, stick to the widely-supported (usually posix-specified) options and features of these programs. For example, don't use ‘mkdir -p’, convenient as it may be, because a few systems don't support it at all and with others, it is not safe for parallel execution.

nuffsaid ()

target: dir/ .....

P.S. С «папками» - на винфак

Led ★★★☆☆ ()
Ответ на: комментарий от farisey

За ссылки спасибо.

Уроды, правда?

Почему же уроды. Вполне люди адекватно ответили.

shk ()
Ответ на: комментарий от MKuznetsov
checkdir : 
        @if [ -f $(DIR) ] ; then 
            echo FAIL 
            exit 1 
        fi 

Ну нагородили...

checkdir:
    [ -d $(DIR) ]

или красивее так:

checkdir:
    test -d $(DIR)
(по сути тоже самое)

ASM ★★ ()
Ответ на: комментарий от nuffsaid

Re: Так понятно?

Ещё раз для самых-самых умных: внутри мэйкфайла некое действие нужно привязать к факту существования директории. Действие может быть работой с содержимым директории. Директория с её содержимым может быть создана, может быть не создана в результате работы внешней программы. Создавать директорию ручками не имеет смысла. Так понятно?

Тогда примерно так:

ifneq (,$(wildcard $(dir_path))
goal_if_exists: bla-bla-bla
   bla-bla-bla
else
goal_NOT_if_exists:
endif

ly ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.