Три вопроса по nmake

Тема в разделе "WASM.SOFTWARE", создана пользователем leviafan, 16 дек 2008.

  1. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    1) Можно ли в нескольких целях указать одну и ту же зависимость так, чтобы она выполнялась каждый раз для достижения каждой из целей?
    2) Можно ли задать команду так, чтобы её параметры зависели от расширения цели?
    Например. Хотелось бы избавиться от повторяющихся подпоследовательностей команд:
    Код (Text):
    1. project: x.dll y.exe
    2. x.dll: x.obj
    3.     $(LINKER) $(DLLOPTS) $(LINKFLAGS) $(OPTIMIZEFLAGS1) $*.obj
    4.     echo ^ Linking: $@
    5.     del $*.obj $*.exp
    6. y.exe: y.obj
    7.     $(LINKER) $(LINKFLAGS) $(OPTIMIZEFLAGS1) $*.obj
    8.     echo ^ Linking: $@
    9.     del $*.obj *.lib
    3) nmake из набора VS 2005 (v8.00.50727.762) не распознаёт правило вывода .obj.dll.
    Код (Text):
    1. all: my.dll
    2. .obj.dll:
    3.        $(LINKER) $(DLLOPTS) $*.obj
    Консольный вывод:
    NMAKE : fatal error U1073: don't know how to make 'my.dll'
    Почему он не видит связи?
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    leviafan
    Используй GNU make, он может все, что ты хочешь.
     
  3. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    других решений нет?
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    leviafan
    если я правильно понял вопрос, то надо просто объявить эту зависимость как цель без зависимостей, nmake будет всегда считать ее изменившейся и делать действия, связанные с ней.
    в nmake, скорее всего, нет.
    а ты точно уверен, что nmake поддерживает цели типа .x.y ?
     
  5. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    meduza
    не совсем то... например, хочется чтобы в задании из двух и более подобных целей (t1, t2):
    Код (Text):
    1. all: t1 t2
    2. t1: PrintNewLine x.exe y.exe
    3.     some commands
    4. t2: PrintNewLine x.dll y.dll
    5.     some other commands
    6. PrintNewLine:
    7.     echo.
    PrintNewLine или любая другая нужная зависимость выполнялась каждый, а не один раз (nmake считает, что при достижении цели t1 PrintNewLine была достигнута и в t2 забивает на эту зависимость).
    ну, во-первых, в MSDN данному типу целей отведён целый блок, описывающий т.н. правила вывода (inference rules), а во-вторых, в nmake уже присутствуют умолчания, которые можно переопределять, а иногда удобнее использовать как есть, среди них, к примеру, .asm.obj, .c.obj, .cpp.exe и др.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leviafan
    > 2) ...
    Imho. Для очистки принято делать специальную цель - clean(up)

    3) ...
    Ты где-нибудь описал цель
    Код (Text):
    1. my.dll: от_чего_она_зависит_напрмер_obj'и_def'ы_и_т.д.
     
  7. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    q_q
    да ну?? = ) вроооде бы в обсуждении нигде про очистку не упоминалось...
    Правила вывода типа .obj.dll как раз и определяют получение любой цели с расширением dll из одноимённой зависимости с расширением obj. Более того (см. выше) умолчания типа .asm.obj работают и переопределяются прекрасно!!
     
  8. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    leviafan
    Просто запихивать команды типа "del $*.obj $*.exp" в обычные цели считается плохим стилем. Лучше для этого делать специальные абстрактные цели типа clean. К тому же если так писать, то пропадает главное достоинство make - не пересобирать файлы, которые не изменились, а у тебя объектники будут удаляться после каждого вызова make и каждый раз все будет собираться по-новому.

    А теперь понял. Не знаю, как это решается, но возникает один вопрос - зачем такое нужно? (надеюсь пример с "PrintNewLine" был шуткой).
     
  9. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    Да, согласен, но это тестовый пример, для отладки, как раз нужно было пересобирать при каждом запуске...
     
  10. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    Первое что пришло в голову... хотя я видел такой пример, где nmake формировал целый отчёт в хорошем оформлении, он использовался как инструмент синхронизации двух каталогов с выполнением некоторых дополнительных плановых заданий...
     
  11. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    leviafan
    хоть для отладки, зоть для чего-угодно -- зачем заново пересобирать что-то, если никаких изменений не было!?
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leviafan
    > .obj.dll как раз и определяют получение любой цели с расширением dll из одноимённой
    > зависимости с расширением obj
    Спасибо, что объяснил. Гы-гы-гы.

    > .asm.obj работают и переопределяются прекрасно!!
    Отличие в том, что когда nmake видит
    Код (Text):
    1. .asm.exe:
    2.     $(AS) $(AFLAGS) $*.asm
    asm-файлы существуют, а когда он видит
    Код (Text):
    1. all: my.dll
    2. .obj.dll:
    3.     $(LINKER) $(DLLOPTS) $*.obj
    obj-файлов еще нет. Создай отдельно объектники, дай их nmake'у и он создаст dll'ку. Imho nmake не умеет делать логическую цепочку от my.asm до my.dll. Ему нужна помощь, вариант #6.

    > вроооде бы в обсуждении нигде про очистку не упоминалось... это тестовый пример ...
    > Первое что пришло в голову
    Imo с просьбами прокомментировать сферического коня в вакууме обращайся в хип, умник.

    ps учи матчасть.
     
  13. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    q_q, не слишком ли высокая у тебя самооценка??!

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

    Моя очередь:

    Для просмотра макроопределений, правил вывода, целевых объектов, списка .SUFFIXES существует специальная полезная опция - /p. Будем отслеживать с её помощью текущие правила вывода. Если использовать данную опцию без указания make-файла или без переопределения соответствующих правил и списка суффиксов, то в потоке вывода будут присутствовать только стандартные, описанные в документации умолчания. q_q, обрати внимание, что среди них .asm.obj будет иметь более высокий приоритет, чем .asm.exe.

    Таким образом, чтобы скомпилировать из asm-файла соответствующий exe-шник (dll-ку), можно использовать, например, такой make-файл:
    Код (Text):
    1. M32_PATH = c:\masm32
    2.  
    3. AS = $(M32_PATH)\bin\ml.exe
    4. AFLAGS = /nologo /coff /I$(M32_PATH)\include
    5.  
    6. LINKER  = $(M32_PATH)\bin\link.exe
    7. DLLOPTS = /dll /noentry
    8. LINKFLAGS = /nologo /libpath:$(M32_PATH)\lib /subsystem:console
    9. OPTFLAGS = /opt:nowin98
    10.  
    11. .SILENT:
    12. t1.exe: t1.obj
    13.         $(LINKER) $(LINKFLAGS) $(OPTFLAGS) $**
    14. t2.dll: t2.obj
    15.         $(LINKER) $(DLLOPTS) $(LINKFLAGS) $(OPTFLAGS) $**
    Используя опцию /p, можно убедиться, что obj-файлы (если они ещё не созданы) будут автоматически компилироваться из соответствующих asm-файлов согласно правилу:
    Код (Text):
    1. .asm.obj::
    2.         $(AS) $(AFLAGS) /c $<
    Естесственно, что мы можем переопределить стандартные правила вывода, а, также, как это утверждается в документации, создавать новые, не забывая вносить соответствующие расширения зависимостей в список суффиксов.
    Код (Text):
    1. # директива .SUFFIXES без параметров очищает список суффиксов. Здесь её использование совсем
    2. # необязательно и служит лишь для явного предоставления возможности сравнения обработки правил
    3. # вывода по умолчанию с ней и без неё
    4.  
    5. .SUFFIXES:
    6.  
    7. # добавляем в список расширение .asm, задающее некий приоритет и активирующий правило вывода
    8. # файлов с расширением .asm в файлы других расширений
    9.  
    10. .SUFFIXES: .asm
    11. test: t1.txt t2.txt
    12. .asm.txt:
    13.     copy /b $< $@
    Однако, аналогичная запись правила для получения dll-ки:
    Код (Text):
    1. .SUFFIXES:
    2. .SUFFIXES: .obj .asm
    3. all: my.dll
    4. .obj.dll:
    5.     $(LINKER) $(DLLOPTS) $(LINKFLAGS) $(OPTFLAGS) $@
    6. .asm.obj::
    7.     $(AS) $(AFLAGS) /c $<
    вызывает у nmake "дезориентацию" - опция /p показывает наличие созданных правил, однако выполнение make-файла завершается выводом сообщения об ошибке:
    NMAKE : fatal error U1073: don't know how to make 'my.dll'
     
  14. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    leviafan
    Код (Text):
    1. .SUFFIXES:
    2. .SUFFIXES: .dll .obj .asm
    3. all: my.dll
    4. .obj.dll:
    5.     $(LINK) $<
    6. .asm.obj:
    7.     $(AS) $<
    ГНУшный make работает, nmake валится, вероятно это баг. Еще раз предложу перейти на нормальный make (GNU, BSD), nmake - одна из ошибок мелкософта.
     
  15. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    meduza, согласен с тобой, собственно и вопрос-то был для того, чтобы разобраться, кто допускает ошибку, я или мелкософтный nmake. GNU Make силён, да и написать свой, родной, не столь трудно, даже приятнее))
    Хотелось верить, что они стараются соблюдать соглашения, принятые ими в своей же документации...
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leviafan
    > твои аргументы и вывод ... абсолютно несостоятельны
    Чем, мой вывод "nmake не умеет ... Ему нужна помощь", отличается от твоего - "вызывает у nmake "дезориентацию""?

    > ты не знаешь предмета (и не умеешь читать документацию).
    Спорное утверждение.
    Например, мне не требуется помощь зала, чтобы, заставить nmake, собрать dll'ку.

    > Моя очередь ... можно использовать ... t2.dll: t2.obj
    Именно об этом я писал в #6, ты начал огрызаться и настаивать, что хочешь универсальных правил.

    ps
    > не слишком ли высокая у тебя самооценка??!
    Imo обсуждение этого выходит "за рамки данного обсуждения".
     
  17. leviafan

    leviafan Макс

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    9
    Адрес:
    Екатеринбург
    > Чем, мой вывод "nmake не умеет ... Ему нужна помощь", отличается от твоего - "вызывает у nmake "дезориентацию""?
    Вопрос задан некорректно, происходит подмена контекста...

    > "nmake не умеет ... Ему нужна помощь"
    умеет, описано в 13, но при этом глючит для некоторых расширений, например для dll.

    > Например, мне не требуется помощь зала, чтобы, заставить nmake, собрать dll'ку.
    И опять же, нигде не утверждалось, что Я не могу собрать dll'ку, речь шла о некорректной или плохо понятой работе правил вывода.

    > Именно об этом я писал в #6, ты начал огрызаться и настаивать, что хочешь универсальных правил.
    Так здесь не обсуждаются стандартные правила, т.к. они работают.

    >> не слишком ли высокая у тебя самооценка??!
    > Imo обсуждение этого выходит "за рамки данного обсуждения".
    Вопрос был вполне уместен, Imo не по-профессиональному ты рассуждаешь, нужно уважать собеседника, форум для общения специалистов, а не для того, чтобы показать, кто круче.
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    leviafan
    > умеет, описано в 13, но при этом глючит для некоторых расширений, например для dll.
    Начнем пополнять список "глючных" расширений?
    "Зашитого" правила .obj.exe нет.

    Повторяю последний раз: "nmake не умеет строить логические цепочки через цель".
    Хочешь заставить nmake получать из dll'ку из asm'а?
    Либо напиши правило .asm.dll, либо опиши зависимость как в #6.

    PS imho не тебе ссылаться на уважение.