
CMD窗口啟動和批處理文件中啟動的程序運行環境有不同最近在弄一個新研發平臺的分布式編譯,使用mips-gcc交叉編譯,在winxp,win2003和win7上使用cygwin。分布式編譯使用的是distcc,版本為distcc-2.18.3 (for cygwin)。distcc分布式編譯簡單介紹一下:該分布式編譯使用的方式是client+server的方式,編譯時client可以同時向多個server發送編譯請求,server在本機編譯完成后,將obj文件回傳給client。client運行distcc.exe,server運行distccd.exe(監聽3632端口)。client編譯前需要指定server的ip,通過設置環境變量DIST_HOSTS告訴distcc。distcc.exe distccd.exe 都位于cygwin安裝目錄bin目錄下。我寫了一個bat文件,放到“C:documents and SettingsAll Users「開始」菜單程序啟動”目錄下,以便研發人員每次開機的時候可以自動運行distccd.exe服務程序。現在的問題是:開機后,distccd能正常啟動,但是接收到client發送過來的編譯請求時,找不到編譯器mips-elf-gcc.exe,而該編譯器位于cygwin安裝目錄的crosscompilerbin目錄下;但是如果在cmd.exe窗口里輸入如下兩句啟動的distccd,卻一切正常,>set PATH=C:cygwincrosscompilerbin;C:cygwinbin;%PATH%>distccd --daemon --allow 192.168.1.0/24還請各位大俠幫忙看看問題出在哪里?
nclick="copycode($('code0'));">復制代碼
- @echo off
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :: 檢測系統中是否有distccd在運行
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- set /a DistccdCount=0
- for /f delims= %%i in ('tasklist ^| findstr /i distccd.exe') do (set /a DistccdCount+=1)
- if not %DistccdCount%==0 (echo distccd is already running && goto eof)
- :: 先終止當前的distccd線程
- ::taskkill /F /IM distccd.exe
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :: 根據操作系統類型,查詢注冊表,尋找cygwin安裝目錄
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- set TheOs=
- if /i not %os%.==Windows_NT. goto UnknownSystemError
- :: 判斷系統版本
- for /f delims= %%i in ('ver ^| findstr /i 6.1') do (set TheOs=Win7 && goto Win7)
- for /f delims= %%i in ('ver ^| findstr /i 6.1') do (set TheOs=WinVista && goto WinVista)
- for /f delims= %%i in ('ver ^| findstr /i 5.0') do (set TheOs=Win2000 && goto Win2000)
- for /f delims= %%i in ('ver ^| findstr /i 5.1') do (set TheOs=WinXP && goto WinXP)
- for /f delims= %%i in ('ver ^| findstr /i 5.2') do (set TheOs=Win2003 && goto Win2003)
- :: 默認是XP
- set TheOs=WinXP && goto WinXP
- :Win7
- :WinVista
- echo Find Cygwin install path @%TheOs%
- for /f skip=2 tokens=1-3 %%a in ('reg query HKEY_LOCAL_MACHINESOFTWAREWow6432NodeCygnus SolutionsCygwinmounts v2/ /v native') do (
- set CYGWIN_HOME=%%c
- )
- if %CYGWIN_HOME%== (goto UnknowCygwinInstallPath) else (goto FindDistccd)
- :Win2000
- :WinXP
- echo Find Cygwin install path @%TheOs%
- for /f skip=4 tokens=1-3 %%a in ('reg query HKEY_LOCAL_MACHINESOFTWARECygnus SolutionsCygwinmounts v2/ /v native') do (
- set CYGWIN_HOME=%%c
- )
- if %CYGWIN_HOME%== (goto UnknowCygwinInstallPath) else (goto FindDistccd)
- :Win2003
- echo Find Cygwin install path @%TheOs%
- for /f skip=1 tokens=1-3 %%a in ('reg query HKEY_LOCAL_MACHINESOFTWARECygnus SolutionsCygwinmounts v2/ /v native') do (
- set CYGWIN_HOME=%%c
- )
- if %CYGWIN_HOME%== (goto UnknowCygwinInstallPath) else (goto FindDistccd)
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :: 啟動distccd
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :FindDistccd
- echo cygwin install path is: %CYGWIN_HOME%
- :: 默認distccd位于cygwin安裝目錄bin下
- set DISTCCD_PATH=%CYGWIN_HOME%bin
- :: 檢測distccd是否存在
- if not exist %DISTCCD_PATH%distccd.exe (goto NoDistccd)
- :: 環境變量中加入distccd以及cygwin的bin目錄
- set PATH=%CYGWIN_HOME%usrbin;%CYGWIN_HOME%bin;%PATH%
- :: 啟動distccd
- :: 這里有個沒有解決的問題,在cmd窗口中,只要設置正確的PATH,可以直接輸入distccd命令啟動,但是在bat文件中卻有問題
- :: 通過bash雖然能啟動distccd,但是distccd必須放到cygwin安裝目錄的bin下。具體原因未知
- echo start distccd...
- :: 增加mips-elf-gcc.exe的目錄,希望distccd執行的時候能找到該編譯器
- set PATH=%CYGWIN_HOME%crosscompilerbin;%PATH%
- ::%DISTCCD_PATH%distccd.exe --daemon --allow 192.168.1.0/24 --verbose --log-file 1.txt --pid-file 1.pid
- ::bash --noprofile -c distccd --daemon --allow 192.168.1.0/24 --verbose --log-file 1.txt --pid-file 1.pid
- bash --noprofile -c distccd --daemon --allow 192.168.1.0/24
- if errorlevel 0 (goto Success) else (goto Error)
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :: 以下為各種錯誤處理
- ::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- :UnknownSystemError
- echo Unknown OS!!!
- goto Error
- :UnknowCygwinInstallPath
- echo Cannot find cygwin install path!!!
- goto Error
- :NoDistccd
- echo Cannot find distccd @%DISTCCD_PATH%
- goto Error
- :Success
- echo distccd start successful...
- :: 顯示三秒后,直接退出,sleep是cygwin的bin下的工具
- sleep 3
- goto eof
- :Error
- echo distccd start failed...
- pause
- goto eof
- :eof

