diff --git a/app/src/gambas3/.src/Packager/Package.module b/app/src/gambas3/.src/Packager/Package.module index 798d8fedc..c917aa48d 100644 --- a/app/src/gambas3/.src/Packager/Package.module +++ b/app/src/gambas3/.src/Packager/Package.module @@ -431,7 +431,7 @@ Private Sub FormatFileInList(sFile As String, Optional bDebian As Boolean) As St sFile = Replace(sFile, " ", "[!#-~.\"!]") Else sFile = Chr$(34) & Replace(sFile, Chr$(34), "\\\"") & Chr$(34) - Endif + Endif Endif Return sFile @@ -647,6 +647,8 @@ Private Sub MakeSupportPackage(sSys As String) Dim sSupport As String Dim aPackage As String[] + 'slackware doesn't use support packages + If sSys = "slackware" Then Return If $sSupportPackage = "gb.gui" Then @@ -687,7 +689,8 @@ MAKE_PACKAGE: MakeDebSupportPackage(sSys, sSupport, aPackage) Case "slackware" - MakeTgzSupportPackage(sSys, sSupport, aPackage) + 'we shouldn't get here, but if we do, do nothing as not needed for slackware + 'MakeTgzSupportPackage(sSys, sSupport, aPackage) Case "archlinux" MakeArchSupportPackage(sSys, sSupport, aPackage) @@ -2022,7 +2025,15 @@ Private Sub MakeTgzPackage(sSys As String) PrintDesktopFile(hFile, "/usr/bin/" & $sName, "/usr/share/pixmaps/" & $sName & ".png") Close #hFile - + ' if we are creating a project with desktop icon/menu we need to run a doinst.sh in the package + ' to make sure the menu item appears without needing a restart of xwindows. + hFile = Open sBuildDir &/ "install" &/ "doinst.sh" For Create + Print #hFile, "if [ -x /usr/bin/update-desktop-database ]; then" + Print #hfile, " /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1" + Print #hFile, "fi" + Close #hFile + + Endif Endif @@ -2042,12 +2053,13 @@ Private Sub MakeTgzPackage(sSys As String) Close #hFile - ' 6. Dependencies + ' 6. Dependencies. only used by slapt-get. other tools, like installpkg don't use it. + ' gambas is packaged a a single package - gambas3 including everything. hFile = Open sBuildDir &/ "/install/slack-required" For Create - Print #hFile, "gambas"; System.Version; "-runtime >= "; MIN_VERSION - Print #hFile, "gambas"; System.Version; "-runtime < "; MAX_VERSION + Print #hFile, "gambas"; System.Version; " >= "; MIN_VERSION + Print #hFile, "gambas"; System.Version; " < "; MAX_VERSION If Project.Type <> Project.TYPE_COMPONENT Then @@ -2097,7 +2109,7 @@ Private Sub MakeTgzSupportPackage((sSys) As String, sSupport As String, aComp As Dim sTempPackage As String Dim sPackage As String Dim sPackageName As String - + Inc Application.Busy $sFormatSingle = "&1\n" diff --git a/app/src/gambas3/.src/Packager/Package.module.orig b/app/src/gambas3/.src/Packager/Package.module.orig new file mode 100644 index 000000000..798d8fedc --- /dev/null +++ b/app/src/gambas3/.src/Packager/Package.module.orig @@ -0,0 +1,2647 @@ +' Gambas module file + +Public Path As String +Public ChangeLog As String +Public Signature As String + +Private RPMBUILD_PROG As String +Private DKPG_PROG As String +Private TAR_1_13_PROG As String +Private AUTOCONF_PROG As String +Private AUTOMAKE_PROG As String +Private MAKEPKG_PROG As String +Private MAKESELF_PROG As String + +Private $sOutput As String +Private $bEnd As Boolean + +Private $sName As String ' Project name +Private $sVendor As String ' Vendor +Private $sVendorPrefix As String ' Vendor prefix +Private $sComponentName As String ' Project name with a vendor prefix +Private $sLibraryName As String ' Library name, with the version +Private $sUnsafePackageName As String ' Package name, i.e project name with prefix, but with possible forbidden characters inside +Private $sCategories As String ' Categories list +Private $sHome As String ' Home user directory +Private $sVersion As String +Private $sDescription As String +Private $sSavePath As String + +Private $sSupportPackage As String + +Private MIN_VERSION As String +Private Const MAX_VERSION As String = "3.99.0" + +Private $sFormatSingle As String +Private $sFormatMin As String +Private $sFormatMax As String +Private $sFormatMinMax As String +Private $sFormatEqual As String + +Private Const QT4_SUPPORT As String = "qt4" +Private QT4_SUPPORT_PACKAGES As String[] = ["gb.qt4:gb.gui", "gb.qt4:gb.gui.qt", "gb.qt4.opengl:gb.gui.opengl", "gb.qt4.webkit:gb.gui.qt.webkit"] +Private Const QT5_SUPPORT As String = "qt5" +Private QT5_SUPPORT_PACKAGES As String[] = ["gb.qt5:gb.gui", "gb.qt5:gb.gui.qt", "gb.qt5.opengl:gb.gui.opengl", "gb.qt5.webkit:gb.gui.qt.webkit"] +Private Const GTK_SUPPORT As String = "gtk" +Private GTK_SUPPORT_PACKAGES As String[] = ["gb.gtk:gb.gui", "gb.gtk.opengl:gb.gui.opengl"] +Private Const GTK3_SUPPORT As String = "gtk3" +Private GTK3_SUPPORT_PACKAGES As String[] = ["gb.gtk3:gb.gui"] ', "gb.gtk.opengl:gb.gui.opengl"] + +Private Const DEBIAN_STANDARD As String = "3.9.6" +Private Const DEBIAN_DEBHELPER_VERSION As String = "9" +Private DEBIAN_ICON_SIZES As Integer[] = [16, 22, 32, 48, 64, 128, 256, 512, 1024] + +Public Sub CheckProgram() + + 'IF $bChecked THEN RETURN + + '$bChecked = TRUE + + If Not Project.CheckProgram("dh_install") Then DKPG_PROG = "dh_install" + If Not Project.CheckProgram("rpmbuild") Then RPMBUILD_PROG = "rpmbuild" + If Not Project.CheckProgram("tar-1.13") Then + TAR_1_13_PROG = "tar-1.13" + Else If Not Project.CheckProgram("tar") Then + TAR_1_13_PROG = "tar" + Endif + If Not Project.CheckProgram("autoconf") Then AUTOCONF_PROG = "autoconf" + If Not Project.CheckProgram("automake") Then AUTOMAKE_PROG = "automake" + If Not Project.CheckProgram("makepkg") Then MAKEPKG_PROG = "makepkg" + If Not Project.CheckProgram("makeself") Then MAKESELF_PROG = "makeself" + +End + +Public Sub CheckSystem(sSys As String) As String + + Select Case sSys + + Case "mageia", "mandriva", "fedora", "suse" + If Not RPMBUILD_PROG Then Return Subst(("'&1' is missing."), "rpmbuild") + + Case "debian", "ubuntu" + If Not DKPG_PROG Then Return Subst(("'&1' is missing."), "debhelper") + + Case "slackware" + If Not TAR_1_13_PROG Then Return Subst(("'&1' is missing."), "tar-1.13") + + Case "autotools" + If Not AUTOCONF_PROG And If Not AUTOMAKE_PROG Then Return Subst(("'&1' and '&2' are missing."), "autoconf", "automake") + If Not AUTOCONF_PROG Then Return Subst(("'&1' is missing."), "autoconf") + If Not AUTOMAKE_PROG Then Return Subst(("'&1' is missing."), "automake") + + Case "archlinux" + If Not MAKEPKG_PROG Then Return Subst(("'&1' is missing."), "makepkg") + + Case "self" + If Not MAKESELF_PROG Then Return Subst(("'&1' is missing."), "makeself") + + Case Else + Return + + End Select + +End + +Private Sub ClearLog() + + FMakeInstall.ClearLog + +End + + +Private Sub AddLog(sText As String) + + FMakeInstall.AddLog(sText) + +End + +Private Sub RemoveEmptyLines(sText As String) As String + + Return Split(sText, "\n", "", True).Join("\n") + +End + + +Private Sub GetShortDesc(sText As String, Optional iMax As Integer) As String + + Dim iPos As Integer + + iPos = InStr(sText, ". ") + If iPos = 0 Then iPos = Len(sText) + 1 + sText = Trim(Replace(Left(sText, iPos), "\n", " ")) + + If iMax And If Len(sText) > iMax Then + sText = Left(sText, iMax - 3) & "..." + Endif + + Return sText + +End + +Private Sub FormatDesc(sText As String, Optional iMax As Integer) As String[] + + Dim aLine As New String[] + Dim iPos As Integer + Dim I As Integer + Dim sLine As String + Dim sCar As String + + If iMax = 0 Then Return Split(sText, "\n") + + aLine.Add("") + + While sText + + sCar = String.Left(sText) + sText = String.Mid$(sText, 2) + + If sCar = "\n" Then + aLine.Add("") + Continue + Endif + + aLine[aLine.Max] &= sCar + + sLine = aLine[aLine.Max] + If String.Len(sLine) > iMax Then + For I = Len(sLine) - 1 DownTo 1 + iPos = InStr(" .,;", Mid$(sLine, I, 1)) + If iPos Then + aLine[aLine.Max] = Left(sLine, I) + aLine.Add(Mid$(sLine, I + 1)) + Break + Endif + Next + If I = 0 Then + aLine[aLine.Max] = String.Left(sLine, iMax) + aLine.Add(String.Mid$(sLine, iMax + 1)) + Endif + Endif + + Wend + + Return aLine + +End + + + +Private Sub GetVersion() As String + + Return Project.FormatVersion() + +End + +Private Sub InitMake(sSys As String) + + If Project.CreateEachDirectory Then + Path = $sSavePath &/ sSys + Try Mkdir $sSavePath + Try Mkdir Path + Else + Path = $sSavePath + Try Mkdir Path + Endif + + $sName = Project.Name + $sComponentName = $sName + $sVendor = Project.Vendor + $sVendorPrefix = Project.VendorPrefix + If Not $sVendorPrefix Then $sVendorPrefix = $sVendor + + If Project.Type = Project.TYPE_COMPONENT Then + If $sVendorPrefix <> Null Then + If $sName Not Begins $sVendorPrefix & "." Then $sComponentName = $sVendorPrefix & "." & $sName + Endif + $sComponentName = String.LCase($sComponentName) + Else If Project.Type = Project.TYPE_LIBRARY Then + $sLibraryName = $sName & ":" & Project.MajorVersion & "." & Project.MinorVersion + Endif + + '$sPrefix = GetPackagePrefix(Project.Vendor, Project.Prefix) + $sUnsafePackageName = GetPackageFullName($sVendor, $sVendorPrefix, Project.Prefix, False) + + $sHome = System.User.Home + + $sCategories = Project.Categories[sSys] + If $sCategories Then $sCategories &= ";" + + $sVersion = GetVersion() + + If Project.Description Then + $sDescription = RemoveEmptyLines(Project.Description) + Else + $sDescription = "Missing description" + Endif + + With Project.Components + If .Exist("gb.gui") Then + $sSupportPackage = "gb.gui" + Else If .Exist("gb.gui.qt") Then + $sSupportPackage = "gb.gui.qt" + Endif + End With + +End + +Public Function Make() As Boolean + + Dim sSys As String + Dim sMacro As String + Dim bAdd As Boolean + Dim sPath As String + Dim aVer As String[] + + aVer = Split(System.FullVersion, ".") + MIN_VERSION = aVer[0] & "." & aVer[1] + + If Project.Systems.Exist("slackware") Then + If Project.MakeExecutable(True, True) Then Return True + Endif + + ' Save old rpm macro file + sMacro = User.Home &/ ".rpmmacros" + Try Move sMacro To sMacro & ".save" + Try Kill sMacro + + ClearLog + AddLog(("Saving CHANGELOG file.")) + sPath = Project.Dir &/ ".hidden" &/ "CHANGELOG" + bAdd = Not Exist(sPath) + 'Try Mkdir Project.Dir &/ ".hidden" + File.Save(sPath, ChangeLog) + Project.RefreshKey(sPath) + If bAdd Then VersionControl.AddFile(sPath) + + $sSavePath = Path + For Each sSys In Project.Systems + If MakePackage(sSys) Then Return True + Next + + ' Restore old rpm macro file + Try Kill sMacro + Try Move sMacro & ".save" To sMacro + + ' sPath = Project.Dir &/ ".extratest" + ' bAdd = Not Exist(sPath) + ' If Len(ExtraTest) > 0 Then + ' AddLog(("Saving extra tests settings.")) + ' File.Save(sPath, ExtraTest) + ' If bAdd Then VersionControl.AddFile(sPath) + ' Else + ' If Not bAdd Then VersionControl.RemoveFile(sPath) + ' Endif + + AddLog("\n" & String(40, "=") & "\n") + AddLog(("The packages have been successfully created.") & "\n") + +End + +Public Function GetChangeDate() As String + + Dim sLang As String + Dim sDate As String + + sLang = System.Language + System.Language = "C" + sDate = Format$(Now, "ddd mmm dd yyyy") & " " & Project.Maintainer & " " + If Project.Address Then sDate = sDate & "<" & Project.Address & "> " + sDate &= GetVersion() + System.Language = sLang + Return sDate + +End + +Private Function IsConsoleProject() As Boolean + + Dim sLib As String + Dim hComp As CComponent + + For Each sLib In Project.Components + hComp = Project.Documentation[sLib] + If hComp.IsForm() Then Return False + Next + + Return True + +End + +Private Sub ComponentToPackageName(sComp As String) As String + + Return "gambas" & System.Version & "-" & Replace(sComp, ".", "-") + +End + +Private Function GetDependencies(Optional aComp As String[]) As String + + Dim sRes As String + Dim sComp As String + Dim iPos As Integer + Dim sTest As String + + If Not aComp Then aComp = Project.Components + + For Each sComp In aComp + + iPos = InStr(sComp, ":") + If iPos Then + sTest = Mid$(sComp, iPos + 1) + If Not Project.Components.Exist(sTest) Then Continue + sComp = Left(sComp, iPos - 1) + Endif + + If sComp = "gb.debug" Or If sComp = "gb.eval" Then Continue + If sComp = "gb.gui" Or If sComp Begins "gb.gui." Then Continue + sRes &= GetDependency(sComp) + 'If sComp = "gb.form" Then sRes &= GetDependency("gb.form.stock") + Next + + For Each sComp In Project.Libraries + sRes &= GetDependency(sComp) + Next + + Return sRes + +End + +Private Function GetExtraDependencies(sSys As String) As String + + Dim sDep As String + Dim aDep As String[] + Dim sRes As String + Dim sFormat As String + + If Project.SameDependencies Then sSys = Project.Systems[0] + + 'If Not sFormatMinMax Then sFormatMinMax = sFormatMin & sFormatMax + + For Each sDep In Split(Project.ExtraDependencies[sSys], "\n") + + aDep = Split(sDep, "\t") + aDep.Resize(3) + + If aDep[1] And If aDep[2] Then + If aDep[1] = aDep[2] Then + sFormat = $sFormatEqual + Else + sFormat = $sFormatMinMax + Endif + Else If aDep[1] Then + sFormat = $sFormatMin + Else If aDep[2] Then + sFormat = $sFormatMax + Else + sFormat = $sFormatSingle + Endif + + sRes &= Subst(sFormat, aDep[0], aDep[1], aDep[2]) + + Next + + Return sRes + +End + +Private Function GetExtraFiles(sSys As String, sFormat As String, Optional sFormatDir As String) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + Dim sFmt As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + aFile.Resize(2) + + sFmt = If(IsDir(Project.Dir &/ ".hidden" &/ aFile[0]), sFormatDir, sFormat) + sRes &= Subst(sFmt, Shell$(aFile[0]), Shell$(aFile[1]), Shell$(Mid$(aFile[0], RInStr(aFile[0], "/") + 1))) & "\n" + + Next + + Return sRes + +End + +Private Sub FormatFileInList(sFile As String, Optional bDebian As Boolean) As String + + If InStr(sFile, " ") Then + If bDebian Then + sFile = Replace(sFile, " ", "[!#-~.\"!]") + Else + sFile = Chr$(34) & Replace(sFile, Chr$(34), "\\\"") & Chr$(34) + Endif + Endif + Return sFile + +End + + +Private Function GetExtraFilesList(sSys As String, sPrefix As String, sFormat As String, Optional bDebian As Boolean) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + Dim sSrc, sDest, sDestDir As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + aFile.Resize(2) + + sSrc = FormatFileInList(sPrefix &/ aFile[0], bDebian) + sDest = FormatFileInList(aFile[1] &/ File.Name(aFile[0]), bDebian) + sDestDir = FormatFileInList(aFile[1], bDebian) + sRes &= Subst(sFormat, sSrc, sDest, sDestDir) & "\n" + + Next + + Return sRes + +End + + +Private Function CopyExtraFiles(sSys As String, sBuildDir As String) + + Dim sFile As String + Dim aFile As String[] + Dim sSrc As String + Dim sDst As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + 'aFile.Resize(2) + sSrc = Project.Dir &/ ".hidden" &/ aFile[0] + sDst = File.Dir(sBuildDir &/ aFile[1] &/ File.Name(aFile[0])) + + Project.MakeDir(sDst) + If IsDir(sSrc) Then + Shell "cp -R --preserve=timestamp " & Shell$(sSrc) & " " & Shell$(sDst) Wait + Else + Shell "cp --preserve=timestamp " & Shell$(sSrc) & " " & Shell$(sDst) Wait + 'Copy sSrc To sBuildDir &/ aFile[1] &/ File.Name(aFile[0]) + Endif + Next + +End + +Private Function GetExtraFilesDir(sSys As String, sFormat As String, Optional bDebian As Boolean) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + + aFile = Split(sFile, "\t") + aFile.Resize(2) + + If bDebian Then + sRes &= Subst(sFormat, aFile[1]) & "\n" + Else + sRes &= Subst(sFormat, Shell$(aFile[1])) & "\n" + Endif + + Next + + Return sRes + +End + +Private Function GetDependency(sLib As String) As String + + Dim hLibrary As CLibraryInfo + Dim sVersion As String + Dim aMinVersion As String[] + Dim aMaxVersion As String[] + Dim sPackageName As String + + If Left(sLib) = "/" Or If Left(sLib) = ":" Then + + ' The package name dependency must not include the version! + + hLibrary = CLibraryInfo[sLib] + sPackageName = hLibrary.GetDependencyName() + sVersion = hLibrary.Version + + aMinVersion = Split(sVersion, ".") + If aMinVersion[1] = "0" Then + If aMinVersion[0] <> "0" Then + aMinVersion[0] = CStr(CInt(aMinVersion[0]) - 1) + aMinVersion[1] = "90" + Endif + Else + aMinVersion[1] = CStr(CInt(aMinVersion[1]) - 1) + Endif + aMinVersion.Resize(3) + aMinVersion[2] = "0" + + If hLibrary.CompatibleUntil Then + aMaxVersion = Split(hLibrary.CompatibleUntil, ".") + Else + aMaxVersion = Split(sVersion, ".") + aMaxVersion.Resize(3) + aMaxVersion[2] = "90" + Endif + + ' Else If Left(sLib) = ":" Then + ' + ' sLib = File.Name(sLib) + ' iPos = RInStr(sLib, ":") + ' sVersion = Mid$(sLib, iPos + 1) + ' sLib = Left(sLib, iPos - 1) + ' + ' sPackageName = ComponentToPackageName(sLib) + ' + ' aMinVersion = Split(sVersion, ".") + ' aMaxVersion = Split(sVersion, ".") + + Else + + sPackageName = ComponentToPackageName(sLib) + + aMinVersion = Split(MIN_VERSION, ".") + aMaxVersion = Split(MAX_VERSION, ".") + + Endif + + Return Subst($sFormatMinMax, sPackageName, aMinVersion.Join("."), aMaxVersion.Join(".")) + +End + +Private Sub PrintOnlyShowIn(hFile As File, sCategories As String) + + Dim aCat As String[] = Split(sCategories, ";", "", True) + Dim sCat As String + Dim aOnly As New String[] + + If aCat.Exist("Screensaver") Or If aCat.Exist("TrayIcon") Or If aCat.Exist("Applet") Or If aCat.Exist("Shell") Then + + For Each sCat In aCat + If sCat = "KDE" Or If sCat = "GNOME" Or If sCat = "ROX" Or If sCat = "XFCE" Then + aOnly.Add(sCat) + Endif + Next + + If aOnly.Count Then Print #hFile, "ShowOnlyIn="; aOnly.Join(";"); ";" + + Endif + +End + +Private Sub PrintDesktopFile(hFile As File, sExec As String, sIcon As String, Optional sExtraCat As String) + + Print #hFile, "[Desktop Entry]" + Print #hFile, "Version=1.0" + Print #hFile, "Name="; + If Project.Title Then + Print #hFile, Project.Title + Else + Print #hFile, Project.Name + Endif + Print #hFile, "Comment="; + If $sDescription Then + Print #hFile, Replace($sDescription, "\n", " ") + Else + Print #hFile, Project.Name + Endif + Print #hFile, "Exec="; sExec '/usr/bin/"; $sName & ".gambas" + Print #hFile, "Icon="; sIcon '/usr/share/pixmaps/" & sIcon + Print #hFile, "Terminal="; IIf(IsConsoleProject(), "true", "false") + Print #hFile, "Type=Application" + Print #hFile, "StartupNotify=true" + Print #hFile, "Categories="; sExtraCat; $sCategories + If Project.MimeTypes.Count Then Print #hFile, "MimeType="; Project.MimeTypes.Join(";") + PrintOnlyShowIn(hFile, $sCategories) + If Trim(Project.ExtraDesktop) Then Print #hFile, Trim(Project.ExtraDesktop) + +End + + +Private Sub RunCommand(sCmd As String, Optional sDir As String) + + $sOutput = "" + $bEnd = False + If sDir Then + AddLog("cd " & Shell$(sDir)) + AddLog(sCmd) + Shell "(cd " & SConv(Shell$(sDir)) & ";" & sCmd & ") 2>&1" For Input As "Process" + Else + AddLog(sCmd) + Shell sCmd & " 2>&1" For Input As "Process" + Endif + Repeat + Sleep 0.01 + Wait + Until $bEnd + +End + +Private Sub MakeSupportPackage(sSys As String) + + Dim sSupport As String + Dim aPackage As String[] + + If $sSupportPackage = "gb.gui" Then + + sSupport = GTK_SUPPORT + aPackage = GTK_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "GTK+")) + GoSub MAKE_PACKAGE + + If Not Project.Components.Exist("gb.gui.opengl") Then + sSupport = GTK3_SUPPORT + aPackage = GTK3_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "GTK+3")) + GoSub MAKE_PACKAGE + Endif + + Endif + + sSupport = QT4_SUPPORT + aPackage = QT4_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "QT4")) + GoSub MAKE_PACKAGE + + sSupport = QT5_SUPPORT + aPackage = QT5_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "QT5")) + GoSub MAKE_PACKAGE + + Return + +MAKE_PACKAGE: + + Select Case sSys + + Case "mageia", "mandriva", "fedora", "suse" + MakeRpmSupportPackage(sSys, sSupport, aPackage) + + Case "debian", "ubuntu" + MakeDebSupportPackage(sSys, sSupport, aPackage) + + Case "slackware" + MakeTgzSupportPackage(sSys, sSupport, aPackage) + + Case "archlinux" + MakeArchSupportPackage(sSys, sSupport, aPackage) + + Default + + End Select + + Return + +End + + +Private Function MakePackage(sSys As String) As Boolean + + Dim sErr As String + + AddLog("\n" & String(78, "=") & "\n") + AddLog(String.UCase(Subst(("Creating package for &1."), FMakeInstall.GetSystemName(sSys)))) + AddLog("\n") + + InitMake(sSys) + + Select Case sSys + + Case "mageia", "mandriva", "fedora", "suse" + MakeRpmPackage(sSys) + + Case "debian", "ubuntu" + MakeDebPackage(sSys) + + Case "slackware" + MakeTgzPackage(sSys) + + Case "autotools" + MakeAutotoolsPackage(sSys) + + Case "archlinux" + MakeArchPackage(sSys) + + Default + Return True + + End Select + + If $sSupportPackage Then MakeSupportPackage(sSys) + +Catch + + sErr = Error.Text + AddLog(("The package build has failed.") & "\n" & Error.Where & ": " & sErr) + FMakeInstall.ShowError("" & ("The package build has failed.") & "
" & sErr) + Application.Busy = 0 + Return True + +End + +Private Sub GetDebianBuildPackageCommand() As String + + Dim sCmd As String + + sCmd = "dpkg-buildpackage -d -rfakeroot" + If Not Project.PackageSignature Then sCmd &= " -uc -us" + Return sCmd + +End + +' From Debian Policy Manual: +' Package names (both source and binary, see Package, Section 5.6.7) must consist only of lower case letters (a-z), digits (0-9), plus (+) and minus (-) signs, and periods (.). +' They must be at least two characters long And must start With an alphanumeric character. + + +Private Sub FormatDebPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) And If InStr("+-", sCar) = 0 Then sCar = "-" + sRes &= sCar + Next + + Return sRes + +End + +Private Function MakeDebPackage(sSys As String) + + Dim hFile As File + Dim sCmd As String + Dim sIcon As String + Dim sIconDir As String + Dim sArch As String + Dim sPackageName As String + Dim sPackagePath As String + Dim sLine As String + Dim hImageStat As ImageStat + Dim iSize As Integer + Dim sPath As String + Dim W As Integer + Dim H As Integer + + Inc Application.Busy + + $sFormatSingle = ", &1" + $sFormatMin = ", &1 (>= &2)" + $sFormatMax = ", &1 (<< &3)" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatDebPackageName($sUnsafePackageName) + + '$sName = Replace$($sName, "_", "-") + + ' Step 1. Create the build directory + + AddLog(("Making build directory.")) + sPackagePath = Path &/ Subst("&1-&2", sPackageName, $sVersion) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Mkdir sPackagePath + Mkdir sPackagePath &/ "src" + Mkdir sPackagePath &/ "debian" + + Mkdir sPackagePath &/ "debian/source" + File.Save(sPackagePath &/ "debian/source/format", "1.0") + + sArch = sPackagePath &/ "src/raw.tar.gz" + + ' Create icons + + sIconDir = Project.Dir &/ ".hidden/.icons" + Try Shell.RmDir(sIconDir) + Shell.MkDir(sIconDir) + + sIcon = sPackageName + + Project.StretchIcon(Project.Dir &/ Project.Icon, 32).Save(sIconDir &/ sIcon & ".xpm") + + Try hImageStat = ImageStat(Project.Dir &/ Project.Icon) + If Error Then + W = 32 + H = 32 + Else + W = hImageStat.Width + H = hImageStat.Height + Endif + + For Each iSize In DEBIAN_ICON_SIZES + If W >= iSize And If H >= iSize Then + Mkdir sIconDir &/ CStr(iSize) + Project.StretchIcon(Project.Dir &/ Project.Icon, iSize).Save(sIconDir &/ CStr(iSize) &/ sIcon & ".png") + Endif + Next + + Project.MakeSourcePackageTo(sArch) + + ' Remove the icon dir from the project now it has been archived + Shell.RmDir(sIconDir) + + sCmd = "cd " & Shell$(sPackagePath &/ "src") & "; tar xzf raw.tar.gz >/dev/null" + Shell sCmd Wait + + ' Rename the source archive project directory to the package name + 'TRY MOVE Path &/ (sPrefix & Subst("&1", Project.Name)) TO sPackagePath + Try Kill sArch + Try Shell "cp -Rf " & Shell(sPackagePath) & " " & Shell(sPackagePath & ".orig") Wait + + + ' Step 2. Make the desktop file + If Project.Type = Project.TYPE_NORMAL Then + AddLog(("Creating desktop file...")) + hFile = Open sPackagePath &/ "debian/" & sPackageName & ".desktop" For Create + PrintDesktopFile(hFile, "/usr/bin/" & $sName, sIcon) + Close #hFile + Endif + + 'Step 3. Create debianization needed files: control, rules + 'debian/copyright + AddLog(("Sources are being debianizated.")) + hFile = Open sPackagePath &/ "debian/copyright" For Create + Print #hFile, "This package was debianized by " & Project.Maintainer & " <" & Project.Address & "> on" + Print #hFile, Format$(Date, "ddd, dd mmm yyyy hh:nn:ss") & "+0000" + Print #hFile + Print #hFile, "Copyright Holder: " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile + Print #hFile, "License:" + Print #hFile + Print #hFile, If(Project.License, Project.License, "GNU General Public License") + Print #hFile + Print #hFile, "Created by: "; Project.Authors + Close #hFile + + 'debian/changelog + hFile = Open sPackagePath &/ "debian/changelog" For Create + Print #hFile, ChangelogToDebChangelog(sSys, sPackageName) + Close #hFile + + 'debian/compat + hFile = Open sPackagePath &/ "debian/compat" For Create + Print #hFile, DEBIAN_DEBHELPER_VERSION + Close #hFile + + 'debian/menu + If Project.Type = Project.TYPE_NORMAL Then + hFile = Open sPackagePath &/ "debian/menu" For Create + Print #hFile, "?package("; sPackageName; "):needs=\""; IIf(IsConsoleProject(), "text", "X11"); "\" section=\""; Project.Menus[sSys]; "\"\\" + Print #hFile, "title=\""; IIf(Project.Title, Project.Title, Project.Name); "\"\\" + Print #hFile, "command=\"/usr/bin/"; $sName; "\"\\" + Print #hFile, "icon=\"/usr/share/pixmaps/"; sIcon; ".xpm\"" + Close #hFile + Endif + + 'debian/dirs + hFile = Open sPackagePath &/ "debian/dirs" For Create + Select Case Project.Type + Case Project.TYPE_COMPONENT + Print #hFile, "usr/share/gambas"; System.Version; "/info" + Print #hFile, "usr/lib/gambas"; System.Version + If Exist(Project.Dir &/ ".hidden/control") Then Print #hFile, "usr/share/gambas" & System.Version & "/control/" & $sComponentName + Case Project.TYPE_LIBRARY + Print #hFile, "usr/lib/gambas"; System.Version; "/"; LCase($sVendor) + Case Project.TYPE_NORMAL + Print #hFile, "usr/bin" + Print #hFile, "usr/share/applications" + Print #hFile, "usr/share/pixmaps" + For Each iSize In DEBIAN_ICON_SIZES + Print #hFile, "usr/share/icons/hicolor/"; iSize; "x"; iSize; "/apps" + Next + End Select + Print #hFile, GetExtraFilesDir(sSys, "&1", True) + Close #hFile + + 'debian/install + hFile = Open sPackagePath &/ "debian/install" For Create + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + Print #hFile, "src/"; $sName; "/"; $sComponentName; ".gambas usr/lib/gambas" & System.Version + If Exist(Project.Dir &/ ".hidden/control") Then Print #hFile, "src/"; $sName; "/.hidden/control/*.png usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + + Case Project.TYPE_LIBRARY + + Print #hFile, "src/"; $sName; "/"; $sLibraryName; ".gambas usr/lib/gambas" & System.Version; "/"; LCase($sVendor) + + Case Project.TYPE_NORMAL + + Print #hFile, "src/"; $sName; "/"; $sName; " usr/bin" + Print #hFile, "debian/"; sPackageName; ".desktop usr/share/applications" + + Print #hFile, "src/"; $sName; "/.hidden/.icons/"; sIcon; ".xpm usr/share/pixmaps" + For Each iSize In DEBIAN_ICON_SIZES + sPath = "src" &/ $sName &/ ".hidden/.icons" &/ CStr(iSize) &/ sIcon & ".png" + If Exist(sPackagePath &/ sPath) Then Print #hFile, sPath; " /usr/share/icons/hicolor/"; iSize; "x"; iSize; "/apps" + Next + + End Select + + Print #hFile, GetExtraFilesList(sSys, "src/" & $sName & "/.hidden", "&1 &3", True) + + Close #hFile + + 'debian/control + hFile = Open sPackagePath &/ "debian/control" For Create + Print #hFile, "Source: "; sPackageName + Print #hFile, "Section: contrib/"; Project.Groups[sSys] + Print #hFile, "Priority: optional" + Print #hFile, "Maintainer: "; Project.Maintainer; " <"; Project.Address; ">" + Print #hFile, "Build-Depends: debhelper (>= "; DEBIAN_DEBHELPER_VERSION; "), gambas"; System.Version; "-dev (>= "; MIN_VERSION; "), gambas"; System.Version; "-dev (<< "; MAX_VERSION; ")"; + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + Print #hFile + + Print #hFile, "Standards-Version: "; DEBIAN_STANDARD + Print #hFile + Print #hFile, "Package: "; sPackageName + Print #hFile, "Architecture: all" + Print #hFile, "Depends: gambas"; System.Version; "-runtime (>= "; MIN_VERSION; "), gambas"; System.Version; "-runtime (<< "; MAX_VERSION; ")"; + + If Project.Type <> Project.TYPE_COMPONENT Then + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + Endif + Print #hFile + + Print #hFile, GetShortDesc("Description: " & $sDescription, 80) + ' If Project.Title Then + ' Print #hFile, Project.Title + ' Else + ' Print #hFile, Project.Name + ' Endif + + For Each sLine In FormatDesc($sDescription, 80) + Print #hFile, " "; sLine + Next + + Select Case Project.Type + Case Project.TYPE_NORMAL + Print #hFile, " This program is written in Gambas." + Case Project.TYPE_LIBRARY + Print #hFile, " This is a Gambas library." + Case Project.TYPE_COMPONENT + Print #hFile, " This is a Gambas component written in Gambas." + End Select + + Close #hFile + + 'debian/rules + hFile = Open sPackagePath &/ "debian/rules" For Create + Output To #hFile + Print "#!/usr/bin/make -f" + Print "build: build-stamp" + Print "build-stamp:" + Print "\tdh_testdir" + Print "\ttouch build-stamp" + Print "\t"; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & " src" &/ $sName + Print "\tgba"; System.Version; " -o "; + + Select Case Project.Type + Case Project.TYPE_COMPONENT + Print Shell$("src" &/ $sName &/ $sComponentName & ".gambas"); + Case Project.TYPE_LIBRARY + Print Shell$("src" &/ $sName &/ $sLibraryName & ".gambas"); + Case Project.TYPE_NORMAL + Print Shell$("src" &/ $sName &/ $sName); + End Select + Print " src" &/ $sName + + ' If Project.Type = Project.TYPE_COMPONENT + ' If $sName <> $sComponentName Then + ' Print "\tmv "; Shell$("src" &/ $sName &/ $sName & ".gambas"); " "; Shell$("src" &/ $sName &/ $sComponentName & ".gambas") + ' Endif + ' Else If Project.Type = Project.TYPE_LIBRARY Then + ' Print "\tmv "; Shell$("src" &/ $sName &/ $sName & ".gambas"); " "; Shell$("src" &/ $sName &/ $sLibraryName & ".gambas") + ' Endif + + Print + Print "clean:" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\trm -Rf `find . -name \".gambas\"`" + Print "\trm -Rf `find . -name \"*.gambas\"`" + Print "\trm -f build-stamp install-stamp" + Print "\tdh_clean" + Print + Print "install: build" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_prep" + Print "\tdh_installdirs" + If Project.Type = Project.TYPE_COMPONENT Then + Print "\tcp src" &/ $sName & "/.component $(CURDIR)/debian/" & sPackageName & "/usr/lib/gambas" & System.Version & "/" & Shell$($sComponentName) & ".component" + Print "\tcp src" &/ $sName & "/.info $(CURDIR)/debian/" & sPackageName & "/usr/share/gambas" & System.Version & "/info/" & Shell$($sComponentName) & ".info " "" + Print "\tcp src" &/ $sName & "/.list $(CURDIR)/debian/" & sPackageName & "/usr/share/gambas" & System.Version & "/info/" & Shell$($sComponentName) & ".list" + Endif + Print "\ttouch install-stamp" + Print + Print "binary-arch: build install" + Print "\tdh_testdir" + Print + Print "binary-indep: build install" + Print "\tdh_testdir -i" + Print "\tdh_testroot -i" + Print "\tdh_installdocs -i" + Print "\tdh_installchangelogs -i" + Print "\tdh_install -i" + Print "\tdh_installmenu" + Print "\tdh_compress -i" + Print "\tdh_fixperms -i" + Print "\tdh_installdeb -i" + Print "\tdh_gencontrol -i" + Print "\tdh_md5sums -i" + Print "\tdh_builddeb -i" + Print + Print "binary: binary-indep binary-arch" + Print ".PHONY: build clean binary-indep binary-arch binary install" + Output To Default + Close #hFile + Try Shell "chmod +x " & Shell(sPackagePath &/ "debian/rules") Wait + + ' Step 4. Build package + + AddLog(("Creating package...")) + 'sCmd = "cd " & Shell$(sPackagePath) & "; fakeroot dpkg-buildpackage -d" + 'sCmd = "fakeroot dpkg-buildpackage -d" + + RunCommand(GetDebianBuildPackageCommand(), sPackagePath) + + Dec Application.Busy + + If Process.LastValue > 2 Then Error.Raise(("'dpkg-buildpackage' has failed.")) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Try Shell "rm -f " & Shell$(Path) &/ "*.dsc.asc" Wait + +End + +Private Function MakeDebSupportPackage(sSys As String, sSupport As String, aComp As String[]) + + Dim hFile As File + Dim sPackageName As String + Dim sPackagePath As String + Dim sDesc As String + Dim sLine As String + + Inc Application.Busy + + $sFormatSingle = ", &1" + $sFormatMin = ", &1 (>= &2)" + $sFormatMax = ", &1 (<< &3)" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMin & Replace($sFormatMax, "<<", "<=") + + sPackageName = FormatDebPackageName($sUnsafePackageName) & "-" & sSupport + + ' Step 1. Create the build directory + + AddLog(("Making build directory.")) + sPackagePath = Path &/ Subst("&1-&2", sPackageName, $sVersion) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Mkdir sPackagePath + Mkdir sPackagePath &/ "debian" + + 'Step 3. Create debianization needed files: control, rules + 'debian/copyright + AddLog(("Sources are being debianizated.")) + hFile = Open sPackagePath &/ "debian/copyright" For Create + Print #hFile, "This package was debianized by " & Project.Maintainer & " <" & Project.Address & "> on" + Print #hFile, Format$(Date, "ddd, dd mmm yyyy hh:nn:ss") & "+0000" + Print #hFile + Print #hFile, "Copyright Holder: " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile + Print #hFile, "License:" + Print #hFile + Print #hFile, If(Project.License, Project.License, "GNU General Public License") + Close #hFile + + 'debian/changelog + hFile = Open sPackagePath &/ "debian/changelog" For Create + Print #hFile, ChangelogToDebChangelog(sSys, sPackageName) + Close #hFile + + 'debian/compat + hFile = Open sPackagePath &/ "debian/compat" For Create + Print #hFile, DEBIAN_DEBHELPER_VERSION + Close #hFile + + 'debian/control + hFile = Open sPackagePath &/ "debian/control" For Create + Print #hFile, "Source: "; sPackageName + Print #hFile, "Section: contrib/"; Project.Groups[sSys] + Print #hFile, "Priority: optional" + Print #hFile, "Maintainer: "; Project.Maintainer; " <"; Project.Address; ">" + Print #hFile, "Build-Depends: debhelper (>= "; DEBIAN_DEBHELPER_VERSION; ")" + Print #hFile, "Standards-Version: "; DEBIAN_STANDARD + Print #hFile + Print #hFile, "Package: "; sPackageName + Print #hFile, "Architecture: all" + Print #hFile, "Depends: "; FormatDebPackageName($sUnsafePackageName);; "(>=";; $sVersion;; "), "; FormatDebPackageName($sUnsafePackageName);; "(<=";; $sVersion; ")"; GetDependencies(aComp) + + sDesc = sSupport & " package for " & If(Project.Title, Project.Title, Project.Name) + + Print #hFile, GetShortDesc("Description: " & sDesc, 80) + + sDesc = "This is the dummy " & sDesc + + For Each sLine In FormatDesc(sDesc) + Print #hFile, " "; sLine + Next + + + ' debian/rules + hFile = Open sPackagePath &/ "debian/rules" For Create + Output To #hFile + Print "#!/usr/bin/make -f" + Print + Print "build build-arch build-indep:" + Print + Print "clean:" + Print "\tdh_testdir" + Print "\tdh_clean" + Print + Print "install: build" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_prep" + Print + Print "binary-arch: install" + Print + Print "binary-indep: install" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_install" + Print "\tdh_installdocs" + Print "\tdh_installchangelogs" + Print "\tdh_compress" + Print "\tdh_fixperms" + Print "\tdh_installdeb" + Print "\tdh_gencontrol" + Print "\tdh_md5sums" + Print "\tdh_builddeb" + Print + Print "binary: binary-indep binary-arch" + Print ".PHONY: build clean binary-indep binary-arch binary install" + Print + Output To Default + Close #hFile + Try Shell "chmod +x " & Shell(sPackagePath &/ "debian/rules") Wait + + ' Step 4. Build package + + AddLog(("Creating package...")) + RunCommand(GetDebianBuildPackageCommand(), sPackagePath) + + Dec Application.Busy + + If Process.LastValue > 2 Then Error.Raise(("'dpkg-buildpackage' has failed.")) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Try Shell "rm -f " & Shell$(Path) &/ "*.dsc.asc" Wait + +End + +Private Sub ChangelogToDebChangelog(sSys As String, sPackageName As String) As String + + Dim aLine As String[] + Dim sLine As String + Dim debChangelog As String + Dim sDate As String + Dim sVersion As String + Dim sBits As String[] + Dim previousLine As String + Dim sWord As String + Dim sNextWord As String + Dim aWord As String[] + + aLine = Split(ChangeLog, "\n") + + For Each sLine In aLine + + If Left$(sLine, 1) = "*" Then + + If sDate <> "" Then + 'Debian packages don't accept an empty changelog line for the release: + If previousLine = sPackageName & " (" & sVersion & ") unstable; urgency=low" & "\n\n" Then + debChangelog = debChangelog & " * New release version\n" + Endif + debChangelog = debChangelog & "\n -- " & Project.Maintainer & " <" & Project.Address & "> " & sDate & "\n\n" + Endif + sbits = Split(Trim$(sLine), " ") + sDate = sbits[1] & ", " & sbits[3] & " " & sbits[2] & " " & sbits[4] & " 12:00:00 +0000" + 'sVersion = GetDebVersion() + If sSys = "ubuntu" Then + sVersion = $sVersion & "-0ubuntu" & CStr(Project.PackageVersion) + Else + sVersion = $sVersion & "-" & CStr(Project.PackageVersion) + Endif + previousLine = sPackageName & " (" & sVersion & ") unstable; urgency=low" & "\n\n" + debChangelog &= previousLine + + Else + + If Trim$(sLine) <> "" Then + + aWord = Split(Right$(sLine, -2), " ") + previousLine = " * " + sLine = "" + For Each sWord In aWord + Repeat + If String.Len(sWord) > 76 Then + sNextWord = String.Mid$(sWord, 77) + sWord = String.Left(sWord, 76) + Else + sNextWord = "" + Endif + If String.Len(sLine & sWord) > 76 Then + previousLine &= sLine & "\n " + sLine = sWord + Else + sLine = LTrim(sLine & " " & sWord) + Endif + sWord = sNextWord + Until Not sWord + Next + If sLine Then previousLine &= sLine & "\n" + + debChangelog &= previousLine + + Endif + + Endif + + Next + + debChangelog &= "\n -- " & Project.Maintainer & " <" & Project.Address & "> " & sDate & "\n" + + Return debChangelog + +End + +Private Sub FormatRpmPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) Then sCar = "-" + sRes &= sCar + Next + + Return sRes + +End + +Private Function MakeRpmPackage(sSys As String) + + Dim sSrc As String + Dim sDir As String + Dim sCmd As String + Dim hFile As File + Dim sArch As String + Dim sOutput As String + Dim sLang As String + Dim sPackage As String + Dim sIcon As String + Dim sDistribution As String + Dim sVendor As String + Dim sRelease As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = ",&1" + $sFormatMin = ",&1 >= &2" + $sFormatMax = ",&1 < &3" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMin & Replace($sFormatMax, "<", "<=") + + sPackageName = FormatRpmPackageName($sUnsafePackageName) + + sRelease = CStr(Project.PackageVersion) + + Select Case sSys + + Case "mageia" + sDistribution = "Mageia" + sVendor = "Mageia" + sRelease &= "mga" + + Case "mandriva" + sDistribution = "Mandriva" + sVendor = "MandrivaSoft" + sRelease &= "mdv" + + Case "fedora" + sDistribution = "Fedora" + sVendor = "Fedora" + + Case "suse" + sDistribution = "OpenSUSE" + sVendor = "Novell" + sRelease &= "suse" + + End Select + + ' step 1, set up RPM dirs and macros if they're not there already + + AddLog(("Initializing ~/RPM directory.")) + + For Each sCmd In ["RPM/", "RPM/BUILD/", "RPM/RPMS/", "RPM/SOURCES/", "RPM/SPECS/", "RPM/SRPMS/", "RPM/tmp/"] + Try Mkdir $sHome &/ sCmd + Next + + hFile = Open $sHome &/ ".rpmmacros" For Create + Print #hFile, "%_topdir " & $sHome &/ "RPM" + Print #hFile, "%_tmppath " & $sHome &/ "RPM/tmp" + 'PRINT #hFile, "%_signature gpg" + 'PRINT #hFile, "%_gpg_name Mandrivalinux" + 'PRINT #hFile, "%_gpg_path ~/.gnupg" + Print #hFile, "%packager "; Project.Maintainer & "<" & SConv(Project.Address) & ">" + Print #hFile, "%buildhost "; System.Host + Print #hFile, "%distribution "; sDistribution + Print #hFile, "%vendor "; If($sVendor, $sVendor, sVendor) + Close #hFile + + ' step 2, write source tarball (with bzip) to SOURCES dir + + AddLog(("Creating source package.")) + + sSrc = $sHome &/ "RPM/SOURCES" + + sDir = Project.Dir &/ ".icon" + Shell "rm -rf " & Shell$(sDir) Wait + Try Mkdir sDir + + ' IF Project.Icon THEN + ' hIcon = Image.Load(Project.Dir &/ Project.Icon) + ' ELSE + ' hIcon = Image.Load("img/32/gambas.png") + ' ENDIF + + Project.StretchIcon(Project.Dir &/ Project.Icon, 16).Save(sDir &/ "16.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 32).Save(sDir &/ "32.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sDir &/ "48.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 64).Save(sDir &/ "64.png") + + sArch = sSrc &/ Subst("&1-&2.tar.bz2", sPackageName, $sVersion) + Project.MakeSourcePackageTo(sArch) + + Shell "rm -rf " & Shell$(sDir) Wait + + AddLog(("Creating .spec file.")) + + hFile = Open $sHome &/ "RPM/SPECS" &/ sPackageName & ".spec" For Create + + Print #hFile, "%define name " & sPackageName + Print #hFile, "%define version " & $sVersion + Print #hFile, "%define release "; sRelease + + Print #hFile + Print #hFile, "Summary: " & IIf(Project.Title, Project.Title, Project.Name) + Print #hFile, "Name: %{name}" + Print #hFile, "Version: %{version}" + Print #hFile, "Release: %{release}" + Print #hFile, "Source0: %{name}-%{version}.tar.bz2" + Print #hFile, "License: "; If(Project.License, Project.License, "GPL") + Print #hFile, "Group: " & Project.Groups[sSys] + Print #hFile, "BuildRoot: %{_tmppath}/%{name}-%{version}-${release}-buildroot" + Print #hFile, "Prefix: %{_prefix}" + 'PRINT #hFile, "BuildRequires: gambas2-ide" + Print #hFile, "BuildArch: noarch" + + Print #hFile, "Requires: gambas"; System.Version; "-runtime >= "; MIN_VERSION; ",gambas"; System.Version; "-runtime < "; MAX_VERSION; + + If Project.Type <> Project.TYPE_COMPONENT Then + + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + + Endif + + Print #hFile + + Print #hFile, "AutoReqProv: no" + + Print #hFile, "\n%description\n" & $sDescription & "\nThis program is written in Gambas, so you will need Gambas to be installed." + + Print #hFile, "\n%prep" + Print #hFile, "rm -rf %{buildroot}" + + Print #hFile, "\n%setup -q -n " & Shell$($sName) + + If Project.Type = Project.TYPE_COMPONENT Then + + ' Components must be installed in Gambas prefix, which is not known at package creation time. + ' How can we do that? Hardcode installation path according to the distribution? + + Print #hFile, "\n%build" + Print #hFile, Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & "\ngba"; System.Version + + Print #hFile, "\n%install" + Print #hFile, GetExtraFilesDir(sSys, "install -d %{buildroot}/&1") + Print #hFile, GetExtraFiles(sSys, "install -p .hidden/&1 %{buildroot}/&2/&1", "cp -R --preserve=timestamp .hidden/&1 %{buildroot}/&2/&1") + Print #hFile, "install -d %{buildroot}/%{_libdir}/gambas"; System.Version + Print #hFile, "install -p "; Shell$($sName); ".gambas %{buildroot}/%{_libdir}/gambas" & System.Version; "/"; Shell$($sComponentName); ".gambas" + Print #hFile, "install -p .component %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; Shell$($sComponentName); ".component" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/gambas"; System.Version; "/info" + Print #hFile, "install -p .info %{buildroot}/%{_datadir}/gambas"; System.Version; "/info/"; Shell$($sComponentName); ".info" + Print #hFile, "install -p .list %{buildroot}/%{_datadir}/gambas"; System.Version; "/info/"; Shell$($sComponentName); ".list" + + If Exist(Project.Dir &/ ".hidden/control") Then + Print #hFile, "install -d %{buildroot}/%{_datadir}/gambas"; System.Version; "/control/"; Shell$($sComponentName) + Print #hFile, "install -p "; ".hidden/control/*.png %{buildroot}/%{_datadir}/gambas" & System.Version &/ "control" &/ Shell$($sComponentName) + Endif + + Else + + Print #hFile, "\n%build" + Print #hFile, Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & "\ngba"; System.Version + + Print #hFile, "\n%install" + + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, "install -d %{buildroot}/%{_bindir}" + Print #hFile, "install -p "; Shell$($sName); ".gambas %{buildroot}/%{_bindir}" &/ Shell$($sName) + Else If Project.Type = Project.TYPE_LIBRARY Then + Print #hFile, "install -d %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; LCase($sVendor) + Print #hFile, "install -p "; Shell$($sName); ".gambas %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; LCase($sVendor); "/"; Shell$($sLibraryName & ".gambas") + Endif + + Print #hFile, GetExtraFilesDir(sSys, "install -d %{buildroot}/&1") + Print #hFile, GetExtraFiles(sSys, "install -p .hidden/&1 %{buildroot}/&2/&1", "cp -R --preserve=timestamp .hidden/&1 %{buildroot}/&2/&1") + + If Project.Type = Project.TYPE_NORMAL + + sIcon = $sName & ".png" + + ' NOTE: There are explicit references to /usr/share. + ' I must find a way to use the rpm macros instead. + + Select Case sSys + + Case "mandriva" + + Print #hFile, "install -d %{buildroot}/%{_miconsdir}" + Print #hFile, "install -d %{buildroot}/%{_iconsdir}" + Print #hFile, "install -d %{buildroot}/%{_liconsdir}" + Print #hFile, "install -p .icon/16.png %{buildroot}/%{_miconsdir}" &/ Shell$(sIcon) + Print #hFile, "install -p .icon/32.png %{buildroot}/%{_iconsdir}" &/ Shell$(sIcon) + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_liconsdir}" &/ Shell$(sIcon) + + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "cat << EOF > %{buildroot}/%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, "%{_bindir}/" & Shell$($sName), sIcon, "X-MandrivaLinux-" & Replace(Replace(Project.Menus[sSys], " ", ""), "/", "-") & ";") + + Print #hFile, "EOF" + Print #hFile, "\n%post" + Print #hFile, "%{update_menus}" + + Print #hFile, "\n%postun" + Print #hFile, "%{clean_menus}" + + Case "mageia" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/icons" + Print #hFile, "install -d %{buildroot}/%{_datadir}/icons/mini" + Print #hFile, "install -d %{buildroot}/%{_datadir}/icons/large" + Print #hFile, "install -p .icon/16.png %{buildroot}/%{_datadir}/icons/mini" &/ Shell$(sIcon) + Print #hFile, "install -p .icon/32.png %{buildroot}/%{_datadir}/icons" &/ Shell$(sIcon) + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_datadir}/icons/large" &/ Shell$(sIcon) + + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "cat << EOF > %{buildroot}/%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, "%{_bindir}/" & Shell$($sName), sIcon, "X-MandrivaLinux-" & Replace(Replace(Project.Menus[sSys], " ", ""), "/", "-") & ";") + + Print #hFile, "EOF" + + Case "fedora" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/pixmaps" + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_datadir}/pixmaps" &/ Shell$(sIcon) + + Print #hFile, "cat << EOF > %{buildroot}%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, "%{_bindir}/" & Shell$($sName), sIcon, "X-RedHat-Extra;") + + Print #hFile, "EOF" + + Case "suse" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/pixmaps" + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_datadir}/pixmaps" &/ Shell$(sIcon) + + Print #hFile, "cat << EOF > %{buildroot}%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, "%{_bindir}/" & Shell$($sName), sIcon) + + Print #hFile, "EOF" + + End Select + + Endif + + Endif + + Print #hFile, "\n%clean" + Print #hFile, "rm -rf %{buildroot}" + + Print #hFile, "\n%files" + Print #hFile, "%defattr(-,root,root)" + + If Project.Type = Project.TYPE_COMPONENT Then + + Print #hFile, FormatFileInList("%{_libdir}/gambas" & System.Version & "/" & $sComponentName & ".gambas") + Print #hfile, FormatFileInList("%{_libdir}/gambas" & System.Version & "/" & $sComponentName & ".component") + + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/info/" & $sComponentName & ".info") + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/info/" & $sComponentName & ".list") + + If Exist(Project.Dir &/ ".hidden/control") Then + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/control/" & $sComponentName & "/*.png") + Endif + Print #hFile, GetExtraFilesList(sSys, "", "&2"); + + Else + + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, FormatFileInList("%{_bindir}" &/ $sName) + Else If Project.Type = Project.TYPE_LIBRARY Then + Print #hFile, FormatFileInList("%{_libdir}/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas") + Endif + + Print #hFile, GetExtraFilesList(sSys, "", "&2"); + + If Project.Type = Project.TYPE_NORMAL Then + + Select Case sSys + + Case "mandriva" + + Print #hFile, FormatFileInList("/%{_miconsdir}" &/ sIcon) + Print #hFile, FormatFileInList("/%{_iconsdir}" &/ sIcon) + Print #hFile, FormatFileInList("/%{_liconsdir}" &/ sIcon) + 'PRINT #hFile, "/%{_menudir}" &/ sName + Print #hFile, "/%{_datadir}/applications/%{name}.desktop" + + Case "mandriva", "mageia" + + Print #hFile, FormatFileInList("/%{_datadir}/icons/mini" &/ sIcon) + Print #hFile, FormatFileInList("/%{_datadir}/icons" &/ sIcon) + Print #hFile, FormatFileInList("/%{_datadir}/icons/large" &/ sIcon) + 'PRINT #hFile, "/%{_menudir}" &/ sName + Print #hFile, "/%{_datadir}/applications/%{name}.desktop" + + Case "fedora" + + Print #hFile, FormatFileInList("%{_datadir}/pixmaps" &/ sIcon) + Print #hFile, "%{_datadir}/applications/%{name}.desktop" + + Case "suse" + + Print #hFile, FormatFileInList("%{_datadir}/pixmaps" &/ sIcon) + Print #hFile, "%{_datadir}/applications/%{name}.desktop" + + End Select + + Endif + + Endif + + Print #hFile, "\n%changelog\n" + Print #hFile, ChangeLog + + Close #hFile + + ' and step 4.... build that sucker. + + AddLog(("Creating package...") & "\n") + + sLang = System.Language + System.Language = "C" + + sCmd = RPMBUILD_PROG & " -ba " & Shell$($sHome &/ "RPM/SPECS" &/ sPackageName & ".spec") + AddLog(sCmd) + + 'sTemp = Temp$ + $sOutput = "" + $bEnd = False + Shell sCmd & " 2>&1" Wait For Read As "Process" 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + AddLog("") + + sOutput = Replace($sOutput, "\r", "") + Try sOutput = DConv(sOutput) + + Try Kill $sHome &/ ".rpmmacros" + + System.Language = sLang + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'rpmbuild' has returned the following error code:") & " " & Process.LastValue) + + For Each sCmd In Split(sOutput, "\n") + If Left(sCmd, 6) = "Wrote:" And Right$(sCmd, 10) = "noarch.rpm" Then + + sPackage = Subst("&1-&2-&3.noarch.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/RPMS/noarch") & "; fakeroot " & ALIEN_PROG & " --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/RPMS/noarch" &/ sPackage) THEN Error.Raise("alien command has failed") + ' ENDIF + MoveFile($sHome &/ "RPM/RPMS/noarch" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + + sPackage = Subst("&1-&2-&3.src.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/SRPMS") & "; fakeroot alien --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/SRPMS" &/ sPackage) THEN Error.Raise("alien command has failed") + ' MoveFile(sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ File.BaseName(sPackage) & ".src.deb") + ' ELSE + MoveFile($sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + ' ENDIF + + End If + Next + +End + +Private Function MakeRpmSupportPackage(sSys As String, sSupport As String, aComp As String[]) + + Dim sCmd As String + Dim hFile As File + Dim sOutput As String + Dim sLang As String + Dim sPackage As String + Dim sDistribution As String + Dim sVendor As String + Dim sRelease As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = ",&1" + $sFormatMin = ",&1 >= &2" + $sFormatMax = ",&1 < &3" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatRpmPackageName($sUnsafePackageName) & "-" & sSupport + + Select Case sSys + + Case "mageia" + sDistribution = "Mageia" + sVendor = "Mageia" + sRelease = "1mga" + + Case "mandriva" + sDistribution = "Mandriva" + sVendor = "MandrivaSoft" + sRelease = "1mdv" + + Case "fedora" + sDistribution = "Fedora" + sVendor = "Fedora" + sRelease = "1" + + Case "suse" + sDistribution = "OpenSUSE" + sVendor = "Novell" + sRelease = "1suse" + + End Select + + ' step 1, set up RPM dirs and macros if they're not there already + + AddLog(("Initializing ~/RPM directory.")) + + For Each sCmd In ["RPM/", "RPM/BUILD/", "RPM/RPMS/", "RPM/SOURCES/", "RPM/SPECS/", "RPM/SRPMS/", "RPM/tmp/"] + Try Mkdir $sHome &/ sCmd + Next + + hFile = Open $sHome &/ ".rpmmacros" For Create + Print #hFile, "%_topdir " & $sHome &/ "RPM" + Print #hFile, "%_tmppath " & $sHome &/ "RPM/tmp" + 'PRINT #hFile, "%_signature gpg" + 'PRINT #hFile, "%_gpg_name Mandrivalinux" + 'PRINT #hFile, "%_gpg_path ~/.gnupg" + Print #hFile, "%packager "; Project.Maintainer & "<" & SConv(Project.Address) & ">" + Print #hFile, "%buildhost "; System.Host + Print #hFile, "%distribution "; sDistribution + Print #hFile, "%vendor "; If($sVendor, $sVendor, sVendor) + Close #hFile + + ' step 2, write source tarball (with bzip) to SOURCES dir + + AddLog(("Creating .spec file.")) + + hFile = Open $sHome &/ "RPM/SPECS" &/ sPackageName & ".spec" For Create + + Print #hFile, "%define name " & sPackageName + Print #hFile, "%define version " & $sVersion + Print #hFile, "%define release "; sRelease + + Print #hFile + Print #hFile, "Summary: "; sSupport; " support for "; IIf(Project.Title, Project.Title, Project.Name) + Print #hFile, "Name: %{name}" + Print #hFile, "Version: %{version}" + Print #hFile, "Release: %{release}" + 'Print #hFile, "Source0: " '"%{name}-%{version}.tar.bz2" + Print #hFile, "License: "; If(Project.License, Project.License, "GPL") + Print #hFile, "Group: " & Project.Groups[sSys] + 'Print #hFile, "BuildRoot: %{_tmppath}/%{name}-%{version}-${release}-buildroot" + Print #hFile, "Prefix: %{_prefix}" + 'PRINT #hFile, "BuildRequires: gambas2-ide" + Print #hFile, "BuildArch: noarch" + + Print #hFile, "Requires: "; FormatRpmPackageName($sUnsafePackageName);; ">=";; $sVersion;; ","; FormatRpmPackageName($sUnsafePackageName);; "<=";; $sVersion; GetDependencies(aComp) + + Print #hFile + + Print #hFile, "AutoReqProv: no" + + Print #hFile, "\n%description\n"; "This is the "; sSupport; " support for "; Project.Name + + Print #hFile, "\n%files" + Print #hFile, "%defattr(-,root,root)" + + Print #hFile, "\n%changelog\n" + Print #hFile, ChangeLog + + Close #hFile + + ' and step 4.... build that sucker. + + AddLog(("Creating package...") & "\n") + + sLang = System.Language + System.Language = "C" + + sCmd = RPMBUILD_PROG & " -ba " & Shell$($sHome &/ "RPM/SPECS" &/ sPackageName & ".spec") + AddLog(sCmd) + + 'sTemp = Temp$ + $sOutput = "" + $bEnd = False + Shell sCmd & " 2>&1" Wait For Read As "Process" 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + AddLog("") + + sOutput = Replace($sOutput, "\r", "") + Try sOutput = DConv(sOutput) + + Try Kill $sHome &/ ".rpmmacros" + + System.Language = sLang + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'rpmbuild' has returned the following error code:") & " " & Process.LastValue) + + For Each sCmd In Split(sOutput, "\n") + If Left(sCmd, 6) = "Wrote:" And Right$(sCmd, 10) = "noarch.rpm" Then + + sPackage = Subst("&1-&2-&3.noarch.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/RPMS/noarch") & "; fakeroot " & ALIEN_PROG & " --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/RPMS/noarch" &/ sPackage) THEN Error.Raise("alien command has failed") + ' ENDIF + MoveFile($sHome &/ "RPM/RPMS/noarch" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + + sPackage = Subst("&1-&2-&3.src.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/SRPMS") & "; fakeroot alien --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/SRPMS" &/ sPackage) THEN Error.Raise("alien command has failed") + ' MoveFile(sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ File.BaseName(sPackage) & ".src.deb") + ' ELSE + MoveFile($sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + ' ENDIF + + End If + Next + +End + +Private Sub PrintSlackDescRuler(hFile As File, sPackageName As String) + + Dim sLine As String + + sLine = Space(Len(sPackageName)) & "|-----handy-ruler" & String$(76, "-") + sLine = Left(sLine, 75) & "|" + Print #hFile, sLine + +End + +Private Sub PrintSlackDesc(hFile As File, sLine As String, sPackageName As String) + + sLine = sPackageName & ": " & sLine + sLine = Left(sLine, 76) + Print #hFile, sLine + +End + + +Private Sub PrintSlackDescContents(hFile As File, sData As String, nLine As Integer, sPackageName As String) + + Dim sLine As String + Dim iPos As Integer + + While nLine + If sData Then + If Len(sData) > (76 - Len(sPackageName) - 2) Then + sLine = Left(sData, 76 - Len(sPackageName) - 2) + iPos = RInStr(sLine, " ") + If iPos Then sLine = RTrim(Left(sLine, iPos - 1)) + sData = LTrim(Mid$(sData, Len(sLine) + 1)) + Else + sLine = sData + sData = "" + Endif + Else + sLine = "" + Endif + PrintSlackDesc(hFile, sLine, sPackageName) + Dec nLine + Wend + +End + +Private Sub FormatTgzPackageName(sName As String) As String + + ' Use the same format as RPM at the moment + Return FormatRpmPackageName(sName) + +End + +Private Sub MakeTgzPackage(sSys As String) + + Dim sDistribution As String + Dim sVendor As String + Dim sBuildDir As String + Dim hFile As File + 'Dim sPrefix As String + Dim sCmd As String + Dim sIcon As String + Dim sData As String + Dim sTempPackage As String + Dim sPackage As String + Dim sFile As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = "&1\n" + $sFormatMin = "&1 >= &2\n" + $sFormatMax = "&1 < &3\n" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatTgzPackageName($sUnsafePackageName) + sDistribution = "Slackware" + sVendor = "Slackware" + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("slackware"), "") + Shell "rm -rf " & Shell(sBuildDir) Wait + Mkdir sBuildDir + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + For Each sCmd In ["/usr", "/usr/lib", "/usr/lib/gambas" & System.Version, "/usr/share", "/usr/share/gambas" & System.Version, "/usr/share/gambas" & System.Version & "/info", "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + Case Project.TYPE_LIBRARY + + For Each sCmd In ["/usr", "/usr/lib", "/usr/lib/gambas" & System.Version, "/usr/lib/gambas" & System.Version &/ LCase($sVendor), "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + Case Project.TYPE_NORMAL + + For Each sCmd In ["/usr", "/usr/bin", "/usr/share", "/usr/share/applications", "/usr/share/pixmaps", "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + End Select + + CopyExtraFiles(sSys, sBuildDir) + + If Project.Type = Project.TYPE_COMPONENT Then + + ' 2. Copy the library, the information files and the controls + + Copy Project.GetExecPath() To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ $sComponentName & ".gambas" + Copy Project.Dir &/ ".component" To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Copy Project.Dir &/ ".info" To sBuildDir &/ "/usr/share/gambas" & System.Version &/ "info/" & $sComponentName & ".info" + Copy Project.Dir &/ ".list" To sBuildDir &/ "/usr/share/gambas" & System.Version &/ "info/" & $sComponentName & ".list" + + If Exist(Project.Dir &/ ".hidden/control") Then + Try Mkdir sBuildDir &/ "/usr/share/gambas" & System.Version & "/control" + Try Mkdir sBuildDir &/ "/usr/share/gambas" & System.Version & "/control/" & $sComponentName + For Each sFile In Dir(Project.Dir &/ ".hidden/control", "*.png") + Copy Project.Dir &/ ".hidden/control" &/ sFile To sBuildDir &/ "/usr/share/gambas" & System.Version & "/control/" & $sComponentName &/ sFile + Next + Endif + + Else + + ' 2. Copy the executable + + 'COPY Project.Dir &/ Project.Name & ".gambas" TO sBuildDir &/ "/usr/bin" &/ Project.Name + + If Project.Type = Project.TYPE_NORMAL Then + Copy Project.GetExecPath() To sBuildDir &/ "/usr/bin" &/ $sName + Chmod sBuildDir &/ "/usr/bin" &/ $sName To "..x..x..x" + Else If Project.Type = Project.TYPE_LIBRARY Then + Copy Project.GetExecPath() To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" + Chmod sBuildDir &/ "/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" To "..x..x..x" + Endif + + If Project.Type = Project.TYPE_NORMAL Then + + ' 3. Copy the icon + + ' IF Project.Icon THEN + ' hIcon = Image.Load(Project.Dir &/ Project.Icon) + ' ELSE + ' hIcon = Image.Load("img/gambas.png") + ' ENDIF + + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sBuildDir &/ "/usr/share/pixmaps" &/ Project.Name & ".png") + + ' 4. Make the desktop file + + sIcon = Shell$($sName) & ".png" + + hFile = Open sBuildDir &/ "/usr/share/applications/" & sPackageName & ".desktop" For Create + + PrintDesktopFile(hFile, "/usr/bin/" & $sName, "/usr/share/pixmaps/" & $sName & ".png") + + Close #hFile + + Endif + + Endif + + ' 5. Description file + + hFile = Open sBuildDir &/ "/install/slack-desc" For Create + + Print #hFile, File.Load("install/slack-desc-header"); + PrintSlackDescRuler(hFile, sPackageName) + PrintSlackDesc(hFile, Subst("&1 &2: &3", sPackageName, $sVersion, If(Project.Title, Project.Title, Project.Name)), sPackageName) + PrintSlackDesc(hFile, "", sPackageName) + sData = Replace($sDescription, "\n", " ") + PrintSlackDescContents(hFile, sData, 7, sPackageName) + PrintSlackDesc(hFile, "Package created by: " & Project.Maintainer, sPackageName) + PrintSlackDesc(hFile, "EMail address: " & Project.Address, sPackageName) + + Close #hFile + + ' 6. Dependencies + + hFile = Open sBuildDir &/ "/install/slack-required" For Create + + Print #hFile, "gambas"; System.Version; "-runtime >= "; MIN_VERSION + Print #hFile, "gambas"; System.Version; "-runtime < "; MAX_VERSION + + If Project.Type <> Project.TYPE_COMPONENT Then + + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + + Endif + + Close #hFile + + ' 7. Create package + + AddLog(("Creating package...") & "\n") + + sTempPackage = File.SetExt(Temp$("slackware"), "tgz") + sCmd = TAR_1_13_PROG & " --exclude=slackware.tgz --owner=root --group=root -c -z -f " & Shell$(sTempPackage) & " ." + RunCommand(sCmd, sBuildDir) + ' AddLog(sCmd) + ' $sOutput = "" + ' $bEnd = FALSE + ' SHELL "(cd " & SConv(Shell$(sBuildDir)) & ";" & sCmd & ") 2>&1" FOR READ 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'tar' has returned the following error code:") & " " & Process.LastValue) + + AddLog("") + sPackage = Subst("&1-&2-noarch-&3.tgz", sPackageName, $sVersion, CStr(Project.PackageVersion)) + MoveFile(sTempPackage, Path &/ sPackage) + AddLog(sPackage) + +End + +Private Sub MakeTgzSupportPackage((sSys) As String, sSupport As String, aComp As String[]) + + Dim sDistribution As String + Dim sVendor As String + Dim sBuildDir As String + Dim hFile As File + 'Dim sPrefix As String + Dim sCmd As String + Dim sData As String + Dim sTempPackage As String + Dim sPackage As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = "&1\n" + $sFormatMin = "&1 >= &2\n" + $sFormatMax = "&1 < &3\n" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatTgzPackageName($sUnsafePackageName) & "-" & sSupport + sDistribution = "Slackware" + sVendor = "Slackware" + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("slackware"), "") + Shell "rm -rf " & Shell(sBuildDir) Wait + Mkdir sBuildDir + Try Mkdir sBuildDir &/ "install" + + ' 5. Description file + + hFile = Open sBuildDir &/ "/install/slack-desc" For Create + + Print #hFile, File.Load("install/slack-desc-header"); + PrintSlackDescRuler(hFile, sPackageName) + PrintSlackDesc(hFile, Subst("&1 &2: &3", sPackageName, $sVersion, sSupport & " support for " & IIf(Project.Title, Project.Title, Project.Name)), sPackageName) + PrintSlackDesc(hFile, "", sPackageName) + sData = sSupport & " support for " & IIf(Project.Title, Project.Title, Project.Name) + PrintSlackDescContents(hFile, sData, 7, sPackageName) + PrintSlackDesc(hFile, "Package created by: " & Project.Maintainer, sPackageName) + PrintSlackDesc(hFile, "EMail address: " & Project.Address, sPackageName) + + Close #hFile + + ' 6. Dependencies + + hFile = Open sBuildDir &/ "/install/slack-required" For Create + + Print #hFile, FormatTgzPackageName($sUnsafePackageName); " >= "; $sVersion + Print #hFile, FormatTgzPackageName($sUnsafePackageName); " <= "; $sVersion + Print #hFile, GetDependencies(aComp); + + Close #hFile + + ' 7. Create package + + AddLog(("Creating package...") & "\n") + + sTempPackage = File.SetExt(Temp$("slackware"), "tgz") + sCmd = TAR_1_13_PROG & " --exclude=slackware.tgz --owner=root --group=root -c -z -f " & Shell$(sTempPackage) & " ." + RunCommand(sCmd, sBuildDir) + ' AddLog(sCmd) + ' $sOutput = "" + ' $bEnd = FALSE + ' SHELL "(cd " & SConv(Shell$(sBuildDir)) & ";" & sCmd & ") 2>&1" FOR READ 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'tar' has returned the following error code:") & " " & Process.LastValue) + + AddLog("") + sPackage = Subst("&1-&2-noarch-&3.tgz", sPackageName, $sVersion, CStr(Project.PackageVersion)) + MoveFile(sTempPackage, Path &/ sPackage) + AddLog(sPackage) + +End + +Private Sub MakeAutotoolsPackage((sSys) As String) + + Dim sBuildDir As String + Dim sFile As String + Dim hFile As File + Dim sCmd As String + Dim sPackage As String + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + Inc Application.Busy + + sBuildDir = File.SetExt(Temp$("autotools"), "") + Shell "rm -rf " & Shell(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + Try sCmd = Scan(Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False), "*/bin/gbc" & System.Version & " *")[1] + + 'Mkdir sBuildDir &/ Project.Name + Shell "cp -rL " & Shell$(Project.Dir) & " " & Shell$(sBuildDir &/ Project.Name) Wait + sFile = Replace(File.Load("install/acinclude.m4"), "$(VERSION)", CStr(System.Version)) + sFile = Replace(sFile, "$(PACKAGE_VERSION)", $sVersion) + sFile = Replace(sFile, "$(EXTRA_TEST)", Project.ExtraAutoconfTest) + File.Save(sBuildDir &/ "acinclude.m4", sFile) + sFile = Replace(File.Load("install/Makefile.am"), "$(VERSION)", CStr(System.Version)) + sFile = Replace(sFile, "$(COMPILE_FLAGS)", sCmd) + File.Save(sBuildDir &/ "Makefile.am", sFile) + + ' 3. Create needed files (AUTHORS, README, COPYING, NEWS, ChangeLog, configure.ac) + + If Exist(sBuildDir &/ Project.Name &/ "CHANGELOG") Then + Move sBuildDir &/ Project.Name &/ "CHANGELOG" To sBuildDir &/ "ChangeLog" + Endif + + File.Save(sBuildDir &/ "ChangeLog", ChangeLog) + File.Save(sBuildDir &/ "AUTHORS", Project.Maintainer & " <" & Project.Address & ">") + File.Save(sBuildDir &/ "README", Project.Description) + File.Save(sBuilddir &/ "COPYING", "This program is under : " & Project.License) + File.Save(sBuilddir &/ "NEWS", "") + + hFile = Open sBuildDir &/ "configure.ac" For Create + Print #hFile, "dnl -- package generated with gambas3 ide --" + Print #hFile, "" + Print #hFile, "AC_INIT(configure.ac)" + If Project.Type = Project.TYPE_COMPONENT Then + Print #hFile, "GB_INIT_PROJECT([" & Project.Name & "],[" & $sComponentName & "])" + Else + Print #hFile, "GB_INIT_PROJECT([" & Project.Name & "])" + Endif + Print #hFile, "" + Print #hFile, "dnl -- create makefile --" + Print #hFile, "" + Print #hFile, "AC_OUTPUT(Makefile)" + Close #hFile + + ' 4. create the package + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["aclocal", AUTOCONF_PROG, AUTOMAKE_PROG & " -a", "./configure", "make dist"] + RunCommand(sCmd, sBuildDir) + Next + + Dec Application.Busy + AddLog("") + + sPackage = Dir(sBuildDir, Project.Name & "*" & $sVersion & "*")[0] + MoveFile(sBuildDir &/ sPackage, Path &/ GetPackagePrefix(Project.Type, $sVendor, $sVendorPrefix, Project.Prefix) & sPackage) + AddLog(sPackage) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + +End + +Private Sub FormatArchPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) Then sCar = "-" + sRes &= sCar + Next + + Return sRes + +End + + +Private Function MakeArchPackage(sSys As String) + + Dim sBuildDir As String + Dim sPkgTgz As String + Dim hFile As File + Dim sCmd As String + Dim sDependencies As String + Dim sPkgDesc As String + Dim sPackageName As String + + Inc Application.Busy + + sPackageName = FormatArchPackageName($sUnsafePackageName) + + sPkgDesc = Replace($sDescription, "\n", " ") + + If sPkgDesc = "" Then sPkgDesc = "a software done with Gambas3" + + $sFormatMinMax = "'&1>=&2' '&1<=&3' " + $sFormatMin = "'&1>=&2' " + $sFormatMax = "'&1<=&3' " + $sFormatSingle = "'&1' " + $sFormatEqual = "'&1=&2' " + sDependencies = GetDependencies() & GetExtraDependencies(sSys) + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("archlinux"), "") + Shell "rm -rf " & Shell$(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + sPkgTgz = $sName & "-" & $sVersion & ".tar.bz2" + Project.MakeSourcePackageTo(sBuildDir &/ sPkgTgz) + + File.Save(sBuilddir &/ "license.txt", "This program is under : " & Project.License) + + If Project.Type = Project.TYPE_NORMAL Then + + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sBuildDir &/ Project.Name & ".png") + + hFile = Open sBuildDir &/ sPackageName & ".desktop" For Create + PrintDesktopFile(hFile, "/usr/bin/" & $sName, "/usr/share/pixmaps/" & $sName & ".png") + Close #hFile + + Endif + + hFile = Open sBuildDir &/ "PKGBUILD" For Create + Print #hFile, "# generated by the gambas3 ide" + Print #hFile, "# Maintainer : " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile, "" + Print #hFile, "pkgname="; sPackageName + Print #hFile, "_realname="; $sName + Print #hFile, "pkgdesc=\"" & sPkgDesc & "\"" + Print #hFile, "pkgver=" & $sVersion + Print #hFile, "pkgrel=1" + Print #hFile, "arch=('any')" + Print #hFile, "url=\"" & Project.Url & "\"" + If Me.ChangeLog Then + File.Save(sBuildDir &/ "ChangeLog", Me.ChangeLog) + Print #hFile, "changelog=ChangeLog" + Endif + Print #hFile, "license=('custom')" + If Len(sDependencies) > 0 Then + Print #hFile, "depends=(" & Left$(sDependencies, -1) & ")" + Endif + Print #hFile, "makedepend=('gambas3-devel')" + Print #hFile, "source=(${_realname}-$pkgver.tar.bz2 license.txt"; + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, "\\\n '" & sPackageName & ".desktop'"; + Print #hFile, " '" & Project.Name & ".png'"; + Endif + Print #hFile, ")" + Close #hFile + + RunCommand("makepkg -g >> PKGBUILD", sBuildDir) + + hFile = Open sBuildDir &/ "PKGBUILD" For Append + + Print #hFile, "" + Print #hFile, "build() {" + Print #hFile, " cd ${srcdir}/${_realname}" + Print #hFile, "" + Print #hFile, " "; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False); " && gba"; System.Version + Print #hFile, "}" + Print #hFile, "" + Print #hFile, "package() {" + Print #hFile, " cd ${srcdir}/${_realname}" + Print #hFile, "" + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version + Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "info" + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".gambas" + Print #hFile, " install .component ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Print #hFile, " chmod a-x ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Print #hFile, " install .info ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".info" + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".info" + Print #hFile, " install .list ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".list" + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".list" + Print #hFile, " if test -d control; then" + Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + Print #hFile, " install .hidden/control/*.png ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName &/ "*.png" + Print #hFile, " fi" + + Case Project.TYPE_LIBRARY + + Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version &/ LCase($sVendor) + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" + + Case Project.TYPE_NORMAL + + Print #hFile, " install -d ${pkgdir}/usr/bin" + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName + Print #hFile, " install -D .." &/ Project.Name & ".png \\" + Print #hFile, " ${pkgdir}/usr/share/pixmaps" &/ Project.Name & ".png" + Print #hFile, " install -D .." &/ sPackageName & ".desktop \\" + Print #hFile, " ${pkgdir}/usr/share/applications" &/ sPackageName & ".desktop" + + End Select + + Print #hFile, GetExtraFilesDir(sSys, " install -d ${pkgdir}&1"); + Print #hFile, GetExtraFiles(sSys, " install -p ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1", " cp -R --preserve=timestamp ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1"); + Print #hFile, " install -Dm644 ${srcdir}/license.txt ${pkgdir}/usr/share/licenses" &/ sPackageName &/ "license.txt" + Print #hFile, "}" + + Close #hFile + + ' 4. create the packages + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["makepkg --allsource", "makepkg -d"] + RunCommand(sCmd, sBuildDir) + Next + + RunCommand("cp " & sPackageName & "-" & $sVersion & "-1*.tar.* " & Shell$(Path) &/ "", sBuildDir) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + + Dec Application.Busy + +End + +Private Function MakeArchSupportPackage((sSys) As String, sSupport As String, aComp As String[]) + + Dim sBuildDir As String + Dim hFile As File + Dim sCmd As String + Dim sDependencies As String + Dim sPkgDesc As String + Dim sPackageName As String + + Inc Application.Busy + + sPackageName = FormatArchPackageName($sUnsafePackageName & "-" & sSupport) + + sPkgDesc = "This is the " & sSupport & " support for " & If(Project.Title, Project.Title, Project.Name) + + $sFormatMinMax = "'&1>=&2' '&1<=&3' " + $sFormatMin = "'&1>=&2' " + $sFormatMax = "'&1<=&3' " + $sFormatSingle = "'&1' " + $sFormatEqual = "'&1=&2' " + + sDependencies = GetDependencies(aComp) + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("archlinux"), "") + Shell "rm -rf " & Shell$(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + File.Save(sBuilddir &/ "license.txt", "This program is under : " & Project.License) + + hFile = Open sBuildDir &/ "PKGBUILD" For Create + Print #hFile, "# generated by the gambas3 ide" + Print #hFile, "# Maintainer : " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile, "" + Print #hFile, "pkgname=" & sPackageName + Print #hFile, "_realname="; sPackageName + Print #hFile, "pkgdesc=\"" & sPkgDesc & "\"" + Print #hFile, "pkgver=" & $sVersion + Print #hFile, "pkgrel="; Project.PackageVersion + Print #hFile, "arch=('any')" + Print #hFile, "url=\"" & Project.Url & "\"" + If Me.ChangeLog Then + File.Save(sBuildDir &/ "ChangeLog", Me.ChangeLog) + Print #hFile, "changelog=ChangeLog" + Endif + Print #hFile, "license=('custom')" + If Len(sDependencies) > 0 Then + Print #hFile, "depends=(" & Subst($sFormatEqual, FormatArchPackageName($sUnsafePackageName), $sVersion) & Left$(sDependencies, -1) & ")" + Endif + 'Print #hFile, "makedepend=('gambas3-devel')" + 'Print #hFile, "source=(${_realname}-$pkgver.tar.bz2 license.txt"; + 'If Project.Type = Project.TYPE_NORMAL Then + ' Print #hFile, "\\\n '" & $sPackageName & ".desktop'"; + ' Print #hFile, " '" & Project.Name & ".png'"; + 'Endif + 'Print #hFile, ")" + Close #hFile + + RunCommand("makepkg -g >> PKGBUILD", sBuildDir) + + ' hFile = Open sBuildDir &/ "PKGBUILD" For Append + ' + ' Print #hFile, "" + ' Print #hFile, "build() {" + ' Print #hFile, " cd ${srcdir}/${_realname}" + ' Print #hFile, "" + ' Print #hFile, " "; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False); " && gba"; System.Version + ' Print #hFile, "}" + ' Print #hFile, "" + ' Print #hFile, "package() {" + ' Print #hFile, " cd ${srcdir}/${_realname}" + ' Print #hFile, "" + ' + ' Select Case Project.Type + ' + ' Case Project.TYPE_COMPONENT + ' + ' Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version + ' Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "info" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version + ' Print #hFile, " install .component ${pkgdir}/usr/lib/gambas" & System.Version &/ $sName & ".component" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/lib/gambas" & System.Version &/ $sName & ".component" + ' Print #hFile, " install .info ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".info" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".info" + ' Print #hFile, " install .list ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".list" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".list" + ' Print #hFile, " if test -d control; then" + ' Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName + ' Print #hFile, " install .hidden/control/*.png ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName &/ "*.png" + ' Print #hFile, " fi" + ' + ' Case Project.TYPE_LIBRARY + ' + ' Print #hFile, " install -d ${pkgdir}/usr/bin" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName & ".gambas" + ' + ' Case Project.TYPE_NORMAL + ' + ' Print #hFile, " install -d ${pkgdir}/usr/bin" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName + ' Print #hFile, " install -D .." &/ Project.Name & ".png \\" + ' Print #hFile, " ${pkgdir}/usr/share/pixmaps" &/ Project.Name & ".png" + ' Print #hFile, " install -D .." &/ $sPackageName & ".desktop \\" + ' Print #hFile, " ${pkgdir}/usr/share/applications" &/ $sPackageName & ".desktop" + ' + ' End Select + ' + ' Print #hFile, GetExtraFilesDir(sSys, " install -d ${pkgdir}&1\n"); + ' Print #hFile, GetExtraFiles(sSys, " install -p ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1", " cp -R --preserve=timestamp ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1"); + ' Print #hFile, " install -Dm644 ${srcdir}/license.txt ${pkgdir}/usr/share/licenses" &/ $sPackageName &/ "license.txt" + ' Print #hFile, "}" + ' + ' Close #hFile + + ' 4. create the packages + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["makepkg --allsource", "makepkg -d"] + RunCommand(sCmd, sBuildDir) + Next + + RunCommand("cp " & sPackageName & "-" & $sVersion & "-" & CStr(Project.PackageVersion) & "*.tar.* " & Shell$(Path) &/ "", sBuildDir) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + + Dec Application.Busy + +End + +Private Sub MoveFile(sSrc As String, sDst As String) + + Try Kill sDst + Try Move sSrc To sDst + If Error Then + Copy sSrc To sDst + Try Kill sSrc + Endif + +End + +Public Sub Process_Kill() + + $bEnd = True + +End + +Public Sub Process_Read() + + Dim sData As String + + sData = Read #Last, -256 + $sOutput &= sData + FMakeInstall.AddLog(sData, True) + +End + +Public Sub Process_Error(sData As String) + + FMakeInstall.AddLog(sData, True) + +End + +Public Sub GetPackageName(sName As String) As String + + sName = LCase(String.RemoveDiacritics(sName)) + sName = Replace(sName, ".", "-") + Return sName + +End + +Public Sub GetPackagePrefix(iProjectType As Integer, sVendor As String, sVendorPrefix As String, bPrefix As Boolean) As String + + Dim sText As String + Dim sPackage As String + Dim sPrefix As String + + If iProjectType = Project.TYPE_COMPONENT Then + + sPrefix = String.LCase(Trim(sVendorPrefix)) + If Not sPrefix Then sPrefix = "gb" + + sPackage = GetPackageName(Project.Name) + If sPackage Begins sPrefix & "-" Or If sPackage = sPrefix Then + sPrefix = "" + Else + sPrefix &= "-" + Endif + sText = "gambas" & System.Version & "-" & sPrefix + + Else + + If bPrefix Then + + sPrefix = sVendorPrefix + If Not sPrefix Then sPrefix = sVendor + sPrefix = String.LCase(Trim(sPrefix)) + sPrefix = Replace(sPrefix, "_", "-") + + If Not sPrefix Then sPrefix = "gambas" + + sText = sPrefix & "-" + + Endif + + Endif + + Return sText + +End + +Public Sub GetPackageFullName(sVendor As String, sVendorPrefix As String, bPrefix As Boolean, bWithVersion As Boolean) As String + + Dim sText As String + + sText = GetPackagePrefix(Project.Type, sVendor, sVendorPrefix, bPrefix) & GetPackageName(Project.Name) + If bWithVersion Then sText &= "-" & Project.FormatVersion() + Return sText + +End