Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FirebirdSQL server #5837

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 147 additions & 0 deletions cross/firebird/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
PKG_NAME = firebird
PKG_VERS = 4.0.3
PKG_EXT = tar.gz
PKG_DIST_NAME = v$(PKG_VERS).$(PKG_EXT)
PKG_DIST_SITE = https://github.com/FirebirdSQL/firebird/archive/refs/tags
PKG_DIST_FILE = $(PKG_NAME)-$(PKG_VERS).$(PKG_EXT)
PKG_DIR = $(PKG_NAME)-$(PKG_VERS)

DEPENDS = cross/zlib cross/libicu native/libicu native/libtool

UNSUPPORTED_ARCHS = $(ARMv5_ARCHS) $(OLD_PPC_ARCHS)

# Create proper src/make.synology.evansport to support this
UNSUPPORTED_ARCHS += $(i686_ARCHS)

# Uses too old GCC 4.9
UNSUPPORTED_ARCHS += comcerto2k

include ../../mk/spksrc.common.mk

# Currently v4.0.2 works only with 7.0 and 7.1
# DSM 7.2 has issues with GLIBC version
# DSM 6.x has issues with some C++ libraries versions
ifeq ($(call version_lt,$(TCVERSION),7.0)$(call version_gt,$(TCVERSION),7.1),1)
UNSUPPORTED_ARCHS += $(ARCH)
endif

HOMEPAGE = https://www.firebirdsql.org/
COMMENT = Firebird is a relational database offering many ANSI SQL standard features that runs on Linux, Windows, MacOS and a variety of Unix platforms.
LICENSE = MPL
MAINTAINER = vitkabele

PRE_CONFIGURE_TARGET = firebird_pre_configure

CONFIGURE_TARGET = firebird_configure

COMPILE_TARGET = firebird_compile

INSTALL_TARGET = firebird_install

# We must forward-declare the PKGVAR here as we must compile its value to the
# binaries. We only support DSM7 so we do not worry about DSM6 compatibility
SYNOPKG_PKGVAR = /var/packages/$(PKG_NAME)/var
SYNOPKG_PKGDEST = /var/packages/$(PKG_NAME)/target

ADDITIONAL_CFLAGS = '-DFB_PREFIX="\"$(SYNOPKG_PKGDEST)\""' \
'-DFB_SECDBDIR="\"$(SYNOPKG_PKGVAR)\""' \
'-DFB_GUARDDIR="\"$(SYNOPKG_PKGVAR)\""' \
'-DFB_CONFDIR="\"$(SYNOPKG_PKGVAR)\""' \
'-DFB_SBINDIR="\"$(SYNOPKG_PKGDEST)/bin\""' \
'-DFB_BINDIR="\"$(SYNOPKG_PKGDEST)/bin\""' \
'-DFB_DOCDIR="\"$(SYNOPKG_PKGDEST)/doc\""' \
'-DFB_HELPDIR="\"$(SYNOPKG_PKGDEST)/help\""' \
'-DFB_SAMPLEDIR="\"$(SYNOPKG_PKGDEST)/examples\""' \
'-DFB_PLUGDIR="\"$(SYNOPKG_PKGDEST)/plugins\""' \
'-DFB_SAMPLEDBDIR="\"$(SYNOPKG_PKGDEST)/examples/empbuild\""' \
'-DFB_TZDATADIR="\"$(SYNOPKG_PKGDEST)\""' \
'-DFB_MISCDIR="\"$(SYNOPKG_PKGDEST)/misc\""' \
'-DFB_MSGDIR="\"$(SYNOPKG_PKGDEST)\""' \
'-DFB_INCDIR="\"$(SYNOPKG_PKGDEST)/include\""' \
'-DFB_INTLDIR="\"$(SYNOPKG_PKGDEST)/intl\""' \
'-DFB_LIBDIR="\"$(SYNOPKG_PKGDEST)/lib\""' \
'-DFB_LOGDIR="\"$(SYNOPKG_PKGVAR)\""'
Comment on lines +46 to +63
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a missunderstanding
SYNOPKG_* variables are for installer only (i.e. service-setup.sh), not for building packages

