AndreyAkinshin / Russian-Phd-LaTeX-Dissertation-Template

LaTeX-template for russian Phd thesis
Creative Commons Attribution 4.0 International
1.33k stars 670 forks source link

Makefile и Windows #240

Closed i3v closed 5 years ago

i3v commented 5 years ago

Если я правильно понимаю, текущая версия Makefile под Windows и не должна работать? Судя по ifneq ($(SystemDrive),) - там когда-то была попытка учесть специфику Windows, но rm прямым текстом, вроде бы, не оставляет шансов.

В #42 (Makefile) и #86 (todo: Инструкция по установке для Windows) эти вопросы не затронуты, кроме идеи добавить bat файлы.

Я попытался сейчас эту тему поковырять - проверил разные make (Windows 10 x64):

  1. MinGW v4.0 далее - mingw32-make. Кое-что работает ( make synopsis, make dissertation, make draft) после небольших правок. Мне кажется, есть надежда "малой кровью" добиться того, что всё (или почти всё) будет работать нормально. Хотя я не спец в этом.
  2. GNUWin32 v3.81 далее - gnuwin32-make. Не работает, даже после описанных правок.
  3. С nmake v14.15.26732.1 - не работает. Похоже, в плане совместимости с линуксом там всё достаточно безнадёжно.

Почему сейчас не работает:

Во-первых из-за # не в начале строки:

    w:\ext\Phd-Template>mingw32-make synopsis
    #       mingw32-make -C Synopsis
    process_begin: CreateProcess(NULL, # mingw32-make -C Synopsis, ...) failed.
    make (e=2): The system cannot find the file specified.
    Makefile:28: recipe for target 'synopsis' failed
    mingw32-make: *** [synopsis] Error 2

Во-вторых из-за ':

    w:\ext\Phd-Template>gnuWin32-make synopsis
    #       gnuWin32-make -C Synopsis
    process_begin: CreateProcess(NULL, # gnuWin32-make -C Synopsis, ...) failed.
    make (e=2): The system cannot find the file specified.
    gnuWin32-make: *** [synopsis] Ошибка 2

    w:\ext\Phd-Template>mingw32-make synopsis
    latexmk -pdf -pdflatex="xelatex -halt-on-error -file-line-error %O '\newcounter{fontfamily}\setcounter{fontfamily}\
    {1}\input{%S}'" synopsis
    Latexmk: This is Latexmk, John Collins, 25 October 2018, version: 4.61.
    Latexmk: applying rule 'pdflatex'...
    Rule 'pdflatex': Rules & subrules not known to be previously run:
       pdflatex
    Rule 'pdflatex': The following rules & subrules became out-of-date:
          'pdflatex'
    ------------
    Run number 1 of rule 'pdflatex'
    ------------
    ------------
    Running 'xelatex -halt-on-error -file-line-error  -recorder  '\newcounter{fontfamily}\setcounter{fontfamily}{1}\input{"synopsis.tex"}''
    ------------
    This is XeTeX, Version 3.14159265-2.6-0.99999 (TeX Live 2018/W32TeX) (preloaded format=xelatex)
     restricted \write18 enabled.
    entering extended mode
    ! I can't find file `'"'"'"'.
    <to be read again>
                       \edef
    <*> '"'"'\newcounter{fontfamily}
                                    \setcounter{fontfamily}{1}\input{synopsis.te...

    (Press Enter to retry, or Control-Z to exit)
    Please type another input file name:

Оба момента можно поправить. Тестировал на TexLive 2018 актуальном, на Windows 10 и CentOS7.

Далее, наверное, по аналогии поправлю clean, ещё не пробовал.

Что является большим гемороем - поддерживать отдельные bat файлы или специфичные для винды костыли в Makefile - вопрос сложный, пока вроде не такие уж страшные костыли выходят.

Или я чего-то упускаю и вообще не в ту степь забрёл?

Lenchik commented 5 years ago

PR welcome :) За работой makefile (не только в корневой, но и во всех остальных папках) никто не следит, тем более под Windows. Конечно, хорошо бы какой-то ответственный энтузиаст навёл порядок. Мне важно, чтобы после всех перетрясок продолжали работать examples из makefile.

Относительно rm — в GNUWin32 есть пакет coreutils, который ставит эту утилиту. Конечно, желательно, чтобы меньше всего постороннего ставить (MinGW весь ради нескольких утилит... может, их можно поштучно набрать в http://win-builds.org/doku.php/1.5.0_packages ?), но если будет понятная инструкция, то можно и поставить порты каких-то linux утилит. В конечном счете, тем, кто makefile будет под Windows использовать, они всё равно пригодятся.

поддерживать отдельные bat файлы

Пока можно не заморачиваться. Помню, что, предположительно под WinXP, при вызове makefile не работало, а то же из cmd работало. Может быть, это какие-то несовместимости версий утилит.

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

Одним из вариантов запуска хорошо бы иметь сборку диссера, потом автореферата, а затем уже чистить остаточные файлы от обеих сборок (для потенциальной возможности в автореферат протаскивать некоторые данные от сборки диссертации через *.aux файлы).

Можно отлаживать работу получающегося универсального makefile и под *nix системами. Для этого репозиторий клонируется на Gitlab и там включается GitlabCI, тогда в корне создаем файл .gitlab-ci.yml следующего содержания (как пример, там много возможностей. судя по докам)

image: fermiumlabs/latex-docker:latest

build:
  script:
    - make all
  artifacts:
    paths:
      - "*.pdf"
      - "*.log"
    expire_in: 4 mos

Тогда можно в артефактах сборки смотреть ошибки по логам и pdf. Во вписанном в пример docker-файле TexLive2018 более-менее свежий.

i3v commented 5 years ago

Немного продвинулся.

Нативные make для Windows:

Изменения для поддержки Windows Вот версия основного Makefile, которая содержит все изменения, связанные именно с поддержкой Windows.

Msys2 На mingw-w64 самым живчиком смотрится msys2. Но если его ставить (это уже ~300 МБ минимум) то уж логичнее использовать встроенный bash и забить на идею сделать "Makefile, совместимый с нативным Windows make". Надо посмотреть, получится ли его нормально заинтегрировать с TexStudio, ещё не пробовал. Если получится - наверное это самый логичный вариант будет.


За работой makefile (не только в корневой, но и во всех остальных папках) никто не следит, тем более под Windows. Конечно, хорошо бы какой-то ответственный энтузиаст навёл порядок.

Ага, там есть странные моменты. Хотя бы вызов xelatex через переопределение командны для pdflatex (что неэффективно).

Мне важно, чтобы после всех перетрясок продолжали работать examples из makefile.

Ну, там можно сэкономить количество строчек, чтоб не так страшно смотрелось. Но пока я всё минимально менять собирался.

Относительно rm — в GNUWin32 есть пакет coreutils, который ставит эту утилиту.

Такие вещи обычно плохо работают из-за слишком тесной интеграции с интерпретатором командной строки. Я попробовал, но те же выражения вроде rm -f *.[1-9][0-9] не заработали.

если будет понятная инструкция, то можно и поставить порты каких-то linux утилит.

Ну вот да.... ИМХО, Windows-way это когда есть один инсталлятор, где галочками можно отметить что нужно, а не качать отдельными пакетами. Пусть даже пара ГБ лишних. И даже msys тогда совсем не страшный.

Можно отлаживать работу получающегося универсального makefile и под *nix системами.

Ок, спасибо за краткую инструкцию! Может попробую. Но... разве там следует ожидать какой-то принципиальной разницы с локальной сборкой под RHEL/CentOS7?

Желательно убрать все makefile кроме корневого (они уже давно лишены смысла, кажется).

Вот тут интересный момент. Почти все - кроме презентации. Мне кажется, что наиболее логичным вариантом тогда является собирать презентацию "в корень" тоже. Но тогда надо либо сам presentation.tex перенести в корень, либо файл с \input{Presentation/presentation} в корне создать. И пути исправить. Я пока так и сделал. Нет возражений?

Полученная версия - полностью рабочая под виндой (и под CentOS7) включая talk. (Ну, настолько же, насколько версия, с которой я начинал, рабочая под линуксом.)

LSinev commented 5 years ago

http://make.mad-scientist.net/ здесь есть ссылки, где качнуть скомпилированный под Win make 4.2.1 (https://sourceforge.net/projects/ezwinports/files/?source=navbar и искать подходящий make-...zip)

вызов xelatex через переопределение команды для pdflatex

В старых версиях latexmk иначе не было вариантов. В TexLive 2018 он обновился несколько раз, вроде бы. Так что сейчас есть более удачные варианты вызова.

i3v commented 5 years ago

Да, интересный вариант, спасибо! Меньше мегабайта. Установка - только распаковать. Работает на том что я наваял, если убрать удвоение %. Вероятно, дело в том, что это не "нативная" (основанная на MSVCRT) версия (см. "What's the difference between make and mingw32-make?" в FAQ mingw.org). Но всё-таки многовато костылей. Надо через msys2 попробовать.

Lenchik commented 5 years ago

разве там следует ожидать какой-то принципиальной разницы с локальной сборкой под RHEL/CentOS7?

Не знаю, просто как вариант.

Нет возражений?

Вроде бы, нет. Я думал, что .phony конструкция должна быть первой в файле, но про такое не пишут требований. Недавний PR #241 в Makefile кой-чего добавлял, это в новом PR тоже надо бы учесть.

сам presentation.tex перенести в корень

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

Lenchik commented 5 years ago

@i3v @seregaxvm Приглашаю обоих здесь порассуждать на тему стратегий развития Makefile в этом проекте. А то видно обе тенденции - как к одному файлу, так и к нескольким (см. #243).

Комплект разных examples я пока трогать не хочу в смысле убирания подчастей, но за примеры возможностей по оптимизации - спасибо,

Могу отдельный branch завести, для работы над Makefile.

matsievskiysv commented 5 years ago

По поводу моего PR (#243). Основное, что хочется сохранить - это единый latexmkrc файл с настройками через переменные среды. Это читабельнее. Если переделывать под единый Makefile, то надо будет использовать конструкции типа

$(eval export DRAFTON=1)

К разговору про make под Windows - почему не cygwin? Кроме того есть ещё такое решение

Lenchik commented 5 years ago

надо будет использовать конструкции типа

$(eval export DRAFTON=1)

Зачем? В целом, поделитесь, пожалуйста, своей концепцией работы Makefile, и тем в каких ваших примерах использования она более выигрышна, чем иные подходы?

И я сторонник того, чтобы и без Makefile всё работало как под Win, так и под Linux, в том числе и из редакторов типа TeXstudio.

matsievskiysv commented 5 years ago

надо будет использовать конструкции типа

$(eval export DRAFTON=1)

Зачем?

latexmk в моём случае подцепляет параметры из переменных среды.

$DRAFTON = $ENV{DRAFTON};
$ALTFONT = $ENV{ALTFONT};
$USEBIBER = $ENV{USEBIBER};
$IMGCOMPILE = $ENV{IMGCOMPILE};
$LATEXFLAXS = $ENV{LATEXFLAXS};

$pdflatex = 'pdflatex $LATEXFLAXS %O "\newcounter{draft}\setcounter{draft}{$DRAFTON}\newcounter{usealtfont}\setcounter{usealtfont}{$ALTFONT}\newcounter{bibliosel}\setcounter{bibliosel}{$USEBIBER}\newcounter{imgprecompile}\setcounter{imgprecompile}{$IMGCOMPILE}\input{%T}"';

В целом, поделитесь, пожалуйста, своей концепцией работы Makefile, и тем в каких ваших примерах использования она более выигрышна, чем иные подходы?

И я сторонник того, чтобы и без Makefile всё работало как под Win, так и под Linux, в том числе и из редакторов типа TeXstudio.

В #243 диссертация, автореферат и презентация в общем-то отдельные проекты, которые делят некоторые файлы между собой. Их сборку удобнее производить из их папок.

Если добавить дефолтные значения в файл latexmkrc, то и сборка вручную будет довольно тривиальной.

export USEBIBER=1; latexmk  -r ../latexmkrc dissertation

На сколько я помню, такого рода конструкции можно задать по крайней мере в texmaker.

rstm-sf commented 5 years ago

Всем привет!

Может можно будет использовать CMake или SCons?

i3v commented 5 years ago

Недавний PR #241 в Makefile кой-чего добавлял, это в новом PR тоже надо бы учесть

Ага, мой интерес к Makefile того же с автосборки сжатых версий начался. И сборки нескольких версий с разными флагами ещё. Остальное проще из TexStudio сделать.

надо будет использовать конструкции типа $(eval export DRAFTON=1)

Я в Makefile'ах понимаю мало, но в таком варианте плохого особо ничего не вижу. Читабельно, расширять просто. Я бы даже может целые куски tex кода туда запихивал. Тогда все эти три строчки фактически заменяются одной, собирать которую можно через +=. И тогда "конечный пользователь" может добавлять свои флаги более читабельным и лучше совместимым с мёрджингом образом.

К разговору про make под Windows - почему не cygwin?

Вызывать из-под cygwin exe-шники это часто проблемы с путями и прочим. А использовать Tex установленный через cygwin - подозреваю, что медленно будет. С TexStudio и прочим интегрировать будет не очень просто, похоже. Но и изначальная идея (использовать нативный make для Windows) приводит к костылям. msys2 - возможно правильный компромисс. Ещё не пробовал. WSL - аналогично (я плохо себе представляю преимущества WSL над msys2).

Из #243:

Makefile в папках dissertation, synopsis и presentation теперь самодостаточны и идентичны

Лично мне наличие трёх одинаковых файлов скорее не нравится, чем нравится. Особенно если собирать надо в корень.

matsievskiysv commented 5 years ago

Может можно будет использовать CMake или SCons?

@rstm-sf Это не имеет смысла. cmake и прочие хороши, когда процесс сборки сложен. Здесь же всю работу за нас выполняет latexmk. Рецепты для make тривиальны и тащить в стак ещё одну программу не стоит.

@i3v Это, честно говоря, меня пугает) К слову, в альтернативной версии Makefile одинарных ковычек нет (есть, но их можно удалить без последствий).

Посмотрел оригинал - mingw.org Предлагает версию 3.82.90 (2012-09-02) - ещё более старую, чем win-builds. Подозрительно.

Тут пишет дату сборки 2017-09-06

Вызывать из-под cygwin exe-шники это часто проблемы с путями и прочим. msys2 - возможно правильный компромисс. Ещё не пробовал. WSL - аналогично (я плохо себе представляю преимущества WSL над msys2).

Думаю, надо cygwin шанс. Вы, кстати, используете Windows shell? Проблемы могут идти оттуда. Вместе с cygwin поставляется свой shell.

Lenchik commented 5 years ago

У вас у самих какие будут стратегии использования сейчас и через несколько лет форка этого проекта? Под свой диссер готовите заготовку или аспирантам своим в помощь? Нужно сохранить какой-то баланс между удобством входа новичков в работу с шаблоном (тут скорее к изменениям в структуре ибо makefile уже не для слабонервных), его длительной поддержкой (а вот это уже про читабельность, комментированность и т. п. у makefile), и удобством для каждого, кто код внедряет. Люди вон вообще делают отдельные форки для универов. где от авторефератов отказываются: https://github.com/Olenand/ITMO-Phd-LaTeX-Dissertation-Template

i3v commented 5 years ago

@rstm-sf

@i3v Это, честно говоря, меня пугает)

Ну, по-моему это-то не самое страшное :) Вот такие вставки мне не нравятся больше.

Тут пишет дату сборки 2017-09-06

Если я правильно понимаю о чём речь - это дата сборки установщика (менеджера пакетов). А сам тот пакет таки версии 3.82.90 .

Думаю, надо cygwin шанс.

Мне в msys2 нравится Automatic path mangling , без него - это тогда tex надо внутри cygwin ставить.

Вы, кстати, используете Windows shell?

Я хочу запускать разные сценарии сборки хоткеями из TexStudio (задав пару пользовательских команд) и иметь кликабельные сообщения об ошибках в панели лога. А оно, как я понимаю, фактически отправляет в shell, да. Не знаю пока получится вообще такое или нет.

К слову, в альтернативной версии Makefile одинарных ковычек нет (есть, но их можно удалить без последствий).

Да, там возникает много моментов, которые можно было переделать для более лучшей поддержки Windows. (То же удаление файлов можно было бы делать всего за одну команду, предварительно собрав всё в один большой страшный regexp.) Но сама необходимость таких ограничений - это уже как-то подозрительно.

Под свой диссер готовите заготовку

Под свой. Он написан, тьфу-тьфу-тьфу.

Нужно сохранить какой-то баланс между удобством входа новичков в работу с шаблоном (тут скорее к изменениям в структуре ибо makefile уже не для слабонервных), его длительной поддержкой (а вот это уже про читабельность, комментированность и т. п. у makefile), и удобством для каждого, кто код внедряет.

Я не очень вижу тут противоречий между целями, кроме того что "плохо сильно менять существующую структуру". Ну, я только для презентации предлагаю менять, а там и нет никакой структуры. У кого она уже готова - просто оставит существующий файл свой.

matsievskiysv commented 5 years ago

По итогам обсуждений #240, #244 и #243 у меня примерно сложилось представление о требованиях к шаблону. Сейчас попробую подправить Makefile.

Lenchik commented 5 years ago

я чделвл отдельный бранч, на всякий случай.

Сейчас попробую подправить Makefile.

Побольше маленьких коммитов, по каждой идейной правке, в PR, чтобы если что cherry pick делать бы проще было. В свете https://stackoverflow.com/q/10523849/6028129 на переименовывание файлов тоже отдельный коммит, где будет только переименование записано

matsievskiysv commented 5 years ago

247 примерный Makefile, который, на мой взгляд, выглядит почище

matsievskiysv commented 5 years ago

К вопросу о едином Makefile. В общем-то единственная функция дополнительных Makefile на данный момент - очистка подпапок от мусора. Если их удалять - надо продумать этот момент. Простым решением будет использовать find. Например:

find . \( \
          -iname "*.pdf" \
          -o -iname "*.log" \
\) -delete
Lenchik commented 5 years ago

мусор откуда там будет браться? latexmk из корня мусор папочный за собой, вроде, чистит командой -c или -C.

matsievskiysv commented 5 years ago

@Lenchik Связанный с TeX - да. Но в Makefile ещё куча рецептов по backup файлам и прочему.

rstm-sf commented 5 years ago

@seregaxvm @i3v, спасибо за ответ!

matsievskiysv commented 5 years ago

Это теперь можно закрыть. #247

sychugin commented 5 years ago

Ребят! Вот вы ищите компромиссное решение для компиляции в Windows; как я понимаю, чтобы пользователи Windows аналогично могли пользоваться командами make smth. Правильно? Несколько раз прозвучали предложения использовать WSL. Какие аргументы есть против него?

Я установил WSL (Ubuntu 18.04) из MS store. Поставил в ней apt-get'ом TeXLive full и шрифты (по имеющейся уже тут инструкции для Ubuntu), утилиту make, и теперь спокойно собираю все с помощью имеющегося Makefile. Используя лишь префикс в cmd или PowerShell - wsl. Например: wsl make dissertation или wsl latexmk -pdf -pdflatex="xelatex %O %S" dissertation или еще проще - Shift+ПКМ -> "Открыть здесь оболочку Linux" и собирать как в Linux...

Вопрос: почему бы просто не добавить минихэлп для win-юзеров "Как поставить wsl"?

matsievskiysv commented 5 years ago

@sychugin

Вопрос: почему бы просто не добавить минихэлп для win-юзеров "Как поставить wsl"?

Было бы не плохо. Сделаете PR?

sychugin commented 5 years ago

@seregaxvm

Было бы не плохо. Сделаете PR?

Я тут новичок на GitHub..) Что Вы имеете в виду? 😳 Написать этот хэлп в отдельной ветке и оформить PR, чтобы его добавили? Или просто завести обсуждение такого варианта развития событий?

Lenchik commented 5 years ago

Можно в wiki (https://github.com/AndreyAkinshin/Russian-Phd-LaTeX-Dissertation-Template/wiki) даже написать инструкцию, а в readme потом перенесём. Только не забудьте там уточнить. что этот способ для Windows 10 (может даже начиная с какой-то версии).

matsievskiysv commented 5 years ago

Написать этот хэлп в отдельной ветке и оформить PR, чтобы его добавили?

Да