diff --git a/gnu/local.mk b/gnu/local.mk
index e8c807cf63..2e632ca2c3 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -310,6 +310,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/ftp.scm				\
   %D%/packages/fribidi.scm			\
   %D%/packages/fvwm.scm				\
+  %D%/packages/gambas.scm			\
   %D%/packages/game-development.scm		\
   %D%/packages/games.scm			\
   %D%/packages/gawk.scm				\
@@ -1333,6 +1334,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/fuzzylite-soften-float-equality.patch	\
   %D%/packages/patches/fxdiv-system-libraries.patch		\
   %D%/packages/patches/gajim-honour-GAJIM_PLUGIN_PATH.patch	\
+  %D%/packages/patches/gambas-fix-desktop-file-creation.patch	\
   %D%/packages/patches/ganeti-disable-version-symlinks.patch	\
   %D%/packages/patches/ganeti-haskell-pythondir.patch		\
   %D%/packages/patches/ganeti-lens-compat.patch			\
diff --git a/gnu/packages/gambas.scm b/gnu/packages/gambas.scm
new file mode 100644
index 0000000000..632f3134b9
--- /dev/null
+++ b/gnu/packages/gambas.scm
@@ -0,0 +1,172 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2025 宋文武 <iyzsong@envs.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages gambas)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix gexp)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (gnu packages )
+  #:use-module (gnu packages audio)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages crypto)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages databases)
+  #:use-module (gnu packages gettext)
+  #:use-module (gnu packages gl)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gstreamer)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages libffi)
+  #:use-module (gnu packages mail)
+  #:use-module (gnu packages maths)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages pcre)
+  #:use-module (gnu packages pdf)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages qt)
+  #:use-module (gnu packages sdl)
+  #:use-module (gnu packages video)
+  #:use-module (gnu packages sqlite)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages webkit)
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg))
+
+(define-public gambas
+  (package
+    (name "gambas")
+    (version "3.20.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://gitlab.com/gambas/gambas")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1fw3nark7vaw4vbmdvaaqb0an4838k0hhwwvc3dqd7f2033d41xq"))
+       (patches
+        (search-patches "gambas-fix-desktop-file-creation.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:bootstrap-scripts #~'("reconf-all")
+      ;; XXX: Gambas executables expect a '#! /usr/bin/env gbr3' shebang.
+      #:patch-shebangs? #f
+      #:configure-flags
+      #~(list
+         (string-append "--with-inotify-includes="
+                        #$(this-package-input "glibc")
+                        "/include")
+         (string-append "--with-crypt-libraries="
+                        #$(this-package-input "libxcrypt")
+                        "/lib")
+         (string-append "--with-gmp-includes="
+                        #$(this-package-input "gmp")
+                        "/include")
+         (string-append "--with-gmp-libraries="
+                        #$(this-package-input "gmp")
+                        "/lib")
+         (string-append "--with-mysql-includes="
+                        #$(this-package-input "mysql")
+                        "/include/mysql")
+         (string-append "--with-mysql-libraries="
+                        #$(this-package-input "mysql")
+                        "/lib")
+         (string-append "--with-postgresql-includes="
+                        #$(this-package-input "postgresql")
+                        "/include")
+         (string-append "--with-postgresql-libraries="
+                        #$(this-package-input "postgresql")
+                        "/lib")
+         (string-append "--with-bzlib2-includes="
+                        #$(this-package-input "bzip2")
+                        "/include")
+         (string-append "--with-bzlib2-libraries="
+                        #$(this-package-input "bzip2")
+                        "/lib"))))
+    (native-inputs
+     (list autoconf
+           automake
+           libtool
+           gettext-minimal
+           pkg-config))
+    (inputs
+     (list alure
+           bzip2
+           cairo
+           curl
+           dbus
+           gdk-pixbuf
+           glew
+           glibc
+           glu
+           gmime
+           gmp
+           gsl
+           gst-plugins-base
+           gstreamer
+           gtk+
+           imlib2
+           libffi
+           libgnome-keyring
+           libice
+           libsm
+           libxcrypt
+           libxml2
+           libxslt
+           libxtst
+           (list zstd "lib")
+           mesa
+           mysql
+           ncurses
+           openal
+           openssl
+           pcre2
+           poppler
+           postgresql
+           qtbase
+           qtbase-5
+           qtsvg
+           qtsvg-5
+           qtwebengine
+           qtwebengine-5
+           qtx11extras
+           sdl2
+           sdl2-image
+           sdl2-mixer
+           sdl2-ttf
+           sqlite
+           unixodbc
+           v4l-utils
+           webkitgtk-for-gtk3
+           zlib))
+    (home-page "https://gambas.sourceforge.net/")
+    (synopsis "Object-oriented language and development platform")
+    (description
+     "GAMBAS is a free implementation of a graphical development environment
+based on a BASIC interpreter and a full development platform.  It is very
+inspired by Visual Basic and Java.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/patches/gambas-fix-desktop-file-creation.patch b/gnu/packages/patches/gambas-fix-desktop-file-creation.patch
new file mode 100644
index 0000000000..348eac1881
--- /dev/null
+++ b/gnu/packages/patches/gambas-fix-desktop-file-creation.patch
@@ -0,0 +1,36 @@
+From 33ede510e056c8580346d2652b9dd0e1a1a1d961 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= <iyzsong@member.fsf.org>
+Date: Fri, 31 Jan 2025 15:55:55 +0800
+Subject: [PATCH] Store the temporary application desktop file in the
+ $XDG_DATA_HOME directory.
+
+[GB.GUI.BASE]
+* BUG: Store the temporary application desktop file in the $XDG_DATA_HOME directory.
+
+Upstream-status: Submitted to Benoît Minisini <benoit.minisini@gambas-basic.org>
+---
+ comp/src/gb.gui.base/.src/_Gui.class | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+diff --git a/comp/src/gb.gui.base/.src/_Gui.class b/comp/src/gb.gui.base/.src/_Gui.class
+index 3cdee23da..5c9a49f93 100644
+--- a/comp/src/gb.gui.base/.src/_Gui.class
++++ b/comp/src/gb.gui.base/.src/_Gui.class
+@@ -131,13 +131,7 @@ Static Public Sub _InitApp() As String
+   Dim iPos As Integer
+   
+   $sAppId = "org.gambas." & CStr(Application.Handle)
+-  
+-  For Each sDir In Split(Env["XDG_DATA_DIRS"], ":")
+-    If sDir Begins (User.Home & "/") Then Break
+-    sDir = ""
+-  Next
+-  
+-  If Not sDir Then sDir = User.Home &/ ".local/share"
++  sDir = GetDir("XDG_DATA_HOME", User.Home &/ ".local/share")
+   sDir &/= "applications"
+   
+   Main.MkDir(sDir)
+-- 
+2.47.1
+
