Использование clang-cl с Makefile в стиле NMake не может вызвать эхо

У меня есть Makefile (для NMake, а не для GNU), который отлично работает с компилятором CL по умолчанию. Я собирался поэкспериментировать с Clang, используя программу совместимости clang-cl. Но я, кажется, получаю ошибки в Makefile, которые не связаны с компилятором. Например, у меня есть фрагмент кода в Makefile

MAKHDR=$(MAKDIR)header.$(MAKEXT)
!if ![(echo HDR=\>$(MAKHDR)) && for %i in ($(HDRDIR)*.$(HDREXT)) do @echo %i\>>$(MAKHDR)]
!include $(MAKHDR)
!else
!error Cannot locate header files
!endif

Из командной строки

set CXX=clang-cl
nmake

Этот код должен найти все заголовочные файлы и поместить их в переменную (что-то вроде подстановочного символа в GNU Make). Но я получаю сообщение об ошибке «Отказано в доступе» до того, как сработает ошибка !, и после этого файл заголовка с именем не существует на диске. Фактически, с небольшими изменениями в коде я обнаружил, что я также не могу вывести вывод на стандартный вывод. Но это работает, когда я делаю это с CL по умолчанию. Так почему же переопределение компилятора изменяет возможность эха?

Если вам интересно, полный Makefile можно найти на моем GitHub но имейте в виду, что это нетрадиционно.


person Jesse Maurais    schedule 03.03.2021    source источник


Ответы (1)


Проблема заключается в следующих двух строках в файле .make.cc:

DIR=\ //
ENT=;

Вторая строка выглядит странно, но правильно: она используется для указания разделителя списка Windows ; вместо Unix :. Цель первой строки — установить $(DIR) как одну обратную косую черту, \.

cl при создании .make генерирует:

DIR=\ ^M$
ENT=;^M$

(с добавлением ^M и $ для ясности), в то время как clang-cl удаляет пробелы в конце каждой строки и генерирует:

DIR=\$
ENT=;$

Таким образом, с cl $(DIR) расширяется до одной обратной косой черты \, по желанию. Но в clang-cl оно расширяется до ENT=;, в результате чего имя файла $(MAKHDR) становится obj ENT=;header.mak, а не obj\header.mak.

Alse $(HDRDIR) становится src ENT=;, портя for %i in ($(HDRDIR)*....


Одним из решений является замена в .make.cc:

DIR=\ //

с участием

DIR=\ #

(Я также пытался использовать ^\, но это была катастрофа.)

person Joseph Quinsey    schedule 03.03.2021
comment
Блестящий ответ. Спасибо. - person Jesse Maurais; 11.03.2021