Automati c создание каталогов с помощью make-файла - PullRequest
0 голосов
/ 14 февраля 2020

Мы используем make-файл для нашего проекта (на моем рабочем месте). У меня две копии кода на одном и том же коммите в dir1 и dir2. В dir1, где я написал начальный make-файл и отправил соответствующие изменения, я могу построить все цели без проблем. Однако в отдельном клонированном каталоге dir2 произойдет сбой make, если я не создам явным образом всю структуру выходных каталогов для отказавшей цели, хотя он может создавать выходные каталоги для других целей (последняя из 4 целей завершается ошибкой).

Я проверил это: Makefile Неустранимая ошибка: невозможно создать obj / cal c .o и https://lists.gnu.org/archive/html/help-make/2016-06/msg00022.html

Не сильно помогло .

Любой способ исправить это противоречивое поведение был бы великолепен !!

Подробности ниже:

$make --version
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

~/dir1 2020-02-14 00:12:40
$cc --version
cc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

При создании в dir1:

~/dir1 2020-02-13 23:34:05
$ make clean all

~/dir1 2020-02-13 23:34:05
$make clean all
rm -f build/m1/p1/os/p1.o build/m1/p1/t2.o build/m1/t1/t1_t2.o build/m1/t1/proj_t1.o build/m1/p3/proj_p3.o lib/libp1.a lib/libt1.a lib/libp3.a p3_app build/examples/p3_app/p3_app.o build/examples/util/util_os.o
cc -c m1/p1/os/p1.c -o build/m1/p1/os/p1.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c m1/p1/t2.c -o build/m1/p1/t2.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p1 module...
ar crv lib/libp1.a build/m1/p1/os/p1.o build/m1/p1/t2.o
a - build/m1/p1/os/p1.o
a - build/m1/p1/t2.o
ranlib lib/libp1.a
cc -c m1/t1/t1_t2.c -o build/m1/t1/t1_t2.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c m1/t1/proj_t1.c -o build/m1/t1/proj_t1.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building t1 module...
ar crv lib/libt1.a build/m1/t1/t1_t2.o build/m1/t1/proj_t1.o
a - build/m1/t1/t1_t2.o
a - build/m1/t1/proj_t1.o
ranlib lib/libt1.a
cc -c m1/p3/proj_p3.c -o build/m1/p3/proj_p3.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p3 module...
ar crv lib/libp3.a build/m1/p3/proj_p3.o
a - build/m1/p3/proj_p3.o
ranlib lib/libp3.a
cc -c examples/p3_app/p3_app.c -o build/examples/p3_app/p3_app.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c examples/util/util_os.c -o build/examples/util/util_os.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p3 app...
cc build/examples/p3_app/p3_app.o build/examples/util/util_os.o lib/libp3.a lib/libt1.a lib/libp1.a -lt2-1.0 -lpthread -o p3_app
building all...


~/dir1 2020-02-13 23:34:09
$git log -1
commit 69e17c772231b8dc8 XXXXXXXXXXXXXXXXXX
Author: XXXXXX
Date:   ----------------

При создании в dir2:

~//dir2 2020-02-13 23:34:19
$git log -1
commit 69e17c772231b8dc8 XXXXXXXXXXXXXXX
Author: XXXXXX
Date:   ----------------

~/dir2 2020-02-13 23:34:21
$make clean all
rm -f build/m1/p1/os/p1.o build/m1/p1/t2.o build/m1/t1/t1_t2.o build/m1/t1/proj_t1.o build/m1/p3/proj_p3.o lib/libp1.a lib/libt1.a lib/libp3.a p3_app build/examples/p3_app/p3_app.o build/examples/util/util_os.o
cc -c m1/p1/os/p1.c -o build/m1/p1/os/p1.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c m1/p1/t2.c -o build/m1/p1/t2.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p1 module...
ar crv lib/libp1.a build/m1/p1/os/p1.o build/m1/p1/t2.o
a - build/m1/p1/os/p1.o
a - build/m1/p1/t2.o
ranlib lib/libp1.a
cc -c m1/t1/t1_t2.c -o build/m1/t1/t1_t2.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c m1/t1/proj_t1.c -o build/m1/t1/proj_t1.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building t1 module...
ar crv lib/libt1.a build/m1/t1/t1_t2.o build/m1/t1/proj_t1.o
a - build/m1/t1/t1_t2.o
a - build/m1/t1/proj_t1.o
ranlib lib/libt1.a
cc -c m1/p3/proj_p3.c -o build/m1/p3/proj_p3.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p3 module...
ar crv lib/libp3.a build/m1/p3/proj_p3.o
a - build/m1/p3/proj_p3.o
ranlib lib/libp3.a
cc -c examples/p3_app/p3_app.c -o build/examples/p3_app/p3_app.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
cc -c examples/util/util_os.c -o build/examples/util/util_os.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
building p3 app...
cc build/examples/p3_app/p3_app.o build/examples/util/util_os.o lib/libp3.a lib/libt1.a lib/libp1.a -lt2-1.0 -lpthread -o p3_app
cc -c m1/p2/proj_p2_common.c -o build/m1/p2/proj_p2_common.o  <INCLUDES> -fPIC -Wall -std=gnu11 -Werror -Dproj_OS_os -DDEFAULT_t2_PID=0xEC -g -DDEBUG -Dt2_SUPPORT
Assembler messages:
Fatal error: can't create build/m1/p2/proj_p2_common.o: No such file or directory
make: *** [makefile:134: build/m1/p2/proj_p2_common.o] Error 1

"build" и Каталоги "lib" создаются через mkdir -p в обоих случаях. А все остальные внутренние каталоги создаются автоматически.

Если я вручную запускаю mkdir -p ~/dir2/build/m1/p2/, тогда make all работает нормально.

PS: мне пришлось заменить действительное имя каталога и имена файлов на фиктивные имена, такие как p1, p2, t1, os и file, так как я совершенно уверен, что информация не может быть размещена на платформе publi c - но поскольку это поиск и замена, я уверен, что это очень похоже на выход у меня есть.

...