Skip to content

Commit

Permalink
Build Redis server and client as libraries
Browse files Browse the repository at this point in the history
We try to keep the same structure as for Linux builds. We use a library for the
internal dependencies implementations (Lua, hiredis) and refactor the code
common to both server and client into a common library. We also add the patches
for building successfully.

Signed-off-by: Bogdan Lascu <[email protected]>
Signed-off-by: Costin Lupu <[email protected]>
Reviewed-by: Stefan Teodorescu <[email protected]>
  • Loading branch information
lascuBogdan96 authored and clupuishere committed Nov 17, 2019
1 parent e20d7cd commit 5d10667
Show file tree
Hide file tree
Showing 6 changed files with 414 additions and 2 deletions.
43 changes: 41 additions & 2 deletions Config.uk
Original file line number Diff line number Diff line change
@@ -1,7 +1,46 @@
config LIBREDIS
menuconfig LIBREDIS
bool "Redis"
default n
select LIBNOLIBC if !HAVE_LIBC

if LIBREDIS
# hidden
config LIBREDIS_COMMON
bool
default n
select LIBUKDEBUG
select LIBUKALLOC
select LIBUKSCHED
select LIBNEWLIBC
select LIBNEWLIBC_WANT_IO_C99_FORMATS if LIBNEWLIBC
select LIBNEWLIBC_LINUX_ERRNO_EXTENSIONS if LIBNEWLIBC
select LIBPTHREAD_EMBEDDED
select UKSYSINFO
select LIBPOSIX_LIBDL
select LIBLWIP
select LWIP_IPV6

config LIBREDIS_SERVER
bool "Redis server"
default y
select LIBREDIS_COMMON
select LIBREDIS_HIREDIS
imply LIBREDIS_LUA
help
Build the Redis server library.

config LIBREDIS_CLIENT
bool "Redis client"
default n
select LIBREDIS_COMMON
select LIBREDIS_HIREDIS
help
Build the Redis client library.

config LIBREDIS_LUA
bool "Use internal Lua implementation"
default n

config LIBREDIS_HIREDIS
bool "Use internal Hiredis implementation"
default n
endif
234 changes: 234 additions & 0 deletions Makefile.uk
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
# SPDX-License-Identifier: BSD-3-Clause
#
# Redis Makefile.uk
#
# Authors: Bogdan Lascu <[email protected]>
# Costin Lupu <[email protected]>
#
# Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
#

################################################################################
# Library registration
################################################################################
$(eval $(call addlib_s,libredis,$(CONFIG_LIBREDIS)))
$(eval $(call addlib_s,libredis_lua,$(CONFIG_LIBREDIS_LUA)))
$(eval $(call addlib_s,libredis_hiredis,$(CONFIG_LIBREDIS_HIREDIS)))
$(eval $(call addlib_s,libredis_common,$(CONFIG_LIBREDIS_COMMON)))
$(eval $(call addlib_s,libredis_server,$(CONFIG_LIBREDIS_SERVER)))
$(eval $(call addlib_s,libredis_client,$(CONFIG_LIBREDIS_CLIENT)))

################################################################################
# Sources
################################################################################
LIBREDIS_VERSION=5.0.6
LIBREDIS_URL=https://github.com/antirez/redis/archive/$(LIBREDIS_VERSION).zip
LIBREDIS_BASENAME=redis-$(LIBREDIS_VERSION)
LIBREDIS_PATCHDIR=$(LIBREDIS_BASE)/patches
$(eval $(call fetch,libredis,$(LIBREDIS_URL)))
$(eval $(call patch,libredis,$(LIBREDIS_PATCHDIR),$(LIBREDIS_BASENAME)))

################################################################################
# Helpers
################################################################################
LIBREDIS_SRC = $(LIBREDIS_ORIGIN)/$(LIBREDIS_BASENAME)/src
LIBREDIS_DEPS = $(LIBREDIS_ORIGIN)/$(LIBREDIS_BASENAME)/deps

################################################################################
# Library includes
################################################################################
CINCLUDES-y += -I$(LIBREDIS_BASE)/include
CXXINCLUDES-y += -I$(LIBREDIS_BASE)/include

LIBREDIS_CINCLUDES-$(CONFIG_LIBREDIS_HIREDIS) += -I$(LIBREDIS_DEPS)/hiredis
LIBREDIS_CINCLUDES-$(CONFIG_LIBREDIS_LUA) += -I$(LIBREDIS_DEPS)/lua/src

