You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by jd...@apache.org on 2021/06/28 15:03:48 UTC
[qpid-dispatch] branch main updated: DISPATCH-2178: Do not build
separate libqpid-dispatch.so (#1267)
This is an automated email from the ASF dual-hosted git repository.
jdanek pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/main by this push:
new 2bff679 DISPATCH-2178: Do not build separate libqpid-dispatch.so (#1267)
2bff679 is described below
commit 2bff67975707ed2bab36bb31c38aa542290a035b
Author: Jiri Daněk <jd...@redhat.com>
AuthorDate: Mon Jun 28 17:03:42 2021 +0200
DISPATCH-2178: Do not build separate libqpid-dispatch.so (#1267)
---
CMakeLists.txt | 5 ++---
dockerfiles/Dockerfile-centos7 | 2 +-
router/CMakeLists.txt | 6 ++----
run.py.in | 1 -
src/CMakeLists.txt | 22 ++++++----------------
src/config.h.in | 1 -
src/dispatch.c | 5 +++--
src/{config.h.in => empty.c} | 7 ++-----
src/server.c | 2 +-
src/timer.c | 3 +--
tests/CMakeLists.txt | 16 ++++++++--------
tests/c_unittests/CMakeLists.txt | 4 ++--
12 files changed, 28 insertions(+), 46 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f8b24a..49d9a43 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -275,15 +275,14 @@ install(FILES
README
DESTINATION ${QD_DOC_INSTALL_DIR})
-add_subdirectory(src) # Build src first so other subdirs can use QPID_DISPATCH_LIB
-
-# run.py environment runner script - needs QPID_DISPATCH_LIB
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run.py.in ${CMAKE_CURRENT_BINARY_DIR}/run.py)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run.py.in ${CMAKE_CURRENT_BINARY_DIR}/tests/run.py)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tests/system_tests_http.py.in ${CMAKE_CURRENT_SOURCE_DIR}/tests/system_tests_http.py)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/python/qpid_dispatch_internal/management/agent.py.in ${CMAKE_CURRENT_SOURCE_DIR}/python/qpid_dispatch_internal/management/agent.py)
execute_process(COMMAND ${RUN} --sh OUTPUT_FILE config.sh)
+add_subdirectory(src) # Build src first so other subdirs can use qpid-dispatch library
+
if (NOT UNITTEST_MISSING)
file(GLOB SCRAPER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/tools/scraper/*.py)
file(COPY ${SCRAPER_SRC} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/tests/scraper/)
diff --git a/dockerfiles/Dockerfile-centos7 b/dockerfiles/Dockerfile-centos7
index 9610d05..3ddc800 100644
--- a/dockerfiles/Dockerfile-centos7
+++ b/dockerfiles/Dockerfile-centos7
@@ -44,7 +44,7 @@ MAINTAINER "dev@qpid.apache.org"
RUN yum -y install epel-release
# now install the rest of the packages
-RUN yum -y install gcc gcc-c++ cmake libuuid-devel openssl-devel cyrus-sasl-devel cyrus-sasl-plain cyrus-sasl-gssapi cyrus-sasl-md5 swig python-devel git make doxygen valgrind emacs libwebsockets-devel && yum clean all -y
+RUN yum -y install gcc gcc-c++ cmake libuuid-devel openssl-devel cyrus-sasl-devel cyrus-sasl-plain cyrus-sasl-gssapi cyrus-sasl-md5 swig python3-devel git make doxygen valgrind emacs libwebsockets-devel && yum clean all -y
# Create a main directory and clone the qpid-proton repo from github
RUN mkdir /main && cd /main && git clone https://github.com/apache/qpid-proton.git && cd /main/qpid-proton && mkdir /main/qpid-proton/build
diff --git a/router/CMakeLists.txt b/router/CMakeLists.txt
index 659627a..45a6de6 100644
--- a/router/CMakeLists.txt
+++ b/router/CMakeLists.txt
@@ -32,9 +32,7 @@ set(router_SOURCES
src/main.c
)
-SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${QPID_DISPATCH_HOME}")
-
-add_executable(qdrouterd ${router_SOURCES})
-target_link_libraries(qdrouterd qpid-dispatch)
+add_executable(qdrouterd ${router_SOURCES} $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(qdrouterd qpid-dispatch-libraries)
install(TARGETS qdrouterd RUNTIME DESTINATION sbin)
diff --git a/run.py.in b/run.py.in
index 9b2f744..fe54355 100755
--- a/run.py.in
+++ b/run.py.in
@@ -86,7 +86,6 @@ env_vars = {
'SOURCE_DIR': "${CMAKE_SOURCE_DIR}",
'BUILD_DIR': "${CMAKE_BINARY_DIR}",
'QPID_DISPATCH_HOME': "${CMAKE_SOURCE_DIR}",
- 'QPID_DISPATCH_LIB': "${CMAKE_BINARY_DIR}/src/${QPID_DISPATCH_LIB}",
'QPID_DISPATCH_RUNNER': qdrouterd_runner,
'MALLOC_CHECK_': "3", # 3 = print error and abort
'MALLOC_PERTURB_': "153", # 153 = 0x99 freed memory pattern
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 724a877..2ebb4f8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -164,24 +164,14 @@ endif (CMAKE_C_COMPILER_ID STREQUAL "GNU")
if ((DEFINED ASAN_LIBRARY) OR (DEFINED UBSAN_LIBRARY) OR (DEFINED TSAN_LIBRARY))
set(USING_SANITIZERS TRUE)
endif()
-if (APPLE)
- # DISPATCH-1384 - for macOS use flat_namespace instead of 2 level
- # namespace (acts more like linux)
- set(QPID_DISPATCH_LIB_LINK_FLAGS "-Wl,-flat_namespace ${QPID_DISPATCH_LIB_LINK_FLAGS}")
-elseif(CMAKE_C_COMPILER_ID MATCHES "Clang" AND USING_SANITIZERS)
- # https://github.com/google/sanitizers/issues/380 - can't enable error on
- # undefined symbols when linking sanitizers with Clang
-else()
- set(QPID_DISPATCH_LIB_LINK_FLAGS "-Wl,-z,defs ${QPID_DISPATCH_LIB_LINK_FLAGS}")
-endif()
-add_library(qpid-dispatch SHARED ${qpid_dispatch_SOURCES})
+add_library(qpid-dispatch OBJECT ${qpid_dispatch_SOURCES})
target_include_directories(qpid-dispatch PRIVATE ${qpid_dispatch_INCLUDES})
-target_link_libraries(qpid-dispatch ${qpid_dispatch_LIBRARIES})
-set_target_properties(qpid-dispatch PROPERTIES
- LINK_FLAGS "${QPID_DISPATCH_LIB_LINK_FLAGS}")
-install(TARGETS qpid-dispatch
- LIBRARY DESTINATION ${QPID_DISPATCH_HOME})
+
+# Workaround. CMake < 3.12 does not allow using object libraries in target_link_libraries;
+# `ar` on macOS refuses to produce a static library consisting of /dev/null as the only source file.
+add_library(qpid-dispatch-libraries STATIC empty.c)
+target_link_libraries(qpid-dispatch-libraries ${qpid_dispatch_LIBRARIES})
# check for various function availability
check_symbol_exists(getrlimit sys/resource.h QD_HAVE_GETRLIMIT)
diff --git a/src/config.h.in b/src/config.h.in
index 21ea9e1..f558215 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -18,7 +18,6 @@
*/
#define QPID_DISPATCH_VERSION "${QPID_DISPATCH_VERSION}"
-#define QPID_DISPATCH_LIB "$<$<BOOL:${APPLE}>:@rpath/>$<TARGET_FILE_NAME:qpid-dispatch>"
#define QPID_CONSOLE_STAND_ALONE_INSTALL_DIR "${CONSOLE_STAND_ALONE_INSTALL_DIR}"
#cmakedefine01 QD_MEMORY_STATS
#cmakedefine01 QD_HAVE_GETRLIMIT
diff --git a/src/dispatch.c b/src/dispatch.c
index ddb3eb5..00b1718 100644
--- a/src/dispatch.c
+++ b/src/dispatch.c
@@ -122,9 +122,10 @@ STATIC_ASSERT(sizeof(long) >= sizeof(void*), pointer_is_bigger_than_long);
qd_error_t qd_dispatch_load_config(qd_dispatch_t *qd, const char *config_path)
{
- qd->dl_handle = dlopen(QPID_DISPATCH_LIB, RTLD_LAZY | RTLD_NOLOAD);
+ // `dlopen(NULL, ...)` opens the current executable; qdrouterd used to dlopen libqpid-dispatch.so here before
+ qd->dl_handle = dlopen(NULL, RTLD_LAZY | RTLD_NOLOAD);
if (!qd->dl_handle)
- return qd_error(QD_ERROR_RUNTIME, "Cannot locate library %s", QPID_DISPATCH_LIB);
+ return qd_error(QD_ERROR_RUNTIME, "Failed to dlopen the current executable");
qd_python_lock_state_t lock_state = qd_python_lock();
PyObject *module = PyImport_ImportModule("qpid_dispatch_internal.management.config");
diff --git a/src/config.h.in b/src/empty.c
similarity index 73%
copy from src/config.h.in
copy to src/empty.c
index 21ea9e1..67ab2bf 100644
--- a/src/config.h.in
+++ b/src/empty.c
@@ -17,8 +17,5 @@
* under the License.
*/
-#define QPID_DISPATCH_VERSION "${QPID_DISPATCH_VERSION}"
-#define QPID_DISPATCH_LIB "$<$<BOOL:${APPLE}>:@rpath/>$<TARGET_FILE_NAME:qpid-dispatch>"
-#define QPID_CONSOLE_STAND_ALONE_INSTALL_DIR "${CONSOLE_STAND_ALONE_INSTALL_DIR}"
-#cmakedefine01 QD_MEMORY_STATS
-#cmakedefine01 QD_HAVE_GETRLIMIT
+/// Workaround. Some C compilers raise warning when asked to compile an empty file.
+typedef int qd_make_this_translation_unit_not_be_empty;
diff --git a/src/server.c b/src/server.c
index b758d72..4910f37 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1738,7 +1738,7 @@ void qd_connector_decref(qd_connector_t* connector)
}
}
-__attribute__((noinline)) // permit replacement by dummy implementation in unit_tests
+__attribute__((weak)) // permit replacement by dummy implementation in unit_tests
void qd_server_timeout(qd_server_t *server, qd_duration_t duration) {
pn_proactor_set_timeout(server->proactor, duration);
}
diff --git a/src/timer.c b/src/timer.c
index 71698d1..c87e0f2 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -202,7 +202,7 @@ void qd_timer_free(qd_timer_t *timer)
}
-__attribute__((noinline)) // permit replacement by dummy implementation in unit_tests
+__attribute__((weak)) // permit replacement by dummy implementation in unit_tests
qd_timestamp_t qd_timer_now()
{
struct timespec tv;
@@ -210,7 +210,6 @@ qd_timestamp_t qd_timer_now()
return ((qd_timestamp_t)tv.tv_sec) * 1000 + tv.tv_nsec / 1000000;
}
-
void qd_timer_schedule(qd_timer_t *timer, qd_duration_t duration)
{
sys_mutex_lock(lock);
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 5aec28d..ef6193d 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -40,8 +40,8 @@ set(unit_test_SOURCES
thread_test.c
)
-add_executable(unit_tests ${unit_test_SOURCES})
-target_link_libraries(unit_tests qpid-dispatch)
+add_executable(unit_tests ${unit_test_SOURCES} $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(unit_tests qpid-dispatch-libraries)
set(unit_test_size_SOURCES
field_test.c
@@ -51,11 +51,11 @@ set(unit_test_size_SOURCES
run_unit_tests_size.c
)
-add_executable(unit_tests_size ${unit_test_size_SOURCES})
-target_link_libraries(unit_tests_size qpid-dispatch)
+add_executable(unit_tests_size ${unit_test_size_SOURCES} $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(unit_tests_size qpid-dispatch-libraries)
-add_executable(test-sender test-sender.c)
-target_link_libraries(test-sender ${Proton_LIBRARIES} qpid-dispatch)
+add_executable(test-sender test-sender.c $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(test-sender ${Proton_LIBRARIES} qpid-dispatch-libraries)
add_executable(test-receiver test-receiver.c)
target_link_libraries(test-receiver ${Proton_LIBRARIES})
@@ -63,8 +63,8 @@ target_link_libraries(test-receiver ${Proton_LIBRARIES})
add_executable(clogger clogger.c)
target_link_libraries(clogger ${Proton_LIBRARIES})
-add_executable(threaded_timer_test threaded_timer_test.c)
-target_link_libraries(threaded_timer_test qpid-dispatch)
+add_executable(threaded_timer_test threaded_timer_test.c $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(threaded_timer_test qpid-dispatch-libraries)
# Bubblewrap is an unprivileged sandboxing tool for Linux. Setting --unshare-net allows
# running tests in parallel (the ctest -j option) without port clashes
diff --git a/tests/c_unittests/CMakeLists.txt b/tests/c_unittests/CMakeLists.txt
index deb74c5..c12a923 100644
--- a/tests/c_unittests/CMakeLists.txt
+++ b/tests/c_unittests/CMakeLists.txt
@@ -22,8 +22,8 @@ file(GLOB unittest_SOURCES
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_STANDARD_FLAGS} ${SANITIZE_FLAGS}")
-add_executable(c_unittests ${unittest_SOURCES})
-target_link_libraries(c_unittests pthread qpid-dispatch)
+add_executable(c_unittests ${unittest_SOURCES} $<TARGET_OBJECTS:qpid-dispatch>)
+target_link_libraries(c_unittests pthread qpid-dispatch-libraries)
add_test(
NAME c_unittests
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org