Системный вызов MinGW system () и поведение% PATH% - PullRequest
2 голосов
/ 28 января 2012

Я пытаюсь скомпилировать ATLAS с MinGW.Я начал решать проблемы, но теперь я застрял на простом: Makefile из ATLAS пытается проверить ОС с помощью uname.exe, который поставляется с MinGW.

Если я запускаю оболочку MinGW (sh.Отлично) Я могу назвать uname.Если я открою командную строку Windows, я смогу вызвать uname (поэтому переменная% PATH% и переменная $ PATH установлены правильно).

Код внутренне вызывает что-то вроде system ("uname -s> \ tempfilneame& 2> 1" ).Основная проблема заключается в том, что (как я проанализировал вывод FileMon), приложение (sh.exe) создает процесс cmd.exe, а затем выполняет мою команду, но uname не найден.Если я добавляю систему («d: /.../ bin / uname -s> \ tempfilename & 2> 1»), все работает нормально.Так что это должно быть проблемой с переменными PATH.Если бы это не было необходимо, я бы не изменял каждый вызов в коде.Вопрос в том, что особенного в запущенном процессе cmd.exe, поэтому он не распознает uname, и как я могу решить эту проблему.

1 Ответ

2 голосов
/ 25 марта 2012

Цель Msys - предоставить минимальный квази - "* nix" (т. Е. Не POSIX) Bourne Shell (интерпретатор командной строки "* nix"), в котором можно выполнять программы, команды и сценарии оболочки, как будто на система "* nix" (см. http://www.mingw.org/). Если по какой-либо причине желательно запускать исполняемые файлы MinGW / bin и Msys / 1.0 / bin из интерпретатора командной строки MS Windows (cmd .exe), переменная% PATH% среды MS Windows должна содержать пути к этим двум подкаталогам bin, таким как ".; C: \ MinGW \ bin; C: \ MinGW \ msys \ 1.0 \ bin;% PATH %».

Следующая информация относится строго к созданию библиотек ATLAS из Msys sh.exe, вызываемого с помощью msys.bat с использованием набора компиляторов GCC 4.6.2, предоставляемого MinGW.

Убедитесь, что переменная среды Msys $ PATH содержит ".: Путь к каталогам bin MinGW и Msys" - т.е. ".: / C / MinGW / bin: /C/MinGW/msys/1.0/bin: $ PATH ", если вы установили MinGW и Msys (это должно быть выполнено сценарием / etc / profile при входе в систему sh, например, файлом \ msys \ 1.0 \ msys.bat).

Следующие изменения должны быть внесены в любой оператор программы ATLAS, который вызывает команду оболочки или исполняемый файл (кроме «make») с использованием функции system ():

1) Измените «./executable» на «. \\ исполняемый файл» или «исполняемый файл», поскольку оболочка cmd.exe в MS Windows (или, вернее, вызываемые процедуры системной библиотеки MS Windows) интерпретирует «./executable» как исполняемый файл "." с параметром команды «/ исполняемый файл», таким образом, сообщение об ошибке: «». не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. " Обязательно вызовите ATLAS / configure с помощью «-v 2», чтобы найти любые вызывающие вызовы system () - их всего несколько !!!

ATLAS/bin/atlas_install.c
ATLAS/CONFIG/src/atlbench.c
ATLAS/CONFIG/src/config.c
ATLAS/tune/blas/gemm/userindex.c
ATLAS/tune/blas/ger/r1search.c
ATLAS/tune/sysinfo/emit_buildinfo.c

2) Измените «команда; команда» на «команда && команда», так как MS Windows cmd.exe не принимает составные операторы команды, использующие «;» разделитель, как в других оболочках "* nix" или "make".

3) Заменить любое вхождение одинарных кавычек на двойные кавычки, разделяющие спецификаторы формата строки в операторах sprintf () для команд, передаваемых вызовам system (); особенно в функции SpewItForth файла ATLAS / CONFIG / src / config.c. Например, измените "... '% s' ..." на "... \"% s \ "...". Это не требуется для команд «make», вызываемых с помощью вызовов system (). Поскольку оболочка MS Windows cmd.exe ожидает завершения строки в конце CRLF, необходимо внести следующие изменения в файлы ATLAS / bin / atlas_install.c и ATLAS / tune / sysinfo / emit_buildinfo.c.

В ATLAS / bin / atlas_install.c, строка 133 из:

    if ( (sp == NULL) || (str[0] == '\0') || (str[0] == '\n') )

до:

    if ( (sp == NULL) || (str[0] == '\0') || (str[0] == '\r') || (str[0] == '\n') )

строка 165, от:

    else if (ln[0] == '\0' || ln[0] == '\n') ch=def;

до:

    else if (ln[0] == '\0' || ln[0] == '\r' || ln[0] == '\n') ch=def;

строка 175, от:

    else if (ln[0] == '\0' || ln[0] == '\n') ch=def;

до:

    else if (ln[0] == '\0' || ln[0] == '\r' || ln[0] == '\n') ch=def;

В ATLAS / tune / sysinfo / emit_buildinfo.c, строка 66 из:

    for (i=0; ln[i]; i++) if (ln[i] == '"' || ln[i] == '`') ln[i] = '\'';

до:

    for (i=0; ln[i]; i++) if (ln[i] == '"' || ln[i] == '`') ln[i] = '\"';

строка 68 от:

    for (i--; i >= 0 && (ln[i] == ' ' || ln[i] == '\n' || ln[i] == '\t'); i--);

до:

    for (i--; i >= 0 && (ln[i] == ' ' || ln[i] == '\r' || ln[i] == '\n' || ln[i] == '\t'); i--);

Также в файле ATLAS / tune / sysinfo / emit_buildinfo.c измените:

  if (CommandOneLine("date",DATE)) strcpy(DATE, "UNKNOWN");

до:

  if (CommandOneLine("date /t",DATE)) strcpy(DATE, "UNKNOWN");

, так как команда MS Windows cmd.exe «date» предложит «Введите новую дату: (mm-dd-yy)» и дождитесь ответа, который никогда не будет введен.

Несмотря на то, что я внес вышеупомянутые изменения в каждый затронутый файл, соблюдение базовых принципов разработки программного обеспечения и управления конфигурацией потребовало бы объединения дублирующегося кода в отдельные процедуры, заключенные в некоторую форму «#iffined (ATL_OS_WinNT) && определено (__ MINGW32__)» директива по обработке, предотвращающая негативное влияние изменений на установку ATLAS в других операционных системах "* nix". В связи с этим я не рекомендовал бы использовать подход «патча» для включения специфических изменений MinGW32 в дистрибутив ATLAS, но включал необходимые изменения в последнюю версию разработки ATLAS. Конечно, «исправление» может быть единственной альтернативой исправлению неподдерживаемых выпусков ATLAS.

За последние несколько дней мне удалось создать настроенные статические библиотеки ATLAS 3.8.4 с MinGW, Msys и набором компиляторов GCC 4.6.2, загруженным из:

http://sourceforge.net/projects/mingw/files/

и устанавливается вместе с mingw-get-inst-20111118.exe на 11-летнюю рабочую станцию ​​Dell 530 с двумя процессорами Intel Xeon (Pentium 4 с MMX, SSE и SSE2 [кэш-память первого уровня 8 КБ, кэш-память второго уровня 256 КБ], но без Hyperthreading) 1.5Процессоры ГГц, 400 МГц FSB и 1024 МБ RDRAM под управлением Windows 2000 Professional SP4.

Вышеуказанные модификации не являются исчерпывающими, но помогут вам продвинуться дальше.Я планирую задокументировать все свои изменения в дистрибутиве ATLAS 3.8.4 и опубликовать его на форуме «ATLAS в Windows» по адресу http://sourceforge.net/projects/math-atlas/forums/ после того, как я проверил свою настроенную конфигурацию и выполнил полную сборку общей библиотеки с использованием LAPACK3.4.0.

Надеюсь, эта информация будет полезна вам и другим, кто пытается построить ATLAS с MinGW и без Cygwin, на платформе Windows.

СПЕЦИАЛЬНОЕ ПРИМЕЧАНИЕ:

Вызовы system () с командами, направляющими вывод во временное имя файла, полученное в результате обращения к tmpnam (), приведут к созданию временных файлов в корневом каталоге текущего диска.Временные имена файлов имеют префикс «\\», который определяется в MinGW / include / stdio.h (см. P_tmpdir).

ВАЖНОЕ ДОБАВЛЕНИЕ:

(A) Обязательно используйтеполные пути при указании каталогов источника и сборки с использованием параметров команды '-s' и '-b' для ATLAS / configure.В моем случае следующий скрипт sh показывает, как я вызывал ATLAS / configure из ATLAS_build:

#!/bin/sh

SRCDIR=/g/Progs/MinGW/msys/1.0/home/GaryD/temp/ATLAS
BLDDIR=/g/Progs/MinGW/msys/1.0/home/GaryD/temp/ATLAS_build
LAPACK=/g/Progs/MinGW/lib/gcc/mingw32/4.6.2/liblapack.dll.a

CC=gcc
C_DEFS="-D c -DL2SIZE=262144"  # Not used, set using -f 256
F_DEFS="-D f ''"               # Not used, let configure set these
C_FLGS="--cc=$CC --with-netlib-lapack=$LAPACK"
D_FLGS="-d s $SRCDIR -d b $BLDDIR"
A_FLGS="-O 8 -s 1 -A 20 -V 8 -b 32 -f 256 -t 2 -m 1495"
S_FLGS="-Si bozol1 1 -Si archdef 0 -Si cputhrchk 0"

$SRCDIR/configure $C_FLGS -v 2 $D_FLGS $A_FLGS $S_FLGS

(B) Я считаю, что предпочтительным каталогом сборки считается подкаталог в исходном каталоге ATLAS, такой какATLAS / ATLAS_build, так как файл ../../CONFIG/error.txt не может быть найден ATLAS / bin / atlas_install.c, если исходный каталог и каталог сборки находятся на одном уровне.

(C) Не делайте ошибку, которую я сделал, предполагая, что опция конфигурации '-m ####' неявно создает флаг конфигурации '-D c DPentiumCPS = ####'.Вам может понадобиться явно передать '-D c -DPentiumCPS = ####' или '-D c -DWALL', как описано в разделе 3.4, «Изменение способа синхронизации времени в ATLAS», «Руководства по установке ATLAS», которое можетможно посмотреть здесь:

http://math -atlas.sourceforge.net / atlas_install / atlas_install.html # SECTION00044000000000000000

Если не использовать точный цикл настенного таймера, результатыиз проверок работоспособности, таких как "xsslvtst.exe -n 167 -r 83 -O 2 cr -U 2 ul", выглядел следующим образом:

    ORD  UPLO       N    NRHS     lda     ldb       TIME     MFLOP        RESID
    ===  ====  ======  ======  ======  ======  =========  ========  ===========

      C     U     167      83     167     167      0.015    257.82  1.762022e-003
      C     L     167      83     167     167      0.016    241.70  1.870298e-003
      R     U     167      83     167     167      0.000 2229332063710638100.00  1.870298e-003
      R     L     167      83     167     167      0.000 2229332063710638100.00  1.762022e-003

    4 TESTS RUN, ALL PASSED.

Каждый вызов теста давал разные ложные значения дляMFLOP, возможно, в результате арифметического деления на очень, очень, очень маленькое ненулевое значение.После перестройки ATLAS с использованием -D c -DWALL эти результаты MFLOP (и, без сомнения, другие временные меры) были исправлены.

(D) Строка 35 ATLAS / CONFIG / src / probe_OS.c нуждается в проверкедля MinGW как это:

else if(strstr(ln, "WIN") || strstr(ln, "MINGW"))

и вставьте следующее после блока «IRunArchInfo_linux: xarchinfo_linux» в файле ATLAS / CONFIG / src / Makefile (просто вырезайте, вставляйте и редактируйте блок IRunArchInfo_linux в файле Makefile):

IRunArchInfo_winnt: xarchinfo_x86
    - rm -f config0.out
    $(MAKE) $(atlrun) atldir=$(mydir) exe=xarchinfo_x86 args="$(args)" \
            redir=config0.out
    - cat config0.out

(E) Возможно, потребуется изменить строки gcc-4 на gcc в файле ATLAS / CONFIG / src / atlconf.txt, поскольку исполняемый файл MinGW gcc - это просто gcc.exe, а не gcc-4.exe для этой последней версии пакета компилятора gcc MinGW32.Использование флагов конфигурации для переопределения выбора компилятора и изменения / добавления флагов компиляции, вероятно, предпочтительнее, чем редактирование файла atlconf.txt (см. Раздел 3.2 «Руководства по установке ATLAS») разработчиками ATLAS;но я был нетерпелив.

(F) Если вы укажете SSE2 с опцией '-V 8' ATLAS / configure, как для моей архитектуры, в файл ATLAS / include / atlas_asm.h необходимо внести следующее изменение.

Строка 133 от:

    #if defined(ATL_SSE1) && !defined(ATL_3DNow)

до:

    #if (defined(ATL_SSE1) || defined(ATL_SSE2)) && !defined(ATL_3DNow)

...