Integrated mklove configure
This commit is contained in:
parent
e48005eb21
commit
8388e25526
|
@ -1,3 +1,8 @@
|
|||
config.h
|
||||
config.log*
|
||||
config.cache
|
||||
Makefile.config
|
||||
rdkafka.pc
|
||||
*~
|
||||
\#*
|
||||
*.o
|
||||
|
|
135
Makefile
135
Makefile
|
@ -1,136 +1,35 @@
|
|||
LIBNAME=librdkafka
|
||||
LIBVER=1
|
||||
LIBSUBDIRS= src src-cpp
|
||||
|
||||
DESTDIR?=/usr/local
|
||||
|
||||
SRCS= rdkafka.c rdkafka_broker.c rdkafka_msg.c rdkafka_topic.c \
|
||||
rdkafka_defaultconf.c rdkafka_timer.c rdkafka_offset.c
|
||||
SRCS+= rdcrc32.c rdgz.c rdaddr.c rdrand.c rdthread.c rdqueue.c rdlog.c
|
||||
SRCS+= snappy.c
|
||||
|
||||
HDRS= rdkafka.h
|
||||
|
||||
CFLAGS+=-O2 -Wall -Werror -Wfloat-equal -Wpointer-arith -I.
|
||||
CFLAGS+=-g
|
||||
|
||||
# C++ interface
|
||||
CXXSRCS+= RdKafka/RdKafka.cpp RdKafka/ConfImpl.cpp RdKafka/HandleImpl.cpp \
|
||||
RdKafka/ConsumerImpl.cpp RdKafka/ProducerImpl.cpp \
|
||||
RdKafka/TopicImpl.cpp RdKafka/MessageImpl.cpp
|
||||
HDRS+= RdKafka/rdkafkacpp.h
|
||||
CXXFLAGS+= -O2 -Wall -Werror -g -fPIC -std=c++03
|
||||
|
||||
OBJS= $(SRCS:.c=.o)
|
||||
OBJS+= $(CXXSRCS:%.cpp=%.o)
|
||||
DEPS= $(OBJS:%.o=%.d)
|
||||
|
||||
|
||||
# Clang warnings to ignore
|
||||
ifeq ($(CC),clang)
|
||||
CFLAGS+=-Wno-gnu-designator
|
||||
endif
|
||||
|
||||
# Enable iovecs in snappy
|
||||
CFLAGS+=-DSG
|
||||
|
||||
# Profiling
|
||||
#CFLAGS+=-O0
|
||||
#CFLAGS += -pg
|
||||
#LDFLAGS += -pg
|
||||
|
||||
LDFLAGS+= -g
|
||||
UNAME_S = $(shell uname -s)
|
||||
ifneq ($(findstring CYGWIN,$(UNAME_S)),CYGWIN)
|
||||
LDFLAGS+=-fPIC
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
CHECK_FILES+= CONFIGURATION.md \
|
||||
examples/rdkafka_example examples/rdkafka_performance \
|
||||
examples/rdkafka_example_cpp
|
||||
|
||||
.PHONY:
|
||||
|
||||
all: libs check
|
||||
all: mklove-check libs CONFIGURATION.md check
|
||||
|
||||
libs: $(LIBNAME).so.$(LIBVER) $(LIBNAME).a CONFIGURATION.md
|
||||
include mklove/Makefile.base
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -MD -MP $(CFLAGS) -c $<
|
||||
%.o: %.cpp
|
||||
$(CXX) -MD -MP $(CXXFLAGS) -c $< -o $@
|
||||
libs:
|
||||
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d || exit $?; done)
|
||||
|
||||
librdkafka.lds: rdkafka.h
|
||||
@echo "\033[33mGenerating linker script $@\033[0m"
|
||||
@./lds-gen.pl > $@
|
||||
|
||||
$(LIBNAME).so.$(LIBVER): $(OBJS) librdkafka.lds
|
||||
@echo "\033[33mCreating shared library $@\033[0m"
|
||||
@(if [ $(UNAME_S) = "Darwin" ]; then \
|
||||
$(CC) $(LDFLAGS) \
|
||||
$(OBJS) -dynamiclib -o $@ -lpthread -lz -lc ; \
|
||||
else \
|
||||
$(CC) $(LDFLAGS) \
|
||||
-shared -Wl,-soname,$@ \
|
||||
-Wl,--version-script=librdkafka.lds \
|
||||
$(OBJS) -o $@ -lpthread -lrt -lz -lc ; \
|
||||
fi)
|
||||
|
||||
$(LIBNAME).a: $(OBJS)
|
||||
@echo "\033[33mCreating static library $@\033[0m"
|
||||
$(AR) rcs $@ $(OBJS)
|
||||
|
||||
|
||||
CONFIGURATION.md: rdkafka.h examples
|
||||
CONFIGURATION.md: src/rdkafka.h examples
|
||||
@echo "\033[33mUpdating $@\033[0m"
|
||||
@(examples/rdkafka_performance -X list > CONFIGURATION.md.tmp; \
|
||||
cmp CONFIGURATION.md CONFIGURATION.md.tmp || \
|
||||
mv CONFIGURATION.md.tmp CONFIGURATION.md; \
|
||||
rm -f CONFIGURATION.md.tmp)
|
||||
|
||||
examples: .PHONY
|
||||
make -C $@
|
||||
check: file-check
|
||||
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ || exit $?; done)
|
||||
|
||||
install:
|
||||
@echo "\033[33mInstall to root $(DESTDIR)\033[0m"
|
||||
if [ "$(DESTDIR)" != "/usr/local" ]; then \
|
||||
DESTDIR="$(DESTDIR)/usr"; \
|
||||
else \
|
||||
DESTDIR="$(DESTDIR)" ; \
|
||||
fi ; \
|
||||
install -d $$DESTDIR/include/librdkafka $$DESTDIR/lib ; \
|
||||
install $(HDRS) $$DESTDIR/include/$(LIBNAME) ; \
|
||||
install $(LIBNAME).a $$DESTDIR/lib ; \
|
||||
install $(LIBNAME).so.$(LIBVER) $$DESTDIR/lib ; \
|
||||
(cd $$DESTDIR/lib && ln -sf $(LIBNAME).so.$(LIBVER) $(LIBNAME).so)
|
||||
|
||||
tests: .PHONY check
|
||||
make -C tests
|
||||
|
||||
check:
|
||||
@echo "\033[33mChecking integrity\033[0m"
|
||||
@(RET=true ; \
|
||||
for f in librdkafka.so.1 librdkafka.a CONFIGURATION.md \
|
||||
examples/rdkafka_example examples/rdkafka_performance ; do \
|
||||
printf "%-30s " $$f ; \
|
||||
if [ -f "$$f" ]; then \
|
||||
echo "\033[32mOK\033[0m"; \
|
||||
else \
|
||||
echo "\033[31mMISSING\033[0m"; \
|
||||
RET=false ; \
|
||||
fi; \
|
||||
done ; \
|
||||
$$($$RET))
|
||||
|
||||
@(printf "%-30s " "Symbol visibility" ; \
|
||||
((nm -D librdkafka.so.1 | grep -q rd_kafka_new) && \
|
||||
(nm -D librdkafka.so.1 | grep -vq rd_kafka_destroy) && \
|
||||
echo "\033[32mOK\033[0m") || \
|
||||
echo "\033[31mFAILED\033[0m")
|
||||
|
||||
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ || exit $?; done)
|
||||
|
||||
examples tests: .PHONY
|
||||
$(MAKE) -C $@
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) $(DEPS) \
|
||||
$(LIBNAME)*.a $(LIBNAME)*.so $(LIBNAME)*.so.$(LIBVER) \
|
||||
librdkafka.lds
|
||||
make -C tests clean
|
||||
make -C examples clean
|
||||
|
||||
-include $(DEPS)
|
||||
@$(MAKE) -C tests $@
|
||||
@$(MAKE) -C examples $@
|
||||
@(for d in $(LIBSUBDIRS); do $(MAKE) -C $$d $@ ; done)
|
||||
|
|
|
@ -0,0 +1,204 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
|
||||
# Load base module
|
||||
source mklove/modules/configure.base
|
||||
|
||||
# Read some special command line options right away that must be known prior to
|
||||
# sourcing modules.
|
||||
mkl_in_list "$*" "--no-download" && MKL_NO_DOWNLOAD=1
|
||||
# Disable downloads when --help is used to avoid blocking calls.
|
||||
mkl_in_list "$*" "--help" && MKL_NO_DOWNLOAD=1
|
||||
mkl_in_list "$*" "--debug" && MKL_DEBUG=1
|
||||
|
||||
# Delete temporary Makefile and header files on exit.
|
||||
trap "{ rm -f $MKL_OUTMK $MKL_OUTH; }" EXIT
|
||||
|
||||
|
||||
|
||||
##
|
||||
## Load builtin modules
|
||||
##
|
||||
|
||||
# Builtin options, etc.
|
||||
mkl_require builtin
|
||||
|
||||
# Host/target support
|
||||
mkl_require host
|
||||
|
||||
# Compiler detection
|
||||
mkl_require cc
|
||||
|
||||
|
||||
# Load application provided modules (in current directory), if any.
|
||||
for fname in configure.* ; do
|
||||
if [[ $fname = 'configure.*' ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Skip temporary files
|
||||
if [[ $fname = *~ ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
mkl_require $fname
|
||||
done
|
||||
|
||||
|
||||
|
||||
|
||||
##
|
||||
## Argument parsing (options)
|
||||
##
|
||||
##
|
||||
|
||||
# Parse arguments
|
||||
while [[ ! -z $@ ]]; do
|
||||
if [[ $1 != --* ]]; then
|
||||
mkl_err "Unknown non-option argument: $1"
|
||||
mkl_usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
opt=${1#--}
|
||||
shift
|
||||
|
||||
if [[ $opt = *=* ]]; then
|
||||
name="${opt%=*}"
|
||||
arg="${opt#*=}"
|
||||
eqarg=1
|
||||
else
|
||||
name="$opt"
|
||||
arg=""
|
||||
eqarg=0
|
||||
fi
|
||||
|
||||
safeopt="$(mkl_env_esc $name)"
|
||||
|
||||
if ! mkl_func_exists opt_$safeopt ; then
|
||||
mkl_err "Unknown option $opt"
|
||||
mkl_usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if this option needs an argument.
|
||||
reqarg=$(mkl_meta_get "MKL_OPT_ARGS" "$(mkl_env_esc $name)")
|
||||
if [[ ! -z $reqarg ]]; then
|
||||
if [[ $eqarg == 0 && -z $arg ]]; then
|
||||
arg=$1
|
||||
shift
|
||||
|
||||
if [[ -z $arg ]]; then
|
||||
mkl_err "Missing argument to option --$name $reqarg"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [[ ! -z $arg ]]; then
|
||||
mkl_err "Option --$name expects no argument"
|
||||
exit 1
|
||||
fi
|
||||
arg=y
|
||||
fi
|
||||
|
||||
case $name in
|
||||
re|reconfigure)
|
||||
oldcmd=$(grep '^# configure exec: ' config.log | \
|
||||
sed -e 's/^\# configure exec: //')
|
||||
if [[ -z $oldcmd ]]; then
|
||||
echo "No previous execution found in config.log"
|
||||
exit 1
|
||||
fi
|
||||
echo "Reconfiguring: $oldcmd"
|
||||
exec $oldcmd
|
||||
;;
|
||||
|
||||
list-modules)
|
||||
echo "Modules loaded:"
|
||||
for mod in $MKL_MODULES ; do
|
||||
echo " $mod"
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
|
||||
list-checks)
|
||||
echo "Check functions in calling order:"
|
||||
for mf in $MKL_CHECKS ; do
|
||||
mod=${mf%:*}
|
||||
func=${mf#*:}
|
||||
echo -e "${MKL_GREEN}From module $mod:$MKL_CLR_RESET"
|
||||
declare -f $func
|
||||
echo ""
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
|
||||
update-modules)
|
||||
fails=0
|
||||
echo "Updating modules"
|
||||
for mod in $MKL_MODULES ; do
|
||||
echo -n "Updating $mod..."
|
||||
if mkl_module_download "$mod" > /dev/null ; then
|
||||
echo -e "${MKL_GREEN}ok${MKL_CLR_RESET}"
|
||||
else
|
||||
echo -e "${MKL_RED}failed${MKL_CLR_RESET}"
|
||||
fails=$(expr $fails + 1)
|
||||
fi
|
||||
done
|
||||
exit $fails
|
||||
;;
|
||||
|
||||
help)
|
||||
mkl_usage
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
opt_$safeopt $arg || exit 1
|
||||
mkl_var_append MKL_OPTS_SET "$safeopt"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ! -z $MKL_CLEAN ]]; then
|
||||
mkl_clean
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Move away previous log file
|
||||
[[ -f $MKL_OUTDBG ]] && mv $MKL_OUTDBG ${MKL_OUTDBG}.old
|
||||
|
||||
|
||||
# Create output files
|
||||
echo "# configure exec: $0 $*" >> $MKL_OUTDBG
|
||||
echo "# On $(date)" >> $MKL_OUTDBG
|
||||
|
||||
rm -f $MKL_OUTMK $MKL_OUTH
|
||||
mkl_write_mk "# Automatically generated by $0 $*"
|
||||
mkl_write_h "// Automatically generated by $0 $*"
|
||||
mkl_write_h "#pragma once"
|
||||
|
||||
|
||||
# Load cache file
|
||||
mkl_cache_read
|
||||
|
||||
# Run checks
|
||||
mkl_checks_run
|
||||
|
||||
# Check accumulated failures, will not return on failure.
|
||||
mkl_check_fails
|
||||
|
||||
# Generate outputs
|
||||
mkl_generate
|
||||
|
||||
# Summarize what happened
|
||||
mkl_summary
|
||||
|
||||
# Write cache file
|
||||
mkl_cache_write
|
||||
|
||||
|
||||
echo ""
|
||||
echo "Now type 'make' to build"
|
||||
trap - EXIT
|
||||
exit 0
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
|
||||
mkl_require lib
|
||||
mkl_require pic
|
||||
mkl_require atomics must pass
|
||||
mkl_require good_cflags
|
||||
|
||||
# Generate version variables from rdkafka.h hex version define
|
||||
# so we can use it as string version when generating a pkg-config file.
|
||||
verdef=$(grep -E '^#define +RD_KAFKA_VERSION +0x' src/rdkafka.h | sed -r 's/^#define +RD_KAFKA_VERSION +(0x[a-f0-9]+)\.*$/\1/')
|
||||
mkl_require parseversion hex2str "%d.%d.%d" "$verdef" RDKAFKA_VERSION_STR
|
||||
|
||||
mkl_require gen-pkg-config "rdkafka" "The Apache Kafka C/C++ library" \
|
||||
"Full Apache Kafka 0.8 protocol support, including producer and consumer" \
|
||||
"\$RDKAFKA_VERSION_STR"
|
||||
|
||||
function checks {
|
||||
|
||||
# required libs
|
||||
mkl_lib_check "libpthread" "" fail CC "-lpthread"
|
||||
mkl_lib_check "zlib" "" fail CC "-lz"
|
||||
|
||||
# -lrt is needed on linux for clock_gettime: link it if it exists.
|
||||
mkl_lib_check "librt" "" cont CC "-lrt"
|
||||
|
||||
# SG turns on scatter-gather support in snappy.c, which we need.
|
||||
mkl_mkvar_append CFLAGS CFLAGS "-DSG"
|
||||
|
||||
# Older g++ (<=4.1?) gives invalid warnings for the C++ code.
|
||||
mkl_mkvar_append CXXFLAGS CXXFLAGS "-Wno-non-virtual-dtor"
|
||||
}
|
||||
|
|
@ -1,23 +1,15 @@
|
|||
EXAMPLES ?= rdkafka_example rdkafka_performance rdkafka_example_cpp
|
||||
CC ?= cc
|
||||
CXX ?= g++
|
||||
CFLAGS += -g -Wall -Werror -Wfloat-equal -Wpointer-arith -O2 -I../
|
||||
CXXFLAGS += $(CFLAGS)
|
||||
LDFLAGS += ../librdkafka.a
|
||||
LDFLAGS += -lpthread -lz
|
||||
ifeq ($(shell uname -s), Linux)
|
||||
LDFLAGS += -lrt
|
||||
endif
|
||||
|
||||
# Profiling
|
||||
#CFLAGS += -O0 -pg
|
||||
#LDFLAGS += -pg
|
||||
|
||||
all: $(EXAMPLES)
|
||||
|
||||
rdkafka_example: ../librdkafka.a rdkafka_example.c
|
||||
@(test $@ -nt $< || \
|
||||
$(CC) $(CFLAGS) rdkafka_example.c -o $@ $(LDFLAGS))
|
||||
include ../mklove/Makefile.base
|
||||
|
||||
CFLAGS += -I../src
|
||||
CXXFLAGS += -I../src-cpp
|
||||
|
||||
rdkafka_example: ../src/librdkafka.a rdkafka_example.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) rdkafka_example.c -o $@ $(LDFLAGS) \
|
||||
../src/librdkafka.a $(LIBS)
|
||||
@echo "# $@ is ready"
|
||||
@echo "#"
|
||||
@echo "# Run producer (write messages on stdin)"
|
||||
|
@ -30,9 +22,9 @@ rdkafka_example: ../librdkafka.a rdkafka_example.c
|
|||
@echo "# More usage options:"
|
||||
@echo "./rdkafka_example --help"
|
||||
|
||||
rdkafka_performance: ../librdkafka.a rdkafka_performance.c
|
||||
@(test $@ -nt $< || \
|
||||
$(CC) $(CFLAGS) rdkafka_performance.c -o $@ $(LDFLAGS))
|
||||
rdkafka_performance: ../src/librdkafka.a rdkafka_performance.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) rdkafka_performance.c -o $@ $(LDFLAGS) \
|
||||
../src/librdkafka.a $(LIBS)
|
||||
@echo "# $@ is ready"
|
||||
@echo "#"
|
||||
@echo "# Run producer"
|
||||
|
@ -46,8 +38,9 @@ rdkafka_performance: ../librdkafka.a rdkafka_performance.c
|
|||
@echo "./$@ --help"
|
||||
|
||||
|
||||
rdkafka_example_cpp: ../librdkafka.a rdkafka_example.cpp
|
||||
$(CXX) $(CXXFLAGS) rdkafka_example.cpp -o $@ $(LDFLAGS) -lstdc++
|
||||
rdkafka_example_cpp: ../src-cpp/librdkafka++.a ../src/librdkafka.a rdkafka_example.cpp
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) rdkafka_example.cpp -o $@ $(LDFLAGS) \
|
||||
../src-cpp/librdkafka++.a ../src/librdkafka.a $(LIBS) -lstdc++
|
||||
|
||||
clean:
|
||||
rm -f $(EXAMPLES)
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
* Typically include path in a real application would be
|
||||
* #include <librdkafka/rdkafkacpp.h>
|
||||
*/
|
||||
#include "../RdKafka/rdkafkacpp.h"
|
||||
#include "rdkafkacpp.h"
|
||||
|
||||
|
||||
|
||||
|
|
19
lds-gen.pl
19
lds-gen.pl
|
@ -5,18 +5,23 @@
|
|||
# Generate linker script to only expose symbols of the public API
|
||||
#
|
||||
|
||||
open(IN, "<rdkafka.h") or die("Failed to open rdkafka.h: $!\n");
|
||||
|
||||
@funcs = ();
|
||||
while (<IN>) {
|
||||
while (<>) {
|
||||
push(@funcs, $2) if /^(\S+.*\s+\**)?(rd_kafka_\S+)\s+\(/;
|
||||
}
|
||||
close(IN);
|
||||
|
||||
|
||||
print "# Automatically generated by lds-gen.pl - DO NOT EDIT\n";
|
||||
print "{\n global:\n";
|
||||
foreach my $f (sort @funcs) {
|
||||
print " $f;\n";
|
||||
if (scalar @funcs == 0) {
|
||||
print " *;\n";
|
||||
} else {
|
||||
foreach my $f (sort @funcs) {
|
||||
print " $f;\n";
|
||||
}
|
||||
|
||||
print " local:\n *;\n";
|
||||
}
|
||||
|
||||
print " local:\n *;\n};\n";
|
||||
print "};\n";
|
||||
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
|
||||
|
||||
MKL_RED=\033[031m
|
||||
MKL_GREEN=\033[032m
|
||||
MKL_YELLOW=\033[033m
|
||||
MKL_BLUE=\033[034m
|
||||
MKL_CLR_RESET=\033[0m
|
||||
|
||||
DEPS= $(OBJS:%.o=%.d)
|
||||
|
||||
# TOPDIR is "TOPDIR/mklove/../" i.e., TOPDIR.
|
||||
# We do it with two dir calls instead of /.. to support mklove being symlinked.
|
||||
MKLOVE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
TOPDIR = $(MKLOVE_DIR:mklove/=.)
|
||||
|
||||
-include $(TOPDIR)/Makefile.config
|
||||
|
||||
INSTALL?= install
|
||||
INSTALL_PROGRAM?= $(INSTALL)
|
||||
INSTALL_DATA?= $(INSTALL) -m 644
|
||||
|
||||
prefix?= /usr/local
|
||||
exec_prefix?= $(prefix)
|
||||
bindir?= $(exec_prefix)/bin
|
||||
sbindir?= $(exec_prefix)/sbin
|
||||
libexecdir?= $(exec_prefix)/libexec/ # append PKGNAME on install
|
||||
datarootdir?= $(prefix)/share
|
||||
datadir?= $(datarootdir) # append PKGNAME on install
|
||||
sysconfdir?= $(prefix)/etc
|
||||
sharedstatedir?=$(prefix)/com
|
||||
localestatedir?=$(prefix)/var
|
||||
runstatedir?= $(localestatedir)/run
|
||||
includedir?= $(prefix)/include
|
||||
docdir?= $(datarootdir)/doc/$(PKGNAME)
|
||||
infodir?= $(datarootdir)/info
|
||||
libdir?= $(prefix)/lib
|
||||
localedir?= $(datarootdir)/locale
|
||||
mandir?= $(datarootdir)/man
|
||||
man1dir?= $(mandir)/man1
|
||||
man2dir?= $(mandir)/man2
|
||||
man3dir?= $(mandir)/man3
|
||||
man4dir?= $(mandir)/man4
|
||||
man5dir?= $(mandir)/man5
|
||||
man6dir?= $(mandir)/man6
|
||||
man7dir?= $(mandir)/man7
|
||||
man8dir?= $(mandir)/man8
|
||||
|
||||
|
||||
# Checks that mklove is set up and ready for building
|
||||
mklove-check:
|
||||
@if [ ! -f "$(TOPDIR)/Makefile.config" ]; then \
|
||||
echo "$(MKL_RED)$(TOPDIR)/Makefile.config missing: please run ./configure$(MKL_CLR_RESET)" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -MD -MP $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) -MD -MP $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
|
||||
|
||||
|
||||
lib: $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
|
||||
|
||||
$(LIBNAME).so.$(LIBVER): $(OBJS) $(LIBNAME).lds
|
||||
@echo "$(MKL_YELLOW)Creating shared library $@$(MKL_CLR_RESET)"
|
||||
$(CC) $(LDFLAGS) $(LIB_LDFLAGS) $(OBJS) -o $@ $(LIBS)
|
||||
|
||||
$(LIBNAME).a: $(OBJS)
|
||||
@echo "$(MKL_YELLOW)Creating static library $@$(MKL_CLR_RESET)"
|
||||
$(AR) rcs $@ $(OBJS)
|
||||
|
||||
|
||||
file-check:
|
||||
@(echo "$(MKL_YELLOW)Checking $(LIBNAME) integrity$(MKL_CLR_RESET)" ; \
|
||||
RET=true ; \
|
||||
for f in $(CHECK_FILES) ; do \
|
||||
printf "%-30s " $$f ; \
|
||||
if [ -f "$$f" ]; then \
|
||||
echo "$(MKL_GREEN)OK$(MKL_CLR_RESET)"; \
|
||||
else \
|
||||
echo "$(MKL_RED)MISSING$(MKL_CLR_RESET)"; \
|
||||
RET=false ; \
|
||||
fi; \
|
||||
done ; \
|
||||
$$($$RET))
|
||||
|
||||
|
||||
lib-install:
|
||||
@echo "$(MKL_YELLOW)Install $(LIBNAME) to $$DESTDIR$(prefix)$(MKL_CLR_RESET)"
|
||||
$(INSTALL) -d $$DESTDIR$(includedir)/$(PKGNAME) ; \
|
||||
$(INSTALL) -d $$DESTDIR$(libdir) ; \
|
||||
$(INSTALL) $(HDRS) $$DESTDIR$(includedir)/$(PKGNAME) ; \
|
||||
$(INSTALL) $(LIBNAME).a $$DESTDIR/$(libdir) ; \
|
||||
$(INSTALL) $(LIBNAME).so.$(LIBVER) $$DESTDIR/$(libdir) ; \
|
||||
(cd $$DESTDIR/$(libdir) && ln -sf $(LIBNAME).so.$(LIBVER) $(LIBNAME).so)
|
||||
|
||||
lib-uninstall:
|
||||
@echo "$(MKL_YELLOW)Uninstall $(LIBNAME) from $$DESTDIR$(prefix)$(MKL_CLR_RESET)"
|
||||
for hdr in $(HDRS) ; do \
|
||||
rm -f $$DESTDIR$(includedir)/$(PKGNAME)/$$hdr ; done
|
||||
rm -f $$DESTDIR$(libdir)/$(LIBNAME).a
|
||||
rm -f $$DESTDIR$(libdir)/$(LIBNAME).so.$(LIBVER)
|
||||
rm -f $$DESTDIR$(libdir)/$(LIBNAME).so
|
||||
rmdir $$DESTDIR$(includedir)/$(PKGNAME) || true
|
||||
|
||||
generic-clean:
|
||||
rm -f $(OBJS) $(DEPS)
|
||||
|
||||
lib-clean: generic-clean
|
||||
rm -f $(LIBNAME)*.a $(LIBNAME)*.so $(LIBNAME)*.so.$(LIBVER) \
|
||||
$(LIBNAME).lds
|
||||
|
||||
bin-clean: generic-clean
|
|
@ -0,0 +1,144 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Checks for atomic ops:
|
||||
# compiler builtin (__sync_..) and portable libatomic's (__atomic_..)
|
||||
# Will also provide abstraction by defining the prefix to use.
|
||||
#
|
||||
# Sets:
|
||||
# HAVE_ATOMICS
|
||||
# HAVE_ATOMICS_32
|
||||
# HAVE_ATOMICS_64
|
||||
# HAVE_ATOMICS_32_ATOMIC __atomic interface
|
||||
# HAVE_ATOMICS_32_SYNC __sync interface
|
||||
# HAVE_ATOMICS_64_ATOMIC __atomic interface
|
||||
# HAVE_ATOMICS_64_SYNC __sync interface
|
||||
# WITH_LIBATOMIC
|
||||
# LIBS
|
||||
#
|
||||
# ATOMIC_OP(OP1,OP2,PTR,VAL)
|
||||
# ATOMIC_OP32(OP1,OP2,PTR,VAL)
|
||||
# ATOMIC_OP64(OP1,OP2,PTR,VAL)
|
||||
# where op* is 'add,sub,fetch'
|
||||
# e.g: ATOMIC_OP32(add, fetch, &i, 10)
|
||||
# becomes __atomic_add_fetch(&i, 10, ..) or
|
||||
# __sync_add_and_fetch(&i, 10)
|
||||
#
|
||||
|
||||
function checks {
|
||||
|
||||
|
||||
# We prefer the newer __atomic stuff, but 64-bit atomics might
|
||||
# require linking with -latomic, so we need to perform these tests
|
||||
# in the proper order:
|
||||
# __atomic 32
|
||||
# __atomic 32 -latomic
|
||||
# __sync 32
|
||||
#
|
||||
# __atomic 64
|
||||
# __atomic 64 -latomic
|
||||
# __sync 64
|
||||
|
||||
local _libs=
|
||||
local _a32="__atomic_ ## OP1 ## _ ## OP2(PTR, VAL, __ATOMIC_SEQ_CST)"
|
||||
local _a64="__atomic_ ## OP1 ## _ ## OP2(PTR, VAL, __ATOMIC_SEQ_CST)"
|
||||
|
||||
# 32-bit:
|
||||
# Try fully builtin __atomic
|
||||
if ! mkl_compile_check __atomic_32 HAVE_ATOMICS_32 cont CC "" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int32_t foo (int32_t i) {
|
||||
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
|
||||
}"
|
||||
then
|
||||
# Try __atomic with -latomic
|
||||
if mkl_compile_check __atomic_32_lib HAVE_ATOMICS_32 \
|
||||
cont CC "-latomic" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int32_t foo (int32_t i) {
|
||||
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
|
||||
}"
|
||||
then
|
||||
_libs="-latomic"
|
||||
mkl_allvar_set "__atomic_32_lib" "HAVE_ATOMICS_32_ATOMIC" "y"
|
||||
else
|
||||
# Try __sync interface
|
||||
if mkl_compile_check __sync_32 HAVE_ATOMICS_32 disable CC "" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int32_t foo (int32_t i) {
|
||||
return __sync_add_and_fetch(&i, 1);
|
||||
}"
|
||||
then
|
||||
_a32="__sync_ ## OP1 ## _and_ ## OP2(PTR, VAL)"
|
||||
mkl_allvar_set "__sync_32" "HAVE_ATOMICS_32_SYNC" "y"
|
||||
else
|
||||
_a32=""
|
||||
fi
|
||||
fi
|
||||
else
|
||||
mkl_allvar_set "__atomic_32" "HAVE_ATOMICS_32_ATOMIC" "y"
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! -z $_a32 ]]; then
|
||||
mkl_define_set "atomic_32" "ATOMIC_OP32(OP1,OP2,PTR,VAL)" "code:$_a32"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# 64-bit:
|
||||
# Try fully builtin __atomic
|
||||
if ! mkl_compile_check __atomic_64 HAVE_ATOMICS_64 cont CC "" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int64_t foo (int64_t i) {
|
||||
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
|
||||
}"
|
||||
then
|
||||
# Try __atomic with -latomic
|
||||
if mkl_compile_check __atomic_64_lib HAVE_ATOMICS_64 \
|
||||
cont CC "-latomic" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int64_t foo (int64_t i) {
|
||||
return __atomic_add_fetch(&i, 1, __ATOMIC_SEQ_CST);
|
||||
}"
|
||||
then
|
||||
_libs="-latomic"
|
||||
mkl_allvar_set "__atomic_64_lib" "HAVE_ATOMICS_64_ATOMIC" "y"
|
||||
else
|
||||
# Try __sync interface
|
||||
if mkl_compile_check __sync_64 HAVE_ATOMICS_64 disable CC "" \
|
||||
"
|
||||
#include <inttypes.h>
|
||||
int64_t foo (int64_t i) {
|
||||
return __sync_add_and_fetch(&i, 1);
|
||||
}"
|
||||
then
|
||||
_a64="__sync_ ## OP1 ## _and_ ## OP2 (PTR, VAL)"
|
||||
mkl_allvar_set "__sync_64" "HAVE_ATOMICS_64_SYNC" "y"
|
||||
else
|
||||
_a64=""
|
||||
fi
|
||||
fi
|
||||
else
|
||||
mkl_allvar_set "__atomic_64" "HAVE_ATOMICS_64_ATOMIC" "y"
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! -z $_a64 ]]; then
|
||||
mkl_define_set "atomic_64" "ATOMIC_OP64(OP1,OP2,PTR,VAL)" "code:$_a64"
|
||||
|
||||
# Define generic ATOMIC() macro identical to 64-bit atomics"
|
||||
mkl_define_set "atomic_64" "ATOMIC_OP(OP1,OP2,PTR,VAL)" "code:$_a64"
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! -z $_libs ]]; then
|
||||
mkl_mkvar_append LDFLAGS LDFLAGS "-Wl,--as-needed"
|
||||
mkl_mkvar_append LIBS LIBS "$_libs"
|
||||
fi
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,49 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# mklove builtin checks and options
|
||||
# Sets:
|
||||
# prefix, etc..
|
||||
|
||||
|
||||
mkl_option "Standard" prefix "--prefix=PATH" \
|
||||
"Install arch-independent files in PATH" "/usr/local"
|
||||
mkl_option "Standard" exec_prefix "--exec-prefix=PATH" \
|
||||
"Install arch-dependent files in PATH" "\$prefix"
|
||||
mkl_option "Standard" bindir "--bindir=PATH" "User executables" "\$exec_prefix/bin"
|
||||
mkl_option "Standard" sbindir "--sbindir=PATH" "System admin executables" \
|
||||
"\$exec_prefix/sbin"
|
||||
mkl_option "Standard" libexecdir "--libexecdir=PATH" "Program executables" \
|
||||
"\$exec_prefix/libexec"
|
||||
mkl_option "Standard" datadir "--datadir=PATH" "Read-only arch-independent data" \
|
||||
"\$prefix/share"
|
||||
mkl_option "Standard" sysconfdir "--sysconfdir=PATH" "Configuration data" \
|
||||
"\$prefix/etc"
|
||||
mkl_option "Standard" sharedstatedir "--sharedstatedir=PATH" \
|
||||
"Modifiable arch-independent data" "\$prefix/com"
|
||||
mkl_option "Standard" localstatedir "--localstatedir=PATH" \
|
||||
"Modifiable local state data" "\$prefix/var"
|
||||
mkl_option "Standard" libdir "--libdir=PATH" "Libraries" "\$exec_prefix/lib"
|
||||
mkl_option "Standard" includedir "--includedir=PATH" "C/C++ header files" \
|
||||
"\$prefix/include"
|
||||
mkl_option "Standard" infodir "--infodir=PATH" "Info documentation" "\$prefix/info"
|
||||
mkl_option "Standard" mandir "--mandir=PATH" "Manual pages" "\$prefix/man"
|
||||
|
||||
mkl_option "Configure tool" "" "--list-modules" "List loaded mklove modules"
|
||||
mkl_option "Configure tool" "" "--list-checks" "List checks"
|
||||
mkl_option "Configure tool" env:MKL_FAILFATAL "--fail-fatal" "All failures are fatal"
|
||||
mkl_option "Configure tool" env:MKL_NOCACHE "--no-cache" "Dont use or generate config.cache"
|
||||
mkl_option "Configure tool" env:MKL_DEBUG "--debug" "Enable configure debugging"
|
||||
mkl_option "Configure tool" env:MKL_CLEAN "--clean" "Remove generated configure files"
|
||||
mkl_option "Configure tool" "" "--reconfigure" "Rerun configure with same arguments as last run"
|
||||
mkl_option "Configure tool" env:MKL_NO_DOWNLOAD "--no-download" "Disable downloads of required mklove modules"
|
||||
mkl_option "Configure tool" env:MKL_UPDATE_MODS "--update-modules" "Update modules from global repository"
|
||||
mkl_option "Configure tool" env:MKL_MODULES_REPO_URL "--repo-url=URL_OR_PATH" "Override mklove modules repo URL" "$MKL_MODULES_REPO_URL"
|
||||
mkl_option "Configure tool" "" "--help" "Show configure usage"
|
||||
|
||||
|
||||
mkl_toggle_option "Compatibility" "mk:MKL_MAINT_MODE" "--enable-maintainer-mode" "Maintainer mode (no-op)"
|
||||
|
||||
mkl_option "Configure tool" "mk:PROGRAM_PREFIX" "--program-prefix=PFX" "Program prefix"
|
||||
|
||||
mkl_option "Compatibility" "mk:DISABL_DEP_TRACK" "--disable-dependency-tracking" "Disable dependency tracking (no-op)"
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Compiler detection
|
||||
# Sets:
|
||||
# CC, CXX, CFLAGS, CPPFLAGS, LDFLAGS, PKG_CONFIG, instALL
|
||||
|
||||
|
||||
mkl_require host
|
||||
|
||||
function checks {
|
||||
|
||||
# C compiler
|
||||
mkl_meta_set "ccenv" "name" "C compiler from CC env"
|
||||
if ! mkl_command_check "ccenv" "WITH_CC" cont "$CC --version"; then
|
||||
if mkl_command_check "gcc" "WITH_GCC" cont "gcc --version"; then
|
||||
CC=gcc
|
||||
elif mkl_command_check "clang" "WITH_CLANG" cont "clang --version"; then
|
||||
CC=clang
|
||||
elif mkl_command_check "cc" "WITH_CC" fail "cc --version"; then
|
||||
CC=cc
|
||||
fi
|
||||
fi
|
||||
export CC="${CC}"
|
||||
mkl_mkvar_set CC CC "$CC"
|
||||
|
||||
# C++ compiler
|
||||
mkl_meta_set "cxxenv" "name" "C++ compiler from CXX env"
|
||||
if ! mkl_command_check "cxxenv" "WITH_CXX" cont "$CXX --version" ; then
|
||||
mkl_meta_set "gxx" "name" "C++ compiler (g++)"
|
||||
mkl_meta_set "clangxx" "name" "C++ compiler (clang++)"
|
||||
mkl_meta_set "cxx" "name" "C++ compiler (c++)"
|
||||
if mkl_command_check "gxx" "WITH_GXX" cont "g++ --version"; then
|
||||
CXX=g++
|
||||
elif mkl_command_check "clangxx" "WITH_CLANGXX" cont "clang++ --version"; then
|
||||
CXX=clang++
|
||||
elif mkl_command_check "cxx" "WITH_CXX" fail "c++ --version"; then
|
||||
CXX=c++
|
||||
fi
|
||||
fi
|
||||
export CXX="${CXX}"
|
||||
mkl_mkvar_set "CXX" CXX $CXX
|
||||
|
||||
# Provide prefix and checks for various other build tools.
|
||||
local t=
|
||||
for t in LD:ld NM:nm OBJDUMP:objdump STRIP:strip ; do
|
||||
local tenv=${t%:*}
|
||||
t=${t#*:}
|
||||
|
||||
[[ -z ${!tenv} ]] && mkl_env_set "$tenv" "$t"
|
||||
|
||||
if mkl_command_check "$t" "" fail "${!tenv} --version" ; then
|
||||
export "$tenv"="${!tenv}"
|
||||
mkl_mkvar_set $tenv $tenv "${!tenv}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Compiler and linker flags
|
||||
[[ ! -z $CFLAGS ]] && mkl_mkvar_append "CFLAGS" "CFLAGS" $CFLAGS
|
||||
[[ ! -z $CPPFLAGS ]] && mkl_mkvar_append "CPPFLAGS" "CPPFLAGS" $CPPFLAGS
|
||||
[[ ! -z $CXXFLAGS ]] && mkl_mkvar_append "CFLAGS" "CXXFLAGS" $CXXFLAGS
|
||||
[[ ! -z $LDFLAGS ]] && mkl_mkvar_append "CFLAGS" "LDFLAGS" $LDFLAGS
|
||||
|
||||
mkl_mkvar_append CPPFLAGS CPPFLAGS "-g"
|
||||
|
||||
|
||||
# pkg-config
|
||||
if [ -z "$PKG_CONFIG" ]; then
|
||||
PKG_CONFIG=pkg-config
|
||||
fi
|
||||
|
||||
if mkl_command_check "pkgconfig" "WITH_PKGCONFIG" cont "$PKG_CONFIG --version"; then
|
||||
export PKG_CONFIG
|
||||
fi
|
||||
mkl_mkvar_set "pkgconfig" PKG_CONFIG $PKG_CONFIG
|
||||
|
||||
[[ ! -z "$PKG_CONFIG_PATH" ]] && mkl_env_append PKG_CONFIG_PATH "$PKG_CONFIG_PATH"
|
||||
|
||||
# install
|
||||
if [ -z "$INSTALL" ]; then
|
||||
INSTALL=install
|
||||
fi
|
||||
|
||||
if mkl_command_check "install" "WITH_INSTALL" cont "$INSTALL --version"; then
|
||||
export INSTALL
|
||||
fi
|
||||
mkl_mkvar_set "install" INSTALL $INSTALL
|
||||
}
|
||||
|
||||
|
||||
mkl_option "Compiler" "env:CC" "--cc=CC" "Build using C compiler CC" "\$CC"
|
||||
mkl_option "Compiler" "env:CXX" "--cxx=CXX" "Build using C++ compiler CXX" "\$CXX"
|
||||
mkl_option "Compiler" "ARCH" "--arch=ARCH" "Build for architecture" "$(uname -m)"
|
||||
mkl_option "Compiler" "CPU" "--cpu=CPU" "Build and optimize for specific CPU" "generic"
|
||||
|
||||
|
||||
for n in CFLAGS CPPFLAGS CXXFLAGS LDFLAGS; do
|
||||
mkl_option "Compiler" "mk:$n" "--$n=$n" "Add $n flags"
|
||||
done
|
||||
|
||||
mkl_option "Compiler" "env:PKG_CONFIG_PATH" "--pkg-config-path" "Extra paths for pkg-config"
|
||||
|
||||
mkl_option "Compiler" "WITH_PROFILING" "--enable-profiling" "Enable profiling"
|
||||
function opt_enable-profiling {
|
||||
if [[ $2 == "y" ]]; then
|
||||
mkl_allvar_set "" "WITH_PROFILING" "y"
|
||||
mkl_mkvar_append CPPFLAGS CPPFLAGS "-pg"
|
||||
mkl_mkvar_append LDFLAGS LDFLAGS "-pg"
|
||||
fi
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Reads version from file and sets variables accordingly
|
||||
# The first non-commented line in the file is expected to be the version string.
|
||||
# Arguments:
|
||||
# filename
|
||||
# STR_VERSION_VARIABLE_NAME
|
||||
# [ HEX_VERSION_VARIABLE_NAME ]
|
||||
#
|
||||
# Example: Set string version in variable named "MYVERSION_STR" and
|
||||
# the hex representation in "MYVERSION"
|
||||
# mkl_require VERSION.txt MYVERSION_STR MYVERSION
|
||||
|
||||
if [[ -z "$2" ]]; then
|
||||
mkl_fail "fileversion" "none" "fail" "Missing argument(s), expected: FILENAME STR_VER HEX_VER"
|
||||
return 0
|
||||
fi
|
||||
|
||||
fileversion_file="$1"
|
||||
fileversion_strvar="$2"
|
||||
fileversion_hexvar="$3"
|
||||
|
||||
function checks {
|
||||
mkl_check_begin "fileversion" "" "no-cache" "version from file $fileversion_file"
|
||||
|
||||
if [[ ! -s $fileversion_file ]]; then
|
||||
mkl_check_failed "fileversion" "" "fail" \
|
||||
"Version file $fileversion_file is not readable"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local orig=$(grep -v ^\# "$fileversion_file" | grep -v '^$' | head -1)
|
||||
# Strip v prefix if any
|
||||
orig=${orig#v}
|
||||
|
||||
# Try to decode version string into hex
|
||||
# Supported format is "[v]NN.NN.NN[.NN]"
|
||||
if [[ ! -z $fileversion_hexvar ]]; then
|
||||
local hex=""
|
||||
local s=${orig#v} # Strip v prefix, if any.
|
||||
local ncnt=0
|
||||
local n=
|
||||
for n in ${s//./ } ; do
|
||||
if [[ ! ( "$n" =~ ^[0-9][0-9]?$ ) ]]; then
|
||||
mkl_check_failed "fileversion" "" "fail" \
|
||||
"$fileversion_file: Could not decode '$orig' into hex version, expecting format 'NN.NN.NN[.NN]'"
|
||||
return 1
|
||||
fi
|
||||
hex="$hex$(printf %02x $n)"
|
||||
ncnt=$(expr $ncnt + 1)
|
||||
done
|
||||
|
||||
if [[ ! -z $hex ]]; then
|
||||
# Finish all four bytess
|
||||
for n in {$ncnt..4} ; do
|
||||
hex="$hex$(printf %02x 0)"
|
||||
done
|
||||
mkl_allvar_set "fileversion" "$fileversion_hexvar" "0x$hex"
|
||||
fi
|
||||
fi
|
||||
|
||||
mkl_allvar_set "fileversion" "$fileversion_strvar" "$orig"
|
||||
|
||||
mkl_check_done "fileversion" "" "cont" "ok" "${!fileversion_strvar}"
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Generates pkg-config file for library.
|
||||
#
|
||||
# Arguments:
|
||||
# libname (e.g., "rdkafka" for librdkafka)
|
||||
# name (e.g., "The Apache Kafka C/C++ library")
|
||||
# description (e.g., "A full producer and consumer for Apache Kafka 0.8...")
|
||||
# version (e.g., "1.2.3" or "$VERSION" or "\$VERSION" (for late reference)
|
||||
|
||||
if [[ -z "$4" ]]; then
|
||||
mkl_fail "pkg_config_gen" "none" "fail" \
|
||||
"Missing arguments to module: syntax: libname name description version"
|
||||
else
|
||||
mkl_var_set "MKL__PKG_CONFIG_libname" "$1"
|
||||
mkl_var_set "MKL__PKG_CONFIG_name" "$2"
|
||||
mkl_var_set "MKL__PKG_CONFIG_desc" "$3"
|
||||
mkl_var_set "MKL__PKG_CONFIG_version" "$4"
|
||||
fi
|
||||
|
||||
|
||||
# Add line to generated pkg-config file.
|
||||
# Arguments:
|
||||
# line
|
||||
function mkl_pkg-config_append {
|
||||
printf -v "MKL__PKG_CONFIG_extra" "%s%s" "${MKL__PKG_CONFIG_extra}" "$1
|
||||
"
|
||||
}
|
||||
|
||||
|
||||
# Generate .pc file
|
||||
function generate {
|
||||
local fname="$(mkl_var_get MKL__PKG_CONFIG_libname).pc"
|
||||
|
||||
# Evaluate late reference variables in version
|
||||
local ver=$(eval echo ${MKL__PKG_CONFIG_version})
|
||||
|
||||
echo > $fname \
|
||||
"prefix=$prefix
|
||||
libdir=$libdir
|
||||
includedir=$includedir
|
||||
|
||||
Name: ${MKL__PKG_CONFIG_name}
|
||||
Description: ${MKL__PKG_CONFIG_desc}
|
||||
Version: $ver
|
||||
Cflags: -I\${includedir}
|
||||
Libs: -L\${libdir} -l${MKL__PKG_CONFIG_libname}
|
||||
${MKL__PKG_CONFIG_extra}"
|
||||
|
||||
echo "Generated $fname"
|
||||
}
|
||||
|
||||
# Cleanup .pc file
|
||||
function clean {
|
||||
local fname="$(mkl_var_get MKL__PKG_CONFIG_libname).pc"
|
||||
mkl_rm "$fname"
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Sets version variable from git information.
|
||||
# Optional arguments:
|
||||
# "as"
|
||||
# VARIABLE_NAME
|
||||
#
|
||||
# Example: Set version in variable named "MYVERSION":
|
||||
# mkl_require gitversion as MYVERSION
|
||||
|
||||
if [[ $1 == "as" ]]; then
|
||||
__MKL_GITVERSION_VARNAME="$2"
|
||||
else
|
||||
__MKL_GITVERSION_VARNAME="VERSION"
|
||||
fi
|
||||
|
||||
function checks {
|
||||
mkl_allvar_set "gitversion" "$__MKL_GITVERSION_VARNAME" "$(git describe --abbrev=6 --tags HEAD --always)"
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Provides some known-good CFLAGS
|
||||
# Sets:
|
||||
# CFLAGS
|
||||
# CXXFLAGS
|
||||
# CPPFLAGS
|
||||
|
||||
|
||||
function checks {
|
||||
mkl_mkvar_append CPPFLAGS CPPFLAGS \
|
||||
"-O2 -Wall -Werror -Wfloat-equal -Wpointer-arith"
|
||||
mkl_mkvar_append LDFLAGS LDFLAGS "-g"
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Host OS support
|
||||
# Sets:
|
||||
# HOST
|
||||
# BUILD
|
||||
# TARGET
|
||||
|
||||
# FIXME: No need for this right now
|
||||
#mkl_require host_linux
|
||||
#mkl_require host_osx
|
||||
#mkl_require host_cygwin
|
||||
|
||||
#mkl_option "Cross-compilation" "mk:HOST_OS" "--host-os=osname" "Host OS (linux,osx,cygwin,..)" "auto"
|
||||
|
||||
|
||||
# autoconf compatibility - does nothing at this point
|
||||
mkl_option "Cross-compilation" "mk:HOST" "--host=HOST" "Configure to build programs to run on HOST (no-op)"
|
||||
mkl_option "Cross-compilation" "mk:BUILD" "--build=BUILD" "Configure for building on BUILD (no-op)"
|
||||
mkl_option "Cross-compilation" "mk:TARGET" "--target=TARGET" "Configure for building cross-toolkits for platform TARGET (no-op)"
|
||||
|
||||
|
||||
#function checks {
|
||||
# mkl_check_begin "host" "HOST_OS" "no-cache" "host OS"
|
||||
#
|
||||
# #
|
||||
# # If --host-os=.. was not specified then this is most likely not a
|
||||
# # a cross-compilation and we can base the host-os on the native OS.
|
||||
# #
|
||||
# if [[ $HOST_OS != "auto" ]]; then
|
||||
# mkl_check_done "host" "HOST_OS" "cont" "ok" "$HOST_OS"
|
||||
# return 0
|
||||
# fi
|
||||
#
|
||||
# kn=$(uname -s)
|
||||
# case $kn in
|
||||
# Linux)
|
||||
# hostos=linux
|
||||
# ;;
|
||||
# Darwin)
|
||||
# hostos=osx
|
||||
# ;;
|
||||
# CYGWIN*)
|
||||
# hostos=cygwin
|
||||
# ;;
|
||||
# *)
|
||||
# hostos="$(mkl_lower $kn)"
|
||||
# mkl_err "Unknown host OS kernel name: $kn"
|
||||
# mkl_err0 " Will attempt to load module host_$hostos anyway."
|
||||
# mkl_err0 " Please consider writing a configure.host_$hostos"
|
||||
# ;;
|
||||
# esac
|
||||
#
|
||||
# if ! mkl_require --try "host_$hostos"; then
|
||||
# # Module not found
|
||||
# mkl_check_done "host" "HOST_OS" "cont" "failed" "$kn?"
|
||||
# else
|
||||
# # Module loaded
|
||||
#
|
||||
# if mkl_func_exists "host_${hostos}_setup" ; then
|
||||
# "host_${hostos}_setup"
|
||||
# fi
|
||||
#
|
||||
# mkl_check_done "host" "HOST_OS" "cont" "ok" "$hostos"
|
||||
# fi
|
||||
#
|
||||
# # Set HOST_OS var even if probing failed.
|
||||
# mkl_mkvar_set "host" "HOST_OS" "$hostos"
|
||||
#}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Module for building shared libraries
|
||||
|
||||
mkl_require pic
|
||||
|
||||
function checks {
|
||||
|
||||
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-shared'
|
||||
|
||||
# Check what arguments to pass to CC or LD for shared libraries
|
||||
mkl_meta_set gnulib name "GNU-compatible linker options"
|
||||
mkl_meta_set osxlib name "OSX linker options"
|
||||
|
||||
if mkl_compile_check gnulib WITH_GNULD cont CC \
|
||||
"-shared -Wl,-soname,mkltest.0" "" ; then
|
||||
# GNU linker
|
||||
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-Wl,-soname,$(LIBNAME).so.$(LIBVER)'
|
||||
|
||||
elif mkl_compile_check osxlib WITH_OSXLD cont CC \
|
||||
"-dynamiclib -Wl,-install_name,/tmp/mkltest.so.0" ; then
|
||||
# OSX linker
|
||||
mkl_mkvar_append LIB_LDFLAGS LIB_LDFLAGS '-dynamiclib -Wl,-install_name,$(DESTDIR)$(libdir)/$(LIBNAME).so.$(LIBVER)'
|
||||
fi
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Parses the provided version string and creates variables accordingly.
|
||||
# [ "hex2str" <fmt> ] -- version-string is in hex (e.g., 0x00080300)
|
||||
# version-string
|
||||
# STR_VERSION_VARIABLE_NAME
|
||||
# [ HEX_VERSION_VARIABLE_NAME ]
|
||||
#
|
||||
# Example: Set string version in variable named "MYVERSION_STR" and
|
||||
# the hex representation in "MYVERSION"
|
||||
# mkl_require parseversion "$(head -1 VERSION.txt)" MYVERSION_STR MYVERSION
|
||||
|
||||
if [[ $1 == "hex2str" ]]; then
|
||||
parseversion_type="hex"
|
||||
parseversion_fmt="${2}:END:%d%d%d%d"
|
||||
shift
|
||||
shift
|
||||
else
|
||||
parseversion_type=""
|
||||
parseversion_fmt="%d.%d.%d.%d"
|
||||
fi
|
||||
|
||||
if [[ -z "$2" ]]; then
|
||||
mkl_fail "parseversion" "none" "fail" "Missing argument(s)"
|
||||
return 0
|
||||
fi
|
||||
|
||||
parseversion_orig="$1"
|
||||
parseversion_strvar="$2"
|
||||
parseversion_hexvar="$3"
|
||||
|
||||
function checks {
|
||||
mkl_check_begin --verb "parsing" "parseversion" "" "no-cache" \
|
||||
"version '$parseversion_orig'"
|
||||
|
||||
# Strip v prefix if any
|
||||
orig=${parseversion_orig#v}
|
||||
|
||||
if [[ $orig == 0x* ]]; then
|
||||
parseversion_type="hex"
|
||||
orig=${orig#0x}
|
||||
fi
|
||||
|
||||
if [[ -z $orig ]]; then
|
||||
mkl_check_failed "parseversion" "" "fail" "Version string is empty"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# If orig is in hex we construct a string format instead.
|
||||
if [[ $parseversion_type == "hex" ]]; then
|
||||
local s=$orig
|
||||
local str=""
|
||||
local vals=""
|
||||
while [[ ! -z $s ]]; do
|
||||
local n=${s:0:2}
|
||||
s=${s:${#n}}
|
||||
vals="${vals}$(printf %d 0x$n) "
|
||||
done
|
||||
str=$(printf "$parseversion_fmt" $vals)
|
||||
orig=${str%:END:*}
|
||||
fi
|
||||
|
||||
|
||||
# Try to decode version string into hex
|
||||
# Supported format is "[v]NN.NN.NN[.NN]"
|
||||
if [[ ! -z $parseversion_hexvar ]]; then
|
||||
local hex=""
|
||||
local s=$orig
|
||||
local ncnt=0
|
||||
local n=
|
||||
for n in ${s//./ } ; do
|
||||
if [[ ! ( "$n" =~ ^[0-9][0-9]?$ ) ]]; then
|
||||
mkl_check_failed "parseversion" "" "fail" \
|
||||
"Could not decode '$parseversion_orig' into hex version, expecting format 'NN.NN.NN[.NN]'"
|
||||
return 1
|
||||
fi
|
||||
hex="$hex$(printf %02x $n)"
|
||||
ncnt=$(expr $ncnt + 1)
|
||||
done
|
||||
|
||||
if [[ ! -z $hex ]]; then
|
||||
# Finish all four bytess
|
||||
while [[ ${#hex} -lt 8 ]]; do
|
||||
hex="$hex$(printf %02x 0)"
|
||||
done
|
||||
mkl_allvar_set "parseversion" "$parseversion_hexvar" "0x$hex"
|
||||
fi
|
||||
fi
|
||||
|
||||
mkl_allvar_set "parseversion" "$parseversion_strvar" "$orig"
|
||||
|
||||
mkl_check_done "parseversion" "" "cont" "ok" "${!parseversion_strvar}"
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Checks if -fPIC is supported, and if so turns it on.
|
||||
#
|
||||
# Sets:
|
||||
# HAVE_PIC
|
||||
# CPPFLAGS
|
||||
#
|
||||
|
||||
function checks {
|
||||
|
||||
if mkl_compile_check PIC HAVE_PIC disable CC "-fPIC" "" ; then
|
||||
mkl_mkvar_append CPPFLAGS CPPFLAGS "-fPIC"
|
||||
fi
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
PKGNAME= librdkafka
|
||||
LIBNAME= librdkafka++
|
||||
LIBVER= 1
|
||||
|
||||
CXXSRCS= RdKafka.cpp ConfImpl.cpp HandleImpl.cpp \
|
||||
ConsumerImpl.cpp ProducerImpl.cpp \
|
||||
TopicImpl.cpp MessageImpl.cpp
|
||||
|
||||
HDRS= rdkafkacpp.h
|
||||
|
||||
OBJS= $(CXXSRCS:%.cpp=%.o)
|
||||
|
||||
|
||||
|
||||
all: lib check
|
||||
|
||||
include ../mklove/Makefile.base
|
||||
|
||||
CHECK_FILES+= $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
|
||||
|
||||
check: file-check
|
||||
|
||||
install: lib-install
|
||||
|
||||
clean: lib-clean
|
||||
|
||||
$(LIBNAME).lds: $(HDRS)
|
||||
@(echo "$(MKL_YELLOW)Generating linker script $@ from $(HDRS)$(MKL_CLR_RESET)" ; \
|
||||
cat $(HDRS) | ../lds-gen.pl > $@)
|
||||
|
||||
-include $(DEPS)
|
|
@ -35,7 +35,7 @@
|
|||
#include "rdkafkacpp.h"
|
||||
|
||||
extern "C" {
|
||||
#include "../rdkafka.h"
|
||||
#include "../src/rdkafka.h"
|
||||
};
|
||||
|
||||
namespace RdKafka {
|
|
@ -0,0 +1,38 @@
|
|||
PKGNAME= librdkafka
|
||||
LIBNAME= librdkafka
|
||||
LIBVER= 1
|
||||
|
||||
|
||||
SRCS= rdkafka.c rdkafka_broker.c rdkafka_msg.c rdkafka_topic.c \
|
||||
rdkafka_defaultconf.c rdkafka_timer.c rdkafka_offset.c \
|
||||
rdcrc32.c rdgz.c rdaddr.c rdrand.c rdthread.c rdqueue.c \
|
||||
rdlog.c \
|
||||
snappy.c
|
||||
|
||||
HDRS= rdkafka.h
|
||||
|
||||
OBJS= $(SRCS:.c=.o)
|
||||
|
||||
|
||||
all: lib check
|
||||
|
||||
include ../mklove/Makefile.base
|
||||
|
||||
CHECK_FILES+= $(LIBNAME).so.$(LIBVER) $(LIBNAME).a
|
||||
|
||||
check: file-check
|
||||
@(printf "%-30s " "Symbol visibility" ; \
|
||||
((nm -D librdkafka.so.1 | grep -q rd_kafka_new) && \
|
||||
(nm -D librdkafka.so.1 | grep -vq rd_kafka_destroy) && \
|
||||
echo "\033[32mOK\033[0m") || \
|
||||
echo "\033[31mFAILED\033[0m")
|
||||
|
||||
install: lib-install
|
||||
|
||||
clean: lib-clean
|
||||
|
||||
$(LIBNAME).lds: $(HDRS)
|
||||
@(echo "$(MKL_YELLOW)Generating linker script $@ from $(HDRS)$(MKL_CLR_RESET)" ; \
|
||||
cat $(HDRS) | ../lds-gen.pl > $@)
|
||||
|
||||
-include $(DEPS)
|
|
@ -41,6 +41,8 @@
|
|||
#include <assert.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../config.h"
|
||||
|
||||
#include "rdtypes.h"
|
||||
|
||||
|
||||
|
@ -83,13 +85,12 @@
|
|||
((val) < (low) ? low : ((val) > (hi) ? (hi) : (val)))
|
||||
|
||||
|
||||
#define rd_atomic_add(PTR,VAL) __sync_add_and_fetch(PTR,VAL)
|
||||
#define rd_atomic_sub(PTR,VAL) __sync_sub_and_fetch(PTR,VAL)
|
||||
#define rd_atomic_add(PTR,VAL) ATOMIC_OP(add,fetch,PTR,VAL)
|
||||
#define rd_atomic_sub(PTR,VAL) ATOMIC_OP(sub,fetch,PTR,VAL)
|
||||
|
||||
#define rd_atomic_add_prev(PTR,VAL) __sync_fetch_and_add(PTR,VAL)
|
||||
#define rd_atomic_sub_prev(PTR,VAL) __sync_fetch_and_sub(PTR,VAL)
|
||||
#define rd_atomic_add_prev(PTR,VAL) ATOMIC_OP(fetch,add,PTR,VAL)
|
||||
#define rd_atomic_sub_prev(PTR,VAL) ATOMIC_OP(fetch,sub,PTR,VAL)
|
||||
|
||||
#define rd_atomic_set(PTR,VAL) __sync_lock_test_and_set(PTR,VAL)
|
||||
|
||||
|
||||
#ifndef be64toh
|
|
@ -235,7 +235,7 @@ void rd_kafka_q_purge (rd_kafka_q_t *rkq) {
|
|||
}
|
||||
|
||||
TAILQ_INIT(&rkq->rkq_q);
|
||||
(void)rd_atomic_set(&rkq->rkq_qlen, 0);
|
||||
rkq->rkq_qlen = 0;
|
||||
|
||||
pthread_mutex_unlock(&rkq->rkq_lock);
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ size_t rd_kafka_q_move_cnt (rd_kafka_q_t *dstq, rd_kafka_q_t *srcq,
|
|||
mcnt = srcq->rkq_qlen;
|
||||
TAILQ_CONCAT(&dstq->rkq_q, &srcq->rkq_q, rko_link);
|
||||
TAILQ_INIT(&srcq->rkq_q);
|
||||
(void)rd_atomic_set(&srcq->rkq_qlen, 0);
|
||||
srcq->rkq_qlen = 0;
|
||||
(void)rd_atomic_add(&dstq->rkq_qlen, mcnt);
|
||||
} else {
|
||||
while (mcnt < cnt && (rko = TAILQ_FIRST(&srcq->rkq_q))) {
|
||||
|
@ -365,7 +365,7 @@ int rd_kafka_q_serve (rd_kafka_t *rk,
|
|||
|
||||
/* Reset real queue */
|
||||
TAILQ_INIT(&rkq->rkq_q);
|
||||
(void)rd_atomic_set(&rkq->rkq_qlen, 0);
|
||||
rkq->rkq_qlen = 0;
|
||||
pthread_mutex_unlock(&rkq->rkq_lock);
|
||||
|
||||
rd_kafka_dbg(rk, QUEUE, "QSERVE", "Serving %i ops", localq.rkq_qlen);
|
||||
|
@ -580,7 +580,7 @@ void rd_kafka_destroy0 (rd_kafka_t *rk) {
|
|||
|
||||
free(rk);
|
||||
|
||||
rd_atomic_sub(&rd_kafka_handle_cnt_curr, 1);
|
||||
(void)rd_atomic_sub(&rd_kafka_handle_cnt_curr, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -940,7 +940,7 @@ rd_kafka_t *rd_kafka_new (rd_kafka_type_t type, rd_kafka_conf_t *conf,
|
|||
if (rk->rk_conf.brokerlist)
|
||||
rd_kafka_brokers_add(rk, rk->rk_conf.brokerlist);
|
||||
|
||||
rd_atomic_add(&rd_kafka_handle_cnt_curr, 1);
|
||||
(void)rd_atomic_add(&rd_kafka_handle_cnt_curr, 1);
|
||||
|
||||
return rk;
|
||||
}
|
|
@ -123,7 +123,7 @@ static void rd_kafka_broker_set_state (rd_kafka_broker_t *rkb,
|
|||
rkb->rkb_rk->rk_broker_down_cnt,
|
||||
rkb->rkb_rk->rk_broker_cnt);
|
||||
} else if (rkb->rkb_state == RD_KAFKA_BROKER_STATE_DOWN)
|
||||
rd_atomic_sub(&rkb->rkb_rk->rk_broker_down_cnt, 1);
|
||||
(void)rd_atomic_sub(&rkb->rkb_rk->rk_broker_down_cnt, 1);
|
||||
|
||||
rkb->rkb_state = state;
|
||||
}
|
||||
|
@ -1300,7 +1300,11 @@ err:
|
|||
*/
|
||||
int rd_kafka_socket_cb_linux (int domain, int type, int protocol,
|
||||
void *opaque) {
|
||||
#ifdef SOCK_CLOEXEC
|
||||
return socket(domain, type | SOCK_CLOEXEC, protocol);
|
||||
#else
|
||||
return rd_kafka_socket_cb_generic(domain, type, protocol, opaque);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1311,7 +1315,7 @@ int rd_kafka_socket_cb_generic (int domain, int type, int protocol,
|
|||
void *opaque) {
|
||||
int s;
|
||||
int on = 1;
|
||||
s = socket(domain, type | SOCK_CLOEXEC, protocol);
|
||||
s = socket(domain, type, protocol);
|
||||
if (s == -1)
|
||||
return -1;
|
||||
#ifdef FD_CLOEXEC
|
||||
|
@ -3305,7 +3309,7 @@ static void *rd_kafka_broker_thread_main (void *arg) {
|
|||
|
||||
rd_kafka_lock(rkb->rkb_rk);
|
||||
TAILQ_REMOVE(&rkb->rkb_rk->rk_brokers, rkb, rkb_link);
|
||||
rd_atomic_sub(&rkb->rkb_rk->rk_broker_cnt, 1);
|
||||
(void)rd_atomic_sub(&rkb->rkb_rk->rk_broker_cnt, 1);
|
||||
rd_kafka_unlock(rkb->rkb_rk);
|
||||
rd_kafka_broker_fail(rkb, RD_KAFKA_RESP_ERR__DESTROY, NULL);
|
||||
rd_kafka_broker_destroy(rkb);
|
||||
|
@ -3424,7 +3428,7 @@ static rd_kafka_broker_t *rd_kafka_broker_add (rd_kafka_t *rk,
|
|||
}
|
||||
|
||||
TAILQ_INSERT_TAIL(&rkb->rkb_rk->rk_brokers, rkb, rkb_link);
|
||||
rd_atomic_add(&rkb->rkb_rk->rk_broker_cnt, 1);
|
||||
(void)rd_atomic_add(&rkb->rkb_rk->rk_broker_cnt, 1);
|
||||
|
||||
rd_rkb_dbg(rkb, BROKER, "BROKER",
|
||||
"Added new broker with NodeId %"PRId32,
|
|
@ -72,7 +72,11 @@ static void rd_kafka_offset_file_close (rd_kafka_toppar_t *rktp) {
|
|||
*/
|
||||
int rd_kafka_open_cb_linux (const char *pathname, int flags, mode_t mode,
|
||||
void *opaque) {
|
||||
#ifdef O_CLOEXEC
|
||||
return open(pathname, flags|O_CLOEXEC, mode);
|
||||
#else
|
||||
return rd_kafka_open_cb_generic(pathname, flags, mode, opaque);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
|
@ -1,33 +1,23 @@
|
|||
TESTSRCS ?= $(wildcard 0*-*.c)
|
||||
TESTS ?= $(TESTSRCS:%.c=%.test)
|
||||
|
||||
CC ?= cc
|
||||
CXX ?= g++
|
||||
CFLAGS += -g -Wall -Werror -Wfloat-equal -Wpointer-arith -O2 -I../
|
||||
CXXFLAGS += $(CFLAGS)
|
||||
LDFLAGS += -L../ -lrdkafka
|
||||
LDFLAGS += -lpthread -lz
|
||||
ifeq ($(shell uname -s), Linux)
|
||||
LDFLAGS += -lrt
|
||||
endif
|
||||
|
||||
# Profiling
|
||||
#CFLAGS += -O0 -pg
|
||||
#LDFLAGS += -pg
|
||||
|
||||
|
||||
%.test: ../librdkafka.a test.o %.c
|
||||
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
|
||||
%.test: ../src/librdkafka.a test.o %.c
|
||||
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) -lrdkafka $(LIBS)
|
||||
|
||||
all: $(TESTS)
|
||||
for i in $^ ; do \
|
||||
LD_LIBRARY_PATH=../ ./run-test.sh $$i || exit 1 ; \
|
||||
LD_LIBRARY_PATH=../src ./run-test.sh $$i || exit 1 ; \
|
||||
done
|
||||
|
||||
include ../mklove/Makefile.base
|
||||
|
||||
CFLAGS += -I../src
|
||||
LDFLAGS += -L../src
|
||||
|
||||
test.o: test.c
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
|
||||
clean:
|
||||
rm -f *.test
|
||||
rm -f *.test test.o
|
||||
|
||||
|
|
Loading…
Reference in New Issue