for Makefiles you have to use the Makefile Variables as documented in the wiki
like STAGING_INSTALL_PREFIX

Copy link
Contributor

@hgy59 hgy59 Aug 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If FirebirdSQL follows the known rules, you only have to define FB_PREFIX and other subfolders are defaulted to ${FB_PREFIX}/bin, ${FB_PREFIX}/lib, ...}

you should only require the variables

  • INSTALL_PREFIX
  • INSTALL_PREFIX_VAR

normally you do not define such FB_* variables as compiler flags but as configure options.

the configure arg --prefix=$(INSTALL_PREFIX) should make the definition of ADDITIONAL_CFLAGS += FB_PREFIX=$(INSTALL_PREFIX) obsolete.

NB:
the spksrc framework is designed to use /usr(local/{packagename} as prefix when building a package with the cross Makefile and to use /var/packages/{packagename}/target as prefix when building the package in the spk folder.

Copy link
Contributor Author

@vitkabele vitkabele Aug 23, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for Makefiles you have to use the Makefile Variables as documented in the wiki
like STAGING_INSTALL_PREFIX

As I understand, the STAGING_INSTALL_PREFIX is the location where the files should be copied to be found by the PLIST magic. What I need here is actually the runtime location of the files, because Firebird compiles this information in the binary. If not set properly, it does not find the configuration etc.

If FirebirdSQL follows the known rules, you only have to define FB_PREFIX and other subfolders are defaulted to ${FB_PREFIX}/bin, ${FB_PREFIX}/lib, ...}

This works to a certain extent. With this setup, configuration files are located in $FB_PREFIX, where the installer does not find them. Even if I move them later to $FB_PREFIX/var, the Firebird itself won't find them during startup and crashes.

normally you do not define such FB_* variables as compiler flags but as configure options.

This is true, but the Firebird's build process is non-standard at least. The server is built in two phases, first some native part is built, this is then used to pre-process certain files and then the actual cross toolchain is used to build the binary.

In this process, the --with-fbprefix and similar configure option have only limited usability, because the value from them does not reach the cross phase for the reason you mention in your next comment. The file that should be generated with autoconf is not generated, which is the destination location of the discussed variables.

There is a cli option for firebird server to change the firebird root on startup, but this unfortunately breaks other things. Please see my related question in firebird-support mailing list.

TL;DR The build process cannot handle when install prefix and actual runtime prefix is different. This is the purpose of this -DFB_* fun.


# CXXFLAGS should be set fine by the spksrc for cross-compilation, we will
# use it in cross2 step CROSS_ENV
ADDITIONAL_CXXFLAGS = -Wno-invalid-offsetof $(ADDITIONAL_CFLAGS)

# Path to the libtool installed in the cross/libtool DEPENDS target
# We need the native libtool for building libommath/libtomcrypt in cross1 step
LIBTOOL_BIN = $(WORK_DIR)/../../../native/libtool/work-native/install/usr/local/bin/libtool

# We need both native and cross compilers for building the binary.
include ../../mk/spksrc.cross-cc.mk

# If we use --with-builtin-tomcrypt/math, the libraries are built during cross1
# phase without -fPIC and then refuse to link during cross2 phase. Further,
# they can be built for different platforms during cross1 and cross2 phase.
#
# termlib and editline are disabled because we don't provide ncurses
# and editline libraries
CONFIGURE_ARGS = --without-termlib --with-builtin-tommath --with-builtin-tomcrypt \
--without-editline --with-cross-build=synology.$(ARCH) --prefix=$(INSTALL_PREFIX) \
--with-fbconf=$(INSTALL_PREFIX)/var