################################################################################
# Flags
################################################################################
# Suppress some warnings to make the build process look neater
LIBREDIS_FLAGS_SUPPRESS = -Wno-unused-parameter -Wno-unused-variable \
-Wno-unused-value -Wno-implicit-fallthrough -Wno-char-subscripts \
-Wno-misleading-indentation
LIBREDIS_CFLAGS-y += $(LIBREDIS_FLAGS_SUPPRESS)

################################################################################
# Redis internal Lua
################################################################################
LIBREDIS_LUA_CFLAGS-y += $(LIBREDIS_CFLAGS-y)
LIBREDIS_LUA_CFLAGS-y += -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC=''

LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/fpconv.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lapi.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lauxlib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lbaselib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lcode.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ldblib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ldebug.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ldo.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ldump.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lfunc.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lgc.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/linit.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/liolib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/llex.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lmathlib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lmem.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/loadlib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lobject.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lopcodes.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/loslib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lparser.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lstate.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lstring.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lstrlib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ltable.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ltablib.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/ltm.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lua_bit.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lua_cjson.c
LIBREDIS_LUA_LUA_CJSON_FLAGS-y += -Wno-sign-compare
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lua_cmsgpack.c
LIBREDIS_LUA_LUA_CMSGPACK_FLAGS-y += -Wno-sign-compare
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lua_struct.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lundump.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lvm.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/lzio.c
LIBREDIS_LUA_SRCS-y += $(LIBREDIS_DEPS)/lua/src/strbuf.c

################################################################################
# Redis internal Hiredis
################################################################################
LIBREDIS_HIREDIS_CFLAGS-y += $(LIBREDIS_CFLAGS-y)

LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_DEPS)/hiredis/async.c
LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_DEPS)/hiredis/hiredis.c
LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_DEPS)/hiredis/net.c
LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_DEPS)/hiredis/read.c
#LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_DEPS)/hiredis/sds.c
LIBREDIS_HIREDIS_SRCS-y += $(LIBREDIS_SRC)/sds.c

################################################################################
# Functionality shared between server and client
################################################################################
LIBREDIS_COMMON_CFLAGS-y += $(LIBREDIS_CFLAGS-y)
LIBREDIS_COMMON_CFLAGS-y += -Wno-missing-field-initializers
LIBREDIS_COMMON_CFLAGS-y += -DREDIS_STATIC=''
LIBREDIS_COMMON_CINCLUDES-y += $(LIBREDIS_CINCLUDES-y)

LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/adlist.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/ae.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/anet.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/crc16.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/crc64.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/debug.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/dict.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/release.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/siphash.c
LIBREDIS_COMMON_SRCS-y += $(LIBREDIS_SRC)/zmalloc.c

################################################################################
# Redis server
################################################################################
LIBREDIS_SERVER_CFLAGS-y += $(LIBREDIS_COMMON_CFLAGS-y)
LIBREDIS_SERVER_CINCLUDES-y += $(LIBREDIS_COMMON_CINCLUDES-y)

LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/aof.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/bio.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/bitops.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/blocked.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/childinfo.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/cluster.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/config.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/db.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/defrag.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/endianconv.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/evict.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/expire.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/geo.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/geohash.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/geohash_helper.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/hyperloglog.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/intset.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/latency.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/lazyfree.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/listpack.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/localtime.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/lolwut.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/lolwut5.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/lzf_c.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/lzf_d.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/memtest.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/module.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/multi.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/networking.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/notify.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/object.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/pqsort.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/pubsub.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/quicklist.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/rand.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/rax.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/rdb.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/redis-check-aof.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/redis-check-rdb.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/replication.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/rio.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/scripting.c
#LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/sds.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/sentinel.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/server.c
LIBREDIS_SERVER_SERVER_FLAGS-y += -Dmain=redis_server_main
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/setproctitle.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/sha1.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/slowlog.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/sort.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/sparkline.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/syncio.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_hash.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_list.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_set.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_stream.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_string.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/t_zset.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/util.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/ziplist.c
LIBREDIS_SERVER_SRCS-y += $(LIBREDIS_SRC)/zipmap.c

################################################################################
# Redis client
################################################################################
LIBREDIS_CLIENT_CFLAGS-y += $(LIBREDIS_COMMON_CFLAGS-y)
LIBREDIS_CLIENT_CINCLUDES-y += $(LIBREDIS_COMMON_CINCLUDES-y)
LIBREDIS_CLIENT_CINCLUDES-y += -I$(LIBREDIS_DEPS)/linenoise

LIBREDIS_CLIENT_SRCS-y += $(LIBREDIS_SRC)/redis-cli.c
LIBREDIS_CLIENT_REDIS-CLI_FLAGS-y += -Dmain=redis_client_main
LIBREDIS_CLIENT_SRCS-y += $(LIBREDIS_DEPS)/linenoise/linenoise.c
26 changes: 26 additions & 0 deletions patches/0001-hiredis-Use-linux-macros-for-Unikraft-as-well.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
From b715e80ac71da7b13715e223d9169d11c71ad7ff Mon Sep 17 00:00:00 2001
From: Costin Lupu <[email protected]>
Date: Fri, 1 Nov 2019 12:57:22 +0200
Subject: [UNIKRAFT PATCH] hiredis: Use linux macros for Unikraft as well

Signed-off-by: Costin Lupu <[email protected]>
---
deps/hiredis/fmacros.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/deps/hiredis/fmacros.h b/deps/hiredis/fmacros.h
index 9a56643..1c9828b 100644
--- a/deps/hiredis/fmacros.h
+++ b/deps/hiredis/fmacros.h
@@ -1,7 +1,7 @@
#ifndef __HIREDIS_FMACRO_H
#define __HIREDIS_FMACRO_H

-#if defined(__linux__)
+#if defined(__linux__) || defined(__Unikraft__)
#define _BSD_SOURCE
#define _DEFAULT_SOURCE
#endif
--
2.20.1

28 changes: 28 additions & 0 deletions patches/0002-src-sds.h-Declare-SDS_INIT-as-extern.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
From 3244c867fd93021e311d425aae6aee0256b06179 Mon Sep 17 00:00:00 2001
From: Costin Lupu <[email protected]>
Date: Sat, 16 Nov 2019 22:39:14 +0200
Subject: [UNIKRAFT PATCH] src/sds.h: Declare SDS_INIT as extern

This should be also upstreamed.

Signed-off-by: Costin Lupu <[email protected]>
---
src/sds.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/sds.h b/src/sds.h
index 1bdb60d..adcc12c 100644
--- a/src/sds.h
+++ b/src/sds.h
@@ -34,7 +34,7 @@
#define __SDS_H

#define SDS_MAX_PREALLOC (1024*1024)
-const char *SDS_NOINIT;
+extern const char *SDS_NOINIT;

#include <sys/types.h>
#include <stdarg.h>
--
2.20.1

43 changes: 43 additions & 0 deletions patches/0003-Make-bytesToHuman-definitions-static.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
From cb6a16e1526741a5e4b0feea12e88b92db99672b Mon Sep 17 00:00:00 2001
From: Costin Lupu <[email protected]>
Date: Sat, 16 Nov 2019 22:45:13 +0200
Subject: [UNIKRAFT PATCH] Make bytesToHuman() definitions static

This should be either upstreamed or we should refactor and use a single function
and then upstream that second solution.

Signed-off-by: Costin Lupu <[email protected]>
---
src/redis-cli.c | 2 +-
src/server.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/redis-cli.c b/src/redis-cli.c
index 480921c..9f1a14e 100644
--- a/src/redis-cli.c
+++ b/src/redis-cli.c
@@ -6684,7 +6684,7 @@ static long getLongInfoField(char *info, char *field) {

/* Convert number of bytes into a human readable string of the form:
* 100B, 2G, 100M, 4K, and so forth. */
-void bytesToHuman(char *s, long long n) {
+static void bytesToHuman(char *s, long long n) {
double d;

if (n < 0) {
diff --git a/src/server.c b/src/server.c
index 7f0acaa..2524a12 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3058,7 +3058,7 @@ NULL

/* Convert an amount of bytes into a human readable string in the form
* of 100B, 2G, 100M, 4K, and so forth. */
-void bytesToHuman(char *s, unsigned long long n) {
+static void bytesToHuman(char *s, unsigned long long n) {
double d;

if (n < 1024) {
--
2.20.1

Loading

0 comments on commit 5d10667

Please sign in to comment.