Fri, 04 Feb 2005 10:05:39 +0300 Yuriy K wrote to Harry Zhurov:
SP>>>> - существует под все платформы YK>>> Для embedded - неактуально. HZ>> Это делает инструмент широкораспространенным, что положительно HZ>> сказывается на его поддержке, минимизации глюков, полноте документации и HZ>> проч.
YK> Hаиболее широкораспространенная система сегодня - WinXP.
Среди тебя и твоих коллег (90% которых не слышали про существование make). Среди меня и моих коллег - w2k. Разница между ними есть, хоть и незначительная.
Но если брать именно пользователей make, то что-то мне думается, что большинство их сидит не под виндой.
YK> Hезависимо от того, нравится это кому-то, или нет.
SP>>>> - есть средства работы со строками, списками, каталогами YK>>> Зачем это нужно при сборке проекта?
HZ>> Чтобы автоматизировать процесс подготовки списков файлов и передачи HZ>> их тулзам.
YK> Приведи пример задачи, которую нельзя решить батником.
Речь не столько о том, можно или нет, сколько об адекватности выбранного средства. Тем же батником ты можешь вызывать самописную утилиту, которая тебе обработает весь текст как надо. Только в случае make это не требуется. Пример: задаю директории, где лежат сорцы (из реального проекта):
SRC_DIRS = Src SRC_DIRS += scmRTOS/Common SRC_DIRS += scmRTOS/Target/AVR SRC_DIRS += scmRTOS/Lib/AVR
И еще тут можно добавить, сколько влезет. Теперь мне нужно сгенерить список файлов для сборки. Это делается так:
c_src += $(foreach DIR, $(SRC_DIRS), $(notdir $(wildcard $(DIR)/*.c))) cpp_src += $(foreach DIR, $(SRC_DIRS), $(notdir $(wildcard $(DIR)/*.cpp))) asm_src += $(foreach DIR, $(SRC_DIRS), $(notdir $(wildcard $(DIR)/*.$(ASM_EXT))))
Т.е. каждая папка в списке сканируется на предмет наличия файлов с указанными расширениями, составляются списки этих файлов. Из этих списков дальше генерятся зависимости и на этом базируется вся сборка. И мне не нужно специально добавлять/удалять файлы - достаточно поместить файл в указанные папки или удалить из них. Можно сделать как угодно.
Изобрази это с помощью батника?!!
HZ>> Там почти целый текстовый процессор (набор функций) для работы HZ>> со строками. Специальные функции сразу умеют вычленять имена файлов, HZ>> расширения, директории и т.д.
YK> help for >for.txt YK> WinNT и выше.
Наивный! Вот тебе краткий перечень функций. При чем тут твой for убогий из командного процессора винды? Что он может из приведенного ниже? Ничего!
$(subst from, to, text)
Performs a textual replacement on the text text: each occurrence of fromis replaced by to. The result is substituted for the function call. For example, $(subst ee,EE,feet on the street) substitutes the string 'fEEt on the strEEt'.
$(patsubst pattern, replacement, text)
Finds whitespace-separated words in textthat match pattern and replaces them with replacement. Here pattern may contain a '%' which acts as a wildcard, matching any number of any characters within a word. If replacement also contains a '%', the '%' is replaced by the text that matched the '%' in pattern.
$(strip string)
Removes leading and trailing whitespace from string and replaces each internal sequence of one or more whitespace characters with a single space. Thus, '$(strip a b c )' results in 'a b c'.
$(findstring find, in)
Searches infor an occurrence of find. If it occurs, the value is find; otherwise, the value is empty.
$(filter pattern...,text)
Removes all whitespace-separated words in textthat do not match any of the pattern words, returning only matching words. The patterns are written using '%', just like the patterns used in the patsubst function above.
$(filter-out pattern.. .,text)
Removes all whitespace-separated words in text that do match the patternwords, returning only the words that do not match. This is the exact opposite of the filter function.
$(sort list)
Sorts the words of listin lexical order, removing duplicate words. The output is a list of words separated by single spaces.
$(dir names.. .)
Extracts the directory-part of each file name in names. The directory-part of the file name is everything up through (and including) the last slash in it. If the file name contains no slash, the directory part is the string './'.
$(notdir names...)
Extracts all but the directory-part of each file name in names. If the file name contains no slash, it is left unchanged. Otherwise, everything through the last slash is removed from it.
$(suffix names...)
Extracts the suffix of each file name in names. If the file name contains a period, the suffix is everything starting with the last period. Otherwise, the suffix is the empty string. This frequently means that the result will be empty when names is not, and if names contains multiple file names, the result may contain fewer file names.
А также еще пачка функций для работы с именами файлов, расширениями, стоками, словами и т.д. и т.п.
$(basename names...) $(addsuffix suffix, names...) $(addprefix prefix, names...) $(join list1, list2) $(word n, text) $(words text) $(firstword names...) $(wildcard pattern)
С помощью батника всю эту функциональность не реализовать. И не надо говорить, что она не нужна. Очень даже нужна.
Не понимаю, что ты споришь?! Специализированное средство - есть специализированное средство. И можно его хаять, можно хвалить - факт, что оно на сегодняшний день завоевало признание и пользуется популярностью как среди программистов, так и среди непрограммистов.