NATIVE_LIBICU_DIR := $(WORK_DIR)/../../../native/libicu/work-native/install/usr/local

# CFLAGS and CXXFLAGS for cross1 compile stage
NATIVE_CFLAGS := -I$(NATIVE_LIBICU_DIR)/include -L$(NATIVE_LIBICU_DIR)/lib

# Preprocessor flags
NATIVE_CPPFLAGS := -I$(NATIVE_LIBICU_DIR)/include

# This ENV is for cross1 phase where we build native target
#
# The NATIVE flags must be passed to the configure part, because the configure
# fails when it cant find the headers.
NATIVE_ENV = CC=gcc CXX=g++ AS=as AR=ar LD=ld NM=nm OBJCOPY=objcopy OBJDUMP=objdump \
PARALLEL_MAKE=max \
LIBTOOL="$(LIBTOOL_BIN)" \
CFLAGS="$(NATIVE_CFLAGS)" \
CXXFLAGS="$(NATIVE_CFLAGS)" \
CPPFLAGS="$(NATIVE_CPPFLAGS)"

NATIVE_RUN = cd $(WORK_DIR)/$(PKG_DIR) && env $(NATIVE_ENV)

# DO NOT MODIFY $(ENV) variable (too much) a.k.a. only add variables for ourselves
# and do not modify any CFLAGS or other universally recognized variable
# It breaks compilation of dependent cross/* libraries (especially cross/libicu)
#
# This ENV is for cross2 build phase where we build binaries for target platform
# CROSS_ prefixed vars are for the cross2 phase and we "strip" the CROSS_ prefix
# in our provided src/makefile.xxx
#
# The C(XX)FLAGS variables are ready by the spksrc for cross compilation, we
# just use them
ENV += CROSS_TOOLCHAIN=$(TC_PATH)$(TC_PREFIX)

.PHONY: firebird_pre_configure
firebird_pre_configure:
cp src/make.synology.* $(WORK_DIR)/$(PKG_DIR)/builds/posix/
cp src/cross_config/* $(WORK_DIR)/$(PKG_DIR)/src/include/cross/
$(NATIVE_RUN) NOCONFIGURE=1 ./autogen.sh

# Override the configure target, because we must pass it different env than
# ENV. We cannot modify ENV to contain -I for native/libicu, because it breaks
# compilation of native/libicu, but we must have this -I in the configure
# CFLAGS, otherwise the configure step fails with unicode headers not found.
.PHONY: firebird_configure
firebird_configure:
$(NATIVE_RUN) ./configure $(CONFIGURE_ARGS)

# Firebird itself would be compiled by simple make, but we must pass different
# environment to cross1 and cross2 step. The toolchain and CFLAGS differ
.PHONY: firebird_compile
firebird_compile:
$(NATIVE_RUN) make TARGET=Native cross1
$(RUN) make TARGET=Release CROSS_OUT=Y cross2

.PHONY: firebird_install
firebird_install:
$(RUN) make TARGET=Release CROSS_OUT=Y dist
# We assume there is just one buildroot.tar.gz file in the build tree
# This is a little hack since we don't know the exact path where it is
# produced and it is easier than patching the firebird Makefiles
cd $(WORK_DIR)/install && tar xf $$(find ../ -name buildroot.tar.gz)

41 changes: 41 additions & 0 deletions cross/firebird/PLIST
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
rsc:var/IDPLicense.txt
rsc:var/IPLicense.txt
rsc:bin/fb_config
bin:bin/build_file
bin:bin/fb_lock_print
bin:bin/fbguard
bin:bin/fbsvcmgr
bin:bin/fbtracemgr
bin:bin/firebird
bin:bin/gbak
bin:bin/gfix
bin:bin/gsec
bin:bin/gsplit
bin:bin/gstat
bin:bin/isql
bin:bin/nbackup
rsc:bin/registerDatabase.sh
rsc:var/databases.conf
rsc:var/fbtrace.conf
rsc:var/firebird.conf
rsc:security4.gbak
rsc:msg.gbak
rsc:intl/fbintl
rsc:intl/fbintl.conf
lnk:lib/libfbclient.so
lnk:lib/libfbclient.so.2
lib:lib/libfbclient.so.4.0.3
lib:lib/libib_util.so
rsc:misc/intl.sql
rsc:var/plugins.conf
lib:plugins/libChaCha.so
lib:plugins/libEngine13.so
lib:plugins/libLegacy_Auth.so
lib:plugins/libLegacy_UserManager.so
lib:plugins/libSrp.so
lib:plugins/libfbtrace.so
lib:plugins/libudr_engine.so
lib:plugins/udr/libudf_compat.so
rsc:plugins/udr/udf_compat.sql
rsc:plugins/udr_engine.conf
rsc:var/replication.conf
3 changes: 3 additions & 0 deletions cross/firebird/digests
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
firebird-4.0.3.tar.gz SHA1 02dd8914e80acef2a662eab42b7ee5a3dc41248e
firebird-4.0.3.tar.gz SHA256 90b799043c83325479989b1f44116d1f0112f77c5def4bb452470bf7a0dcc138
firebird-4.0.3.tar.gz MD5 1d57b5ee362be4c0b2c3f28e78f69aaf
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
diff -u builds/install/arch-specific/linux/makeInstallImage.sh.in builds/install/arch-specific/linux/makeInstallImage.sh.in
--- builds/install/arch-specific/linux/makeInstallImage.sh.in 2023-08-11 11:55:02.848124743 +0200
+++ builds/install/arch-specific/linux/makeInstallImage.sh.in 2023-08-11 13:44:38.846348466 +0200
@@ -34,7 +34,7 @@
BuildRootDir=..
BuiltFBDir=Release/firebird # Where the just build fb exists.
TargetDir=buildroot # Where we want to build the install image
-SecurityDatabase=security4.fdb
+SecurityDatabase=security4.gbak
TomMathBuild="@TOMMATH_BUILD@"
TomCryptBuild="@TOMCRYPT_BUILD@"

@@ -183,6 +183,7 @@
copyIfExists $BuiltFBDir/bin/fbtracemgr ${TargetDir}@FB_BINDIR@
cp $BuiltFBDir/bin/isql ${TargetDir}@FB_BINDIR@/isql
cp $BuiltFBDir/bin/qli ${TargetDir}@FB_BINDIR@/qli
+ cp $BuiltFBDir/bin/build_file ${TargetDir}@FB_BINDIR@/build_file

chmod 0755 ${TargetDir}@FB_BINDIR@/*

@@ -239,6 +240,7 @@

#secureDB (access rights will be set at install time)
cp $BuiltFBDir/$SecurityDatabase ${TargetDir}@FB_SECDBDIR@
+ cp $BuiltFBDir/msg.gbak ${TargetDir}@FB_SECDBDIR@

#include (.h .pas files)
cp $BuiltFBDir/include/*.h ${TargetDir}@FB_INCDIR@
21 changes: 21 additions & 0 deletions cross/firebird/patches/0002-do-not-build-qli-gpre-examples.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
--- builds/posix/Makefile.in.1 2023-08-18 21:59:51.408045740 +0200
+++ builds/posix/Makefile.in 2023-08-18 22:03:41.578508436 +0200
@@ -348,9 +348,7 @@ cross2:
$(MAKE) engine
$(MAKE) fbintl
$(MAKE) utilities
- $(MAKE) $(GPRE)
$(MAKE) plugins
- $(MAKE) -f Makefile.plugins_examples
$(MAKE) cross_rest


@@ -660,7 +658,7 @@ GBAK_FILES := $(subst Native,$(TARGET),$

rest: qli message_file tzdata

-cross_rest: qli gbak_files
+cross_rest: gbak_files
$(MAKE) $(BUILD_FILE)

qli: $(QLI)
Loading