Gnuwin32, makefile, mkdir -p?


0

Я встановив основні утиліти gnuwin32, make і gettext:

http://gnuwin32.sourceforge.net/packages/coreutils.htm
http://gnuwin32.sourceforge.net/packages/make.htm
http://gnuwin32.sourceforge.net/packages/gettext.htm

У мене є makefile, який виглядає так:

.PHONY: po mo

po:
    xgettext -Lpython --output=po/messages.pot vocelab/app.py vocelab/app.kv
    msgmerge --update --no-fuzzy-matching --backup=off po/en.po po/messages.pot
    msgmerge --update --no-fuzzy-matching --backup=off po/hu.po po/messages.pot

mo:
    mkdir -p "data/locales/en/LC_MESSAGES"
    mkdir -p "data/locales/hu/LC_MESSAGES"
    msgfmt -c -o data/locales/en/LC_MESSAGES/langapp.mo po/en.po
    msgfmt -c -o data/locales/hu/LC_MESSAGES/langapp.mo po/hu.po

Проблема полягає в тому, що команда mkdir - це одна вбудована cmd.exe. Навіть незважаючи на те, що у мене на шляху "c: \ program Files (x86) \ GnuWin32 \ bin"), вбудована команда має перевагу. Отже, коли я набираю "make mo", то я отримую цю помилку:

A subdirectory or file data/locales/en/LC_MESSAGES already exists.

Я міг би замінити mkdir на "c: \ Program Files (x86) \ GnuWin32 \ bin \ mkdir.exe" у makefile, але це не здається правильним. У іншій системі хтось може мати інше місце для gnuwin32.

Іншими словами: mkdir.exe є, але він суперечить вбудованій команді cmd.exe. Іншим варіантом буде використання іншої оболонки для Windows. Але для встановлення підсистеми linux для Windows або встановлення cygwin знадобиться гігабайт дискового простору. На відміну від цього, каталог gnu win32, необхідний для цього проекту, становить лише 40 Мб.

Я знайшов рішення, яке насправді працює, але воно некрасиве і не портативне:

GNUWIN32=c:/Program Files (x86)/GnuWin32\bin

.PHONY: po mo

po:
    "$(GNUWIN32)/xgettext" -Lpython --output=po/messages.pot vocelab/app.py vocelab/app.kv
    "$(GNUWIN32)/msgmerge" --update --no-fuzzy-matching --backup=off po/en.po po/messages.pot
    "$(GNUWIN32)/msgmerge" --update --no-fuzzy-matching --backup=off po/hu.po po/messages.pot

mo:
    "$(GNUWIN32)/mkdir" -p "data/locales/en/LC_MESSAGES"
    "$(GNUWIN32)/mkdir" -p "data/locales/hu/LC_MESSAGES"
    "$(GNUWIN32)/msgfmt" -c -o data/locales/en/LC_MESSAGES/langapp.mo po/en.po
    "$(GNUWIN32)/msgfmt" -c -o data/locales/hu/LC_MESSAGES/langapp.mo po/hu.po

Відповіді:


2

CMD mkdirбільше не підтримує -pкомутатор у системах Windows 8+. Ось чому ви отримуєте цю помилку.

Як я вже говорив у коментарі, не сподівайтеся, що один makefile / скрипт працюватиме як у Windows, так і в Linux, як це робиться. Зазвичай вам потрібно буде надати різні версії, по одній для кожної ОС для складніших файлів.

Щоб подолати помилку за допомогою CMD mkdir(лише для Windows) :

if not exist "data/locales/en/LC_MESSAGES" mkdir "data/locales/en/LC_MESSAGES"

або для коротшої команди

en = "data/locales/en/LC_MESSAGES"
hu = "data/locales/hu/LC_MESSAGES"

if not exist $en mkdir $en
if not exist $hu mkdir $hu

Щоб використовувати гнувін mkdir

Використовуйте подвійні лапки на mkdir. Це змусить Windows шукати виконуваний файл mkdirзамість команди CMD.

"mkdir" -p "data/locales/en/LC_MESSAGES"

Оновлення: протестовано подвійну цитату в Kali Linux, Linux Mint, Windows 7 та працює над усіма ними. Просто переконайтеся, що ваш gnuwin\binзнаходиться у вашому системному шляху


Я хочу використовувати mkdir gnuwin32. Я думаю, це було чітко в питанні. Цей mkdir.exe підтримує перемикач -p. Конструкція if, яку ви запропонували, не працює на Linux, не є портативною.
nagylzs

@nagylzs Якщо ви хочете явно використовувати cygwin, то портативність - це проблема, оскільки не на кожному комп’ютері встановлено cygwin, або навіть якщо він є, знаходитись там, де вказано сценарій ... Так, це буде працювати у Windows але не Linux. Але тому для кожної ОС ви надаєте різні параметри. Я використовую сценарії та файли для обох ОС, і кожен раз, коли я створюю для Windows і один для Linux. Я знову погляну на це завтра і побачу, що я можу зробити
Jimmy_A

@nagylzs Оновлена ​​відповідь. Подумайте, що вирішує вашу проблему
Jimmy_A
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.