2012-01-28 84 views
2

我想用MinGW编译ATLAS。我开始解决问题,但现在我陷入了一个简单的问题:ATLAS的Makefile尝试使用随MinGW提供的uname.exe来探测操作系统。MinGW system()系统调用和%PATH%行为

如果我运行MinGW shell(sh.exe),我可以调用uname。如果我打开一个Windows命令提示符,我可以调用uname(所以%PATH%变量和$ PATH变量设置正确)。

该代码在内部调用类似系统(“uname -s> \ tempfilneame & 2> 1”)。主要问题是(正如我分析FileMon的输出)应用程序(sh.exe)创建一个cmd.exe进程,并执行我的命令,但未找到uname。如果我添加系统(“d:/.../bin/uname-s> \ tempfilename & 2> 1”)到代码一切工作正常。所以它应该是一个PATH变量的问题。如果它不是必要的,我不会修改代码中的每一个调用。问题是:什么是cmd.exe进程开始的特殊情况,所以它不能识别uname,我该如何解决这个问题。

回答

2

Msys的目的是提供一个最小的准“* nix”(即非POSIX)Bourne Shell(一个“* nix”命令行解释器),在其中执行程序,命令和shell脚本在“* nix”系统上(参考http://www.mingw.org/)。如果出于某种原因希望从MS Windows命令行解释器(cmd.exe)运行MinGW/bin Msys/1.0/bin可执行文件,则MS Windows环境%PATH%变量必须包含这两个路径“bin”子目录 - 例如“。; C:\ MinGW \ bin; C:\ MinGW \ msys \ 1.0 \ bin;%PATH%”。

以下信息参考严格使用MinGW提供的GCC 4.6.2编译器套件从msys.bat调用的Msys sh.exe中构建ATLAS库。

请确保您的Msys $ PATH环境变量包含“。:MinGW和Msys bin目录的路径” - 即“。:/ C/MinGW/bin:/C/MinGW/msys/1.0/bin: $ PATH“,如果这就是你安装MinGW和Msys的地方(这应该在发生sh登录时由/ etc/profile脚本完成,例如\ msys \ 1.0 \ msys.bat文件)。

以下更改必须到调用一个外壳命令或可执行使用系统(不是“使”其他)()功能的任何ATLAS程序语句进行:

1)改变“./executable”到“ 。\ \ executable“或”executable“,因为MS Windows cmd.exe shell(或更准确地说,称为MS Windows系统库例程)将”.execable“解释为可执行文件'。'。与一个命令选项'/可执行',因此错误消息:''。'不被识别为内部或外部命令,可操作程序或批处理文件。“请确保使用“-v 2”调用ATLAS/configure以查找任何有问题的系统()调用 - 只有少数几个!

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视窗的cmd.exe不使用接受化合物命令语句的“;”分隔符与其他“* nix”shell或“make”一样。

3)在传递给system()调用的命令的sprintf()语句中,用双引号替换分隔字符串格式说明符的任何单引号;特别是在ATLAS/CONFIG/src/config.c文件的SpewItForth函数中。例如,将“...”%s'...“更改为”... \“%s \”...“。对于使用system()调用调用的“make”命令,这不是必需的。由于MS Windows cmd.exe shell期望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 /调/ 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] = '\"'; 

line 68 from:

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 /调/ SYSINFO/emit_buildinfo.c文件,更改:

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

到:

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

因为MS Windows cmd.exe“date”命令将提示“Enter the new date: (mm-dd-yy)“,然后等待永远不会输入的响应。

虽然我发到每个受影响的文件中的上述变化,坚持基本的软件工程和配置管理原则将决定重复的代码整合到包裹着某种形式的“定义#如果(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在具有双Intel Xeon(Pentium 4,MMX,SSE和SSE2 [L1缓存8千字节,L2缓存256 KBytes],但没有超线程技术)的11年历史Dell Workstation 530上1.5 GHz处理器,400 MHz FSB和运行Windows 2000 Professional SP4的1024 MB RDRAM。

上述修改并不全面,但应该让您更进一步。我打算记录ATLAS 3.8.4发行版的所有更改,并在验证我的调整配置并使用LAPACK-3.4.0完成共享库构建后,将其发布到http://sourceforge.net/projects/math-atlas/forums/上的“ATLAS on Windows”论坛上。

我希望这些信息对您和其他人尝试使用MinGW和而不是 Cygwin在Windows平台上尝试构建ATLAS有帮助。

特别注意:

呼叫至系统()与引导输出到从呼叫获得使用tmpnam临时文件名(命令)将导致在当前驱动器的根目录下被创建的临时文件。临时文件名以'\ \'为前缀,后者在MinGW/include/stdio.h中定义(请参阅P_tmpdir)。

重要附录:

(A)确保指定源时使用全路径名,并建立使用“-s”和“-b”命令选项ATLAS /配置目录。在我的情况下,以下sh脚本显示了如何调用ATLAS /从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,因为如果source和build目录处于同一级别,那么文件../../CONFIG/error.txt不可能被ATLAS/bin/atlas_install.c找到。 (C)不要犯我在假设'-m ####'配置选项隐含地创建'-D c DPentiumCPS = ####'配置标志时所犯的错误。您可能需要显式传递“ATLAS安装指南”中第3.4节“更改ATLAS执行时序的方式”中所述的'-D c -DPentiumCPS = ####'或'-D c -DWALL'在这里看到:

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

通过不使用周期精确的壁定时器,从理智试验的结果,如那些来自“xsslvtst.exe -n 167 -r 83 -O 2 CR 2 -U 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,通过非常,非常,非常小的非零v与算术除法可能导致ALUE。在使用'-D c -DWALL'重建ATLAS之后,这些MFLOP结果​​(并且毫无疑问,其他定时措施)得到纠正。

(d)线ATLAS的35/CONFIG/SRC/probe_OS.c需求MinGW的检查,因为这:

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

并插入 “IRunArchInfo_linux:xarchinfo_linux” 之后以下在ATLAS/CONFIG块/ SRC /生成文件(只是剪切,粘贴和编辑Makefile中的IRunArchInfo_linux块):

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,用于此最新版本的MinGW32 gcc编译器套件。与编辑ATLAS开发人员的atlconf.txt文件(请参阅“ATLAS安装指南”的第3.2节)相比,使用configure标志覆盖编译器选择以及更改/附加编译标志可能更受欢迎;但我很不耐烦。(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)