Skip to content

Commit 852da1d

Browse files
IvanNardiclaude
andcommitted
Build system: Improve portability, parallelization, and VPATH builds
This commit implements comprehensive improvements to the nDPI build system to enhance portability, enable parallel testing, and ensure reliable out-of-tree (VPATH) builds across all platforms. Changes: 1. Optimize library linking order (configure.ac, all Makefiles) - Reorder ADDITIONAL_LIBS to follow proper dependency hierarchy - Move low-level libraries (libm) to end of link line - Ensures compatibility with --as-needed linker flag - Improves LTO and static linking support 2. Fix VPATH build dependencies (all Makefiles) - Add explicit dependencies on generated headers (ndpi_config.h, ndpi_define.h) - Prevents race conditions in parallel builds (make -j) - Ensures headers exist before compilation starts 3. Replace mkdir -p with portable $(MKDIR_P) macro 4. Enable parallel test execution (configure.ac) - Add 'parallel-tests' option to AM_INIT_AUTOMAKE - Allows test suites to run concurrently during 'make check' 5. Add defensive .NOTPARALLEL directive (Makefile.am) - Prevents race conditions if 'make -j clean distclean' is run 6. Fix clean target completeness (src/lib/Makefile.in) - Remove all .so symlinks (libndpi.so, libndpi.so.N) - Add cleanup for Windows DLL files (*.dll) - Explicitly remove versioned shared libraries 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> Co-Authored-By: Ivan Nardi <[email protected]>
1 parent 6bb0585 commit 852da1d

File tree

10 files changed

+45
-25
lines changed

10 files changed

+45
-25
lines changed

Makefile.am

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ doc-view:
4343
python3 -m http.server --bind 127.0.0.1 --directory doc/_build/html 8080
4444

4545
coverage: all
46-
mkdir -vp coverage_report/ndpi_coverage_report
46+
$(MKDIR_P) coverage_report/ndpi_coverage_report
4747
lcov --directory . --capture --output-file lcov.info
4848
genhtml -o coverage_report/ndpi_coverage_report lcov.info
4949

@@ -60,3 +60,6 @@ changelog:
6060
cd $(top_srcdir) && git log --since={`curl -s https://github.com/ntop/ndpi/releases | grep datetime | head -n1 | egrep -o "[0-9]+\-[0-9]+\-[0-9]+"`} --name-only --pretty=format:" - %s" | grep "^ " > CHANGELOG.latest
6161

6262
.PHONY: doc doc-view coverage clean-coverage changelog
63+
64+
# Prevent parallel execution of clean/distclean to avoid potential race conditions
65+
.NOTPARALLEL: clean distclean

configure.ac

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ AC_INIT([libndpi],[5.1.0])
33
AC_CONFIG_AUX_DIR([.])
44
AC_CONFIG_MACRO_DIR([m4])
55

6-
AM_INIT_AUTOMAKE([foreign subdir-objects])
6+
AM_INIT_AUTOMAKE([foreign subdir-objects parallel-tests])
77

88
AC_PREFIX_DEFAULT(/usr)
99

@@ -121,6 +121,8 @@ fi
121121
dnl> Can't use AM_PROG_AR because not all of our Makefiles are automake (yet?)
122122
AC_CHECK_TOOL(AR, ar, [false])
123123

124+
AC_PROG_MKDIR_P
125+
124126
AC_LANG_WERROR
125127

126128
#We should use latest croaring version, but with old compilers we need to
@@ -310,7 +312,7 @@ AS_IF([test "x$enable_global_context_support" != "xno"], [
310312
])
311313

312314
ADDITIONAL_INCS="${ADDITIONAL_INCS}"
313-
ADDITIONAL_LIBS="${ADDITIONAL_LIBS} $LIBM"
315+
ADDITIONAL_LIBS="${ADDITIONAL_LIBS}"
314316
PCAP_HOME=$HOME/PF_RING/userland
315317

316318
DPDK_TARGET=
@@ -501,6 +503,10 @@ if test "${with_maxminddb+set}" = set; then :
501503
fi
502504
fi
503505

506+
dnl> Add base system libraries last (lowest-level dependencies)
507+
dnl> This ensures proper linking order: high-level libs -> low-level libs
508+
ADDITIONAL_LIBS="${ADDITIONAL_LIBS} $LIBM"
509+
504510
dnl> Use absolute source directory for NDPI_BASE_DIR
505511
NDPI_ABS_SRCDIR="`cd ${srcdir} && pwd`"
506512
AC_DEFINE_UNQUOTED(NDPI_BASE_DIR, "${NDPI_ABS_SRCDIR}", [nDPI base directory])
@@ -517,9 +523,10 @@ dnl> fi
517523

518524
dnl> ndpiReader has some hard-coded unit tests: in the out-of-tree builds we need some configuration files in the expected path
519525
if test "${srcdir}" != . ; then :
520-
mkdir -p example
526+
$MKDIR_P example
527+
$MKDIR_P lists
521528
cp ${srcdir}/example/categories.txt example/
522-
cp -R ${srcdir}/lists lists/
529+
cp -R ${srcdir}/lists/* lists/
523530
fi
524531

525532
AC_CONFIG_FILES([Makefile example/Makefile example/Makefile.dpdk tests/Makefile tests/unit/Makefile tests/performance/Makefile tests/dga/Makefile rrdtool/Makefile influxdb/Makefile libndpi.pc src/include/ndpi_define.h src/lib/Makefile fuzz/Makefile doc/Doxyfile.cfg utils/Makefile])

example/Makefile.in

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ endif
2424
CFLAGS+=-I$(SRCHOME)/include -I$(top_builddir)/src/include @NDPI_CFLAGS@ @PCAP_INC@ @GPROF_CFLAGS@ @CUSTOM_NDPI@
2525
LDFLAGS+=@NDPI_LDFLAGS@
2626
LIBNDPI=$(top_builddir)/src/lib/libndpi.a
27-
LIBS=$(LIBNDPI) @PCAP_LIB@ @ADDITIONAL_LIBS@ @LIBS@ @GPROF_LIBS@
27+
LIBS=$(LIBNDPI) @PCAP_LIB@ @ADDITIONAL_LIBS@ @GPROF_LIBS@ @LIBS@
2828
HEADERS=reader_util.h $(SRCHOME)/include/ndpi_api.h \
2929
$(SRCHOME)/include/ndpi_typedefs.h $(SRCHOME)/include/ndpi_protocol_ids.h
30+
HEADERS+=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
3031
PREFIX?=@prefix@
3132

3233
ifneq ($(BUILD_MINGW),)
@@ -72,8 +73,8 @@ ndpiSimpleIntegration$(EXE_SUFFIX): ndpiSimpleIntegration.o
7273
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
7374

7475
install: ndpiReader$(EXE_SUFFIX)
75-
mkdir -p $(DESTDIR)$(PREFIX)/bin/
76-
mkdir -p $(DESTDIR)$(PREFIX)/share/ndpi
76+
$(MKDIR_P) $(DESTDIR)$(PREFIX)/bin/
77+
$(MKDIR_P) $(DESTDIR)$(PREFIX)/share/ndpi
7778
cp ndpiReader$(EXE_SUFFIX) $(DESTDIR)$(PREFIX)/bin/
7879
cp $(srcdir)/protos.txt $(DESTDIR)$(PREFIX)/share/ndpi/ndpiProtos.txt
7980
cp $(srcdir)/mining_hosts.txt $(DESTDIR)$(PREFIX)/share/ndpi/ndpiCustomCategory.txt

fuzz/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ AM_CPPFLAGS = -I $(top_srcdir)/src/include -I $(top_srcdir)/src/lib/third_party/
1919
AM_LDFLAGS = $(LIBS)
2020
AM_CFLAGS = @NDPI_CFLAGS@ $(CFLAGS)
2121
AM_CXXFLAGS = @NDPI_CFLAGS@ $(CXXFLAGS)
22-
LDADD = $(PCAP_LIB) $(top_builddir)/src/lib/libndpi.a $(ADDITIONAL_LIBS)
22+
LDADD = $(top_builddir)/src/lib/libndpi.a $(PCAP_LIB) $(ADDITIONAL_LIBS)
2323
if HAS_FUZZLDFLAGS
2424
CFLAGS += $(LIB_FUZZING_ENGINE)
2525
LDFLAGS += $(LIB_FUZZING_ENGINE)

influxdb/Makefile.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ INC=-I $(top_srcdir)/src/include -I $(top_builddir)/src/include -I/usr/local/inc
99
LIBDPI=$(top_builddir)/src/lib/libndpi.a
1010
CFLAGS+=@NDPI_CFLAGS@
1111
LDFLAGS+=@NDPI_LDFLAGS@
12-
LIB=$(LIBDPI) -lm @ADDITIONAL_LIBS@ @LIBS@
12+
LIB=$(LIBDPI) @ADDITIONAL_LIBS@ @LIBS@ -lm
13+
GEN_HEADERS=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
1314

1415
TOOLS=metric_anomaly
1516

1617
all: $(TOOLS)
1718

18-
metric_anomaly: $(srcdir)/metric_anomaly.c Makefile $(LIBDPI)
19+
metric_anomaly: $(srcdir)/metric_anomaly.c Makefile $(LIBDPI) $(GEN_HEADERS)
1920
$(CC) $(CFLAGS) $(CPPFLAGS) -g $(INC) $(LDFLAGS) $(srcdir)/metric_anomaly.c -o metric_anomaly $(LIB)
2021

2122
clean:

rrdtool/Makefile.in

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@ INC=-I $(top_srcdir)/src/include -I $(top_builddir)/src/include -I/usr/local/inc
99
LIBDPI=$(top_builddir)/src/lib/libndpi.a
1010
CFLAGS+=@NDPI_CFLAGS@
1111
LDFLAGS+=@NDPI_LDFLAGS@
12-
LIB=$(LIBDPI) -lm @ADDITIONAL_LIBS@ @LIBRRD@ @LIBS@ -lpthread
12+
LIB=$(LIBDPI) @ADDITIONAL_LIBS@ @LIBRRD@ @LIBS@ -lm -lpthread
13+
GEN_HEADERS=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
1314

1415
TOOLS=rrd_anomaly rrd_similarity
1516

1617
all: $(TOOLS)
1718

18-
rrd_anomaly: $(srcdir)/rrd_anomaly.c Makefile $(LIBDPI)
19+
rrd_anomaly: $(srcdir)/rrd_anomaly.c Makefile $(LIBDPI) $(GEN_HEADERS)
1920
$(CC) $(CFLAGS) $(CPPFLAGS) -g $(INC) $(LDFLAGS) $(srcdir)/rrd_anomaly.c -o rrd_anomaly $(LIB)
2021

21-
rrd_similarity: $(srcdir)/rrd_similarity.c Makefile $(LIBDPI)
22+
rrd_similarity: $(srcdir)/rrd_similarity.c Makefile $(LIBDPI) $(GEN_HEADERS)
2223
$(CC) $(CFLAGS) $(CPPFLAGS) -g $(INC) $(LDFLAGS) $(srcdir)/rrd_similarity.c -o rrd_similarity $(LIB)
2324

2425
clean:

src/lib/Makefile.in

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ LDFLAGS += @NDPI_LDFLAGS@
3939
LIBS = @ADDITIONAL_LIBS@ @LIBS@ @GPROF_LIBS@
4040

4141
OBJECTS = $(patsubst $(srcdir)/protocols/%.c, %.o, $(wildcard $(srcdir)/protocols/*.c)) $(patsubst $(srcdir)/third_party/src/%.c, %.o, $(wildcard $(srcdir)/third_party/src/*.c)) $(patsubst $(srcdir)/third_party/src/hll/%.c, %.o, $(wildcard $(srcdir)/third_party/src/hll/*.c)) $(patsubst $(srcdir)/%.c, %.o, $(wildcard $(srcdir)/*.c))
42-
HEADERS = $(wildcard $(top_srcdir)/src/include/*.h) $(wildcard $(top_builddir)/src/include/*.h) $(wildcard $(srcdir)/*.h)
42+
HEADERS = $(wildcard $(top_srcdir)/src/include/*.h) $(wildcard $(srcdir)/*.h)
43+
HEADERS += $(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
4344
NDPI_VERSION_MAJOR = @NDPI_MAJOR@
4445
NDPI_LIB_STATIC = libndpi.a
4546
NDPI_LIB_SHARED_BASE = libndpi.so
@@ -70,6 +71,8 @@ all: $(NDPI_LIBS)
7071

7172
ndpi_main.o: $(srcdir)/ndpi_content_match.c.inc
7273

74+
$(OBJECTS): $(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
75+
7376
$(NDPI_LIB_STATIC): $(OBJECTS)
7477
$(AR) rc $@ $(OBJECTS)
7578
$(RANLIB) $@
@@ -83,7 +86,8 @@ $(NDPI_LIB_SHARED): $(OBJECTS)
8386
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$(notdir $<)) -c $< -o $@
8487

8588
clean:
86-
/bin/rm -f $(NDPI_LIB_STATIC) $(OBJECTS) *.o *.so *.lo libndpi.so*
89+
/bin/rm -f $(NDPI_LIB_STATIC) $(NDPI_LIB_SHARED) $(OBJECTS) *.o *.so *.so.* *.lo *.dll
90+
/bin/rm -f $(NDPI_LIB_SHARED_BASE) $(NDPI_LIB_SHARED_BASE).$(NDPI_VERSION_MAJOR)
8791

8892
distdir:
8993
find $(srcdir) -type d | xargs -I'{}' mkdir -p '$(distdir)/{}'
@@ -105,11 +109,11 @@ cppcheck:
105109
cppcheck --template='{file}:{line}:{severity}:{message}' --quiet --enable=all --force -I $(top_srcdir)/src/include $(srcdir)/*.c $(srcdir)/protocols/*.c
106110

107111
install: $(NDPI_LIBS)
108-
mkdir -p $(DESTDIR)@libdir@
112+
$(MKDIR_P) $(DESTDIR)@libdir@
109113
cp $(NDPI_LIBS) $(DESTDIR)@libdir@/
110114
cp -P $(NDPI_LIB_SHARED_BASE) $(DESTDIR)@libdir@/
111115
cp -P $(NDPI_LIB_SHARED_BASE).$(NDPI_VERSION_MAJOR) $(DESTDIR)@libdir@/
112-
mkdir -p $(DESTDIR)@includedir@/ndpi
116+
$(MKDIR_P) $(DESTDIR)@includedir@/ndpi
113117
#Avoid installing private header
114118
# Installing header files to $(DESTDIR)@includedir@/ndpi
115119
find $(top_srcdir)/src/include/*.h ! -name ndpi_private.h -exec cp "{}" $(DESTDIR)@includedir@/ndpi \;

tests/dga/Makefile.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ CFLAGS+=-fPIC -DPIC
1515
endif
1616
CFLAGS+=-g -I$(SRCHOME)/include -I$(top_builddir)/src/include @NDPI_CFLAGS@
1717
LIBNDPI=$(top_builddir)/src/lib/libndpi.a
18-
LIBS=$(LIBNDPI) @ADDITIONAL_LIBS@ -lpthread @LIBS@
18+
LIBS=$(LIBNDPI) @ADDITIONAL_LIBS@ @LIBS@ -lpthread
1919
LDFLAGS+=@NDPI_LDFLAGS@
2020
HEADERS=$(SRCHOME)/include/ndpi_api.h $(SRCHOME)/include/ndpi_typedefs.h $(SRCHOME)/include/ndpi_protocol_ids.h
21+
HEADERS+=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
2122
OBJS=dga_evaluate
2223
PREFIX?=@prefix@
2324

tests/performance/Makefile.in

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ VPATH = @srcdir@
66

77
INC=-I $(top_srcdir)/src/include/ -I $(top_builddir)/src/include/ -I $(top_srcdir)/src/lib/third_party/include/
88
LIB=$(top_builddir)/src/lib/libndpi.a @ADDITIONAL_LIBS@ @LIBS@
9+
GEN_HEADERS=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
910

1011
TOOLS=substringsearch patriciasearch gcrypt-int gcrypt-gnu strnstr
1112
TESTS=substring_test patricia_test strnstr_test geo_test
@@ -15,19 +16,19 @@ all: $(TESTS)
1516

1617
tools: $(TOOLS)
1718

18-
gcrypt-int: $(srcdir)/gcrypt.c Makefile
19+
gcrypt-int: $(srcdir)/gcrypt.c Makefile $(GEN_HEADERS)
1920
$(CC) $(INC) @CFLAGS@ $(srcdir)/gcrypt.c -o $@
2021

21-
gcrypt-gnu: $(srcdir)/gcrypt.c Makefile
22+
gcrypt-gnu: $(srcdir)/gcrypt.c Makefile $(GEN_HEADERS)
2223
$(CC) $(INC) @CFLAGS@ -DHAVE_LIBGCRYPT $(srcdir)/gcrypt.c -o $@ -lgcrypt
2324

24-
substringsearch: $(srcdir)/substringsearch.c Makefile
25+
substringsearch: $(srcdir)/substringsearch.c Makefile $(GEN_HEADERS)
2526
$(CC) $(INC) @CFLAGS@ $(srcdir)/substringsearch.c -o substringsearch $(LIB)
2627

27-
strnstr: $(srcdir)/strnstr.cpp Makefile
28+
strnstr: $(srcdir)/strnstr.cpp Makefile $(GEN_HEADERS)
2829
$(CXX) $(INC) @CFLAGS@ $(srcdir)/strnstr.cpp -o strnstr
2930

30-
geo: $(srcdir)/geo.c Makefile
31+
geo: $(srcdir)/geo.c Makefile $(GEN_HEADERS)
3132
$(CC) $(INC) @CFLAGS@ $(srcdir)/geo.c -o geo $(LIB)
3233

3334
substring_test: substringsearch top-1m.csv
@@ -41,7 +42,7 @@ geo_test: geo
4142

4243
#
4344

44-
patriciasearch: $(srcdir)/patriciasearch.c Makefile
45+
patriciasearch: $(srcdir)/patriciasearch.c Makefile $(GEN_HEADERS)
4546
$(CC) $(INC) @CFLAGS@ $(srcdir)/patriciasearch.c -o patriciasearch $(LIB)
4647

4748
patricia_test: patriciasearch blacklist-ip.txt

tests/unit/Makefile.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ LIBNDPI=$(top_builddir)/src/lib/libndpi.a
1919
LIBS=$(LIBNDPI) @PCAP_LIB@ @ADDITIONAL_LIBS@ @JSONC_LIBS@ @LIBS@
2020
LDFLAGS+=@NDPI_LDFLAGS@
2121
HEADERS=$(SRCHOME)/include/ndpi_api.h $(SRCHOME)/include/ndpi_typedefs.h $(SRCHOME)/include/ndpi_protocol_ids.h
22+
HEADERS+=$(top_builddir)/src/include/ndpi_config.h $(top_builddir)/src/include/ndpi_define.h
2223
OBJS=unit
2324
PREFIX?=@prefix@
2425

0 commit comments

Comments
 (0)