В общем, делаю я тут софтину которая собирается qmake и понадобилось мне в ходе сборки выкачивать и раззиповывать данные с интернета на винде и на линуксе. Казалось бы, где может быть подвох?
Оказывается везде. Во-первых, на винде нет wget и unzip. Нужно делать аналоги. Во-вторых, touch не работает там, надо заменять. В-третьих, даже сраный QMAKE_MKDIR не работает, сука блядь если каталог уже создан. system всегда возвращает "успешно" несмотря на ошибки. и т.д. и т.п.
common.pri:
win32 { defineReplace(makedir) { return(cscript.exe $$shell_path($$PWD/../core/windows_mkdir.vbs) $$shell_path($$1)) } defineReplace(tag) { return("ECHO foo >" $$shell_path($$1)) } defineReplace(unzip) { return(cscript.exe $$shell_path($$PWD/../core/windows_unzip.vbs) $$shell_path($$1) $$shell_path($$2)) } defineReplace(wget) { return(cscript.exe $$shell_path($$PWD/../core/windows_wget.vbs) $$1 $$shell_path($$2)) } } else { defineReplace(makedir) { return("mkdir -p" $$shell_path($$1)) } defineReplace(tag) { return("touch" $$shell_path($$1)) } defineReplace(unzip) { return("unzip -q " $$shell_path($$1) " -d " $$shell_path($$2) ) } defineReplace(wget) { return(wget -q -c $$1 -O $$shell_path($$2)) } }
пример использования:
download.pro:
include(common.pri) include(vars.pri) TARGET = download_data TEMPLATE = aux # # this plugin requires manuel bastioni labs files to generate mob models # #=================================== dirs.target = .makedirs dirs.commands = $$makedir($$MBLABS_DIR) && $$makedir($$MBLABS_TMP) && $$tag($$dirs.target) QMAKE_EXTRA_TARGETS += dirs #=================================== download_mbl.target = .mbl_get download_mbl.commands = $$wget($$MBLABS_URL, $$MBLABS_ZIP) && $$tag($$download_mbl.target) QMAKE_EXTRA_TARGETS += download_mbl #=================================== unzip_mbl.target = .mbl_unzip unzip_mbl.depends = .makedirs .mbl_get unzip_mbl.commands = $$unzip($$MBLABS_ZIP, $$MBLABS_TMP) && $$tag($$unzip_mbl.target) QMAKE_EXTRA_TARGETS += unzip_mbl PRE_TARGETDEPS += $$unzip_mbl.target #===================================
windows_mkdir.vbs:
Dim objArgs Set objArgs = WScript.Arguments If objArgs.Count <> 1 Then WScript.Quit 1 End If PATH = objArgs.Item(0) Set fso = CreateObject("Scripting.FileSystemObject") BuildFullPath PATH Sub BuildFullPath(ByVal FullPath) If Not fso.FolderExists(FullPath) Then BuildFullPath fso.GetParentFolderName(FullPath) fso.CreateFolder FullPath End If End Sub
windows_unzip.vbs:
Dim objArgs Set objArgs = WScript.Arguments If objArgs.Count <> 2 Then WScript.Quit 1 End If ZipFile = objArgs.Item(0) ExtractTo = objArgs.Item(1) 'If the extraction location does not exist create it. Set fso = CreateObject("Scripting.FileSystemObject") If NOT fso.FolderExists(ExtractTo) Then fso.CreateFolder(ExtractTo) End If 'Extract the contants of the zip file. set objShell = CreateObject("Shell.Application") set FilesInZip=objShell.NameSpace(ZipFile).items objShell.NameSpace(ExtractTo).CopyHere(FilesInZip) Set fso = Nothing Set objShell = Nothing
windows_wget.vbs:
Dim objArgs Set objArgs = WScript.Arguments If objArgs.Count <> 2 Then WScript.Quit 1 End If strFileURL=objArgs.Item(0) strLocation=objArgs.Item(1) Set objXMLHTTP=CreateObject("MSXML2.XMLHTTP") objXMLHTTP.open "GET", strFileURL, false objXMLHTTP.send If objXMLHTTP.Status = 200 Then Set objADOStream = CreateObject("ADODB.Stream") objADOStream.Open objADOStream.Type = 1 'adTypeBinary objADOStream.Write objXMLHTTP.ResponseBody objADOStream.Position = 0 'Set the stream position to the start Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.Fileexists(strLocation) Then objFSO.DeleteFile strHDLocation objADOStream.SaveToFile strLocation objADOStream.Close Set objADOStream = Nothing Set objXMLHTTP = Nothing Set objFSO = Nothing WScript.Quit 0 End if Set objXMLHTTP = Nothing WScript.Quit 1
Сука, я пять часов бился с этой хероборой. Черти которые делают Qt вообще не заморачиваются тестированием qmake. Ну не работает там что-то и поебать. qmake вообще хорошая штука но как же он выносит мозг своими глюками.
* * *
Еще кстати меня одна вещь напрягает: вот есть у нас