Вывод эха в файл с входной строкой, превышающей ограничение длины команды Windows - PullRequest
0 голосов
/ 26 июня 2019

Мне нужен список всех имен объектных файлов с указанием пути к текстовому файлу.Я не могу использовать файловую функцию GNU make, поскольку это V3.79.Этот список становится действительно огромным, так как это большой проект, и поэтому я получаю ошибку 'make (e = 87): Параметр неверен', так как он пересекает ограничение длины командной строки 32K Windows.

Первоначальная проблема заключалась в том, что мне нужно было передать список объектов в качестве параметра в archiver.exe для создания библиотеки, которая также вызвала проблему e = 87.Это почти так же, как проблема, перечисленная здесь .Именно тогда я решил поместить этот список в текстовый файл и передать файл в качестве параметра archiver.exe.Но я застрял, потому что создание самого файла вызывает ту же ошибку.Вот что я попробовал:

MY_OBJECTS = $(shell $(FIND) $(MY_OBJPATH) -name '*.o')
MY_OBJECTSLIST = objlist.txt
all:
     @echo $(MY_OBJECTS) > $(MY_OBJECTSLIST)

Мне нужно решение, чтобы каким-то образом поместить весь список объектов в текстовый файл.

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Использовать промежуточный файл?

MY_OBJECTS = $(shell $(FIND) $(MY_OBJPATH) -name '*.o' | tee objects.txt)
MY_OBJECTSLIST = objlist.txt
all:
    cp objects.txt ${MY_OBJECTSLIST}

Множество возможностей для оптимизации здесь, конечно.

0 голосов
/ 27 июня 2019

Вы можете использовать функцию file .

all:
     $(file > $(MY_OBJECTSLIST) $(MY_OBJECTS))

Обратите внимание, что поиск файлов MY_OBJECTS происходит, как только оценивается MY_OBJECTS, независимо от того, выполняете ли вы соответствующую цель или нет. В этом случае вы можете перенести работу из make в shell в фактическую цель. вывод find является потоком и не имеет ограничения длины командной строки оболочки.

Плюс, objlist.txt это файл! Вот что make делает лучше всего - создает файл именно тогда, когда он нужен, не раньше и не раньше.

all: objlist.txt
     @echo $(MY_OBJECTS) > $(MY_OBJECTSLIST)

objlist.txt: <should better depend on the condition that all the *.o files are already built>
     $(FIND) $(MY_OBJPATH) -name '*.o' > objlist.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...