ckotinko (ckotinko) wrote,
ckotinko
ckotinko

Битва с qmake


В общем, делаю я тут софтину которая собирается 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 вообще хорошая штука но как же он выносит мозг своими глюками.

* * *

Еще кстати меня одна вещь напрягает: вот есть у нас log2stas и его давно не слышно-не видно. Не случилось бы с ним чего плохого.
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 9 comments