diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 8be8e1f17..72a655bb5 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -20,6 +20,8 @@
# along with this program. If not, see .
###################################################################################
+add_compile_options(-fPIC)
+
set(INCLUDE_DIRS
${JANSSON_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIR}
@@ -67,7 +69,7 @@ set(LIB_SRC
)
add_subdirectory(nodes)
-list(APPEND LIBRARIES villas-nodes)
+list(APPEND WHOLE_ARCHIVES nodes)
if(LIBCONFIG_FOUND)
list(APPEND INCLUDE_DIRS ${LIBCONFIG_INCLUDE_DIRS})
@@ -81,7 +83,7 @@ if(WITH_IO)
)
add_subdirectory(formats)
- list(APPEND LIBRARIES villas-formats)
+ list(APPEND WHOLE_ARCHIVES formats)
endif()
if(WITH_HOOKS)
@@ -91,7 +93,7 @@ if(WITH_HOOKS)
)
add_subdirectory(hooks)
- list(APPEND LIBRARIES villas-hooks)
+ list(APPEND WHOLE_ARCHIVES hooks)
endif()
if(WITH_WEB)
@@ -109,7 +111,7 @@ if(WITH_API AND WITH_WEB)
)
add_subdirectory(api)
- list(APPEND LIBRARIES villas-api)
+ list(APPEND WHOLE_ARCHIVES api)
endif()
# libnl3 is optional but required for network emulation and IRQ pinning
@@ -130,10 +132,17 @@ add_library(villas SHARED ${LIB_SRC})
target_include_directories(villas PUBLIC ${INCLUDE_DIRS})
target_link_libraries(villas PUBLIC ${LIBRARIES})
-#set_target_properties(villas PROPERTIES
-# VERSION ${PROJECT_VERSION}
-# SOVERSION ${PROJECT_SOVERSION}
-#)
+if(APPLE)
+ target_link_libraries(villas PRIVATE -Wl,-all_load ${WHOLE_ARCHIVES} -Wl,-noall_load)
+else()
+ target_link_libraries(villas PRIVATE -Wl,--whole-archive ${WHOLE_ARCHIVES} -Wl,--no-whole-archive)
+endif()
+
+
+set_target_properties(villas PROPERTIES
+ VERSION ${PROJECT_VERSION}
+ SOVERSION ${PROJECT_SOVERSION}
+)
install(
TARGETS villas
diff --git a/lib/api/CMakeLists.txt b/lib/api/CMakeLists.txt
index c7f3cbf30..453cd2dca 100644
--- a/lib/api/CMakeLists.txt
+++ b/lib/api/CMakeLists.txt
@@ -40,17 +40,6 @@ set(API_SRC
actions/status.c
)
-add_library(villas-api SHARED ${API_SRC})
-target_include_directories(villas-api PUBLIC ${INCLUDE_DIRS})
-target_link_libraries(villas-api PUBLIC ${LIBRARIES})
-
-#set_target_properties(villas-api PROPERTIES
-# VERSION ${PROJECT_VERSION}
-# SOVERSION ${PROJECT_SOVERSION}
-#)
-
-install(
- TARGETS villas-api
- COMPONENT lib
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-)
+add_library(api STATIC ${API_SRC})
+target_include_directories(api PUBLIC ${INCLUDE_DIRS})
+target_link_libraries(api INTERFACE ${LIBRARIES})
diff --git a/lib/hooks/CMakeLists.txt b/lib/hooks/CMakeLists.txt
index e0f1a37da..137381e61 100644
--- a/lib/hooks/CMakeLists.txt
+++ b/lib/hooks/CMakeLists.txt
@@ -50,17 +50,6 @@ if(WITH_IO)
)
endif()
-add_library(villas-hooks SHARED ${HOOK_SRC})
-target_include_directories(villas-hooks PUBLIC ${INCLUDE_DIRS})
-target_link_libraries(villas-hooks PUBLIC ${LIBRARIES})
-
-#set_target_properties(villas-hooks PROPERTIES
-# VERSION ${PROJECT_VERSION}
-# SOVERSION ${PROJECT_SOVERSION}
-#)
-
-install(
- TARGETS villas-hooks
- COMPONENT lib
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-)
+add_library(hooks STATIC ${HOOK_SRC})
+target_include_directories(hooks PUBLIC ${INCLUDE_DIRS})
+target_link_libraries(hooks INTERFACE ${LIBRARIES})
diff --git a/lib/log.c b/lib/log.c
index c2c328df6..8bb6e058f 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -27,6 +27,7 @@
#include
#include
#include
+#include
#include
#include
diff --git a/lib/nodes/CMakeLists.txt b/lib/nodes/CMakeLists.txt
index 6f39e1f03..d4e07cb71 100644
--- a/lib/nodes/CMakeLists.txt
+++ b/lib/nodes/CMakeLists.txt
@@ -57,7 +57,10 @@ endif()
# Enable shared memory node-type
if(HAS_SEMAPHORE AND HAS_MMAN)
list(APPEND NODE_SRC shmem.c)
- list(APPEND LIBRARIES "rt")
+
+ if(CMAKE_SUSTEM_NAME STREQUAL Linux)
+ list(APPEND LIBRARIES rt)
+ endif()
endif()
# Enable IEC61850 node-types when libiec61850 is available
@@ -123,17 +126,6 @@ if(COMEDILIB_FOUND)
list(APPEND LIBRARIES PkgConfig::COMEDILIB)
endif()
-add_library(villas-nodes SHARED ${NODE_SRC})
-target_include_directories(villas-nodes PUBLIC ${INCLUDE_DIRS})
-target_link_libraries(villas-nodes PUBLIC ${LIBRARIES})
-
-#set_target_properties(villas-nodes PROPERTIES
-# VERSION ${PROJECT_VERSION}
-# SOVERSION ${PROJECT_SOVERSION}
-#)
-
-install(
- TARGETS villas-nodes
- COMPONENT lib
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-)
+add_library(nodes STATIC ${NODE_SRC})
+target_include_directories(nodes PUBLIC ${INCLUDE_DIRS})
+target_link_libraries(nodes LINK_PRIVATE ${LIBRARIES})
diff --git a/lib/nodes/Makefile.inc b/lib/nodes/Makefile.inc
deleted file mode 100644
index 180a98669..000000000
--- a/lib/nodes/Makefile.inc
+++ /dev/null
@@ -1,166 +0,0 @@
-# Makefile.
-#
-# @author Steffen Vogel
-# @copyright 2017, Institute for Automation of Complex Power Systems, EONERC
-# @license GNU General Public License (version 3)
-#
-# VILLASnode
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-###################################################################################
-
-# Enabled loopback node-type
-ifeq ($(WITH_NODE_LOOPBACK),1)
- LIB_NODES += loopback
-endif
-
-# Enabled Cbuilder node-type
-ifeq ($(WITH_NODE_CBUILDER),1)
- LIB_NODES += cbuilder
-endif
-
-# Enable InfluxDB node-type
-ifeq ($(WITH_NODE_INFLUXDB),1)
- LIB_NODES += influxdb
-endif
-
-# Enable stats node-type
-ifeq ($(WITH_NODE_STATS),1)
- LIB_NODES += stats
-endif
-
-# Enable file node-type
-ifeq ($(WITH_NODE_FILE),1)
- LIB_NODES += file
- WITH_IO = 1
-endif
-
-# Enable shared memory node-type
-ifeq ($(WITH_NODE_SHMEM),1)
- LIB_NODES += shmem
-endif
-
-# Enable signal generator node-type
-ifeq ($(WITH_NODE_SIGNAL),1)
- LIB_NODES += signal_generator
-endif
-
-# Enable RTT test node-tyoe
-ifeq ($(WITH_NODE_TEST_RTT),1)
- LIB_NODES += test_rtt
- WITH_IO = 1
-endif
-
-# Enable IEC61850 node-types when libiec61850 is available
-ifeq ($(WITH_NODE_IEC61850),1)
-ifeq ($(shell $(PKGCONFIG) --atleast-version=1.2.0 libiec61850; echo $$?),0)
- LIB_SRCS += lib/nodes/iec61850_sv.c
- LIB_NODES += iec61850
- LIB_PKGS += libiec61850
-endif
-endif
-
-# Enable OPAL-RT Asynchronous Process support (will result in 32bit binary!!!)
-ifeq ($(WITH_NODE_OPAL),1)
-ifneq ($(wildcard $(SRCDIR)/thirdparty/libopal/include/opal/AsyncApi.h),)
- LIB_CFLAGS += -I $(SRCDIR)/thirdparty/libopal/include/opal/
- LIB_LDFLAGS += -L/lib/i386-linux-gnu/ -L/usr/lib/i386-linux-gnu/ -L$(SRCDIR)/thirdparty/libopal/
- LIB_LDLIBS += -lOpalAsyncApiCore -lOpalCore -lOpalUtils -lirc
- LIB_NODES += opal
-
- # libOpalAsyncApi is a 32bit library. So we need to build everything in 32bit
- CFLAGS += -m32
- LDFLAGS += -m32
-endif
-endif
-
-# Enable Socket node type when libnl3 is available
-ifeq ($(WITH_NODE_SOCKET),1)
- LIB_NODES += socket
- WITH_IO = 1
-
- # libnl3 is optional but required for network emulation and IRQ pinning
- ifeq ($(shell $(PKGCONFIG) libnl-route-3.0; echo $$?),0)
- LIB_SRCS += $(addprefix lib/kernel/, nl.c tc.c tc_netem.c if.c)
- LIB_PKGS += libnl-route-3.0
- endif
-endif
-
-# Enable nanomsg node type when libnanomsg is available
-ifeq ($(WITH_NODE_NANOMSG),1)
-ifeq ($(shell $(PKGCONFIG) nanomsg; echo $$?),0)
- LIB_PKGS += nanomsg
- LIB_NODES += nanomsg
- WITH_IO = 1
-else ifeq ($(shell $(PKGCONFIG) libnanomsg; echo $$?),0)
- LIB_PKGS += libnanomsg
- LIB_NODES += nanomsg
- WITH_IO = 1
-endif
-endif
-
-# Enable ZeroMQ node type when libzmq is available
-ifeq ($(WITH_NODE_ZEROMQ),1)
-ifeq ($(shell $(PKGCONFIG) libzmq; echo $$?),0)
- LIB_PKGS += libzmq
- LIB_NODES += zeromq
- WITH_IO = 1
-endif
-endif
-
-# Enable NGSI support
-ifeq ($(WITH_NODE_NGSI),1)
-ifeq ($(shell $(PKGCONFIG) libcurl; echo $$?),0)
- LIB_PKGS += libcurl
- LIB_NODES += ngsi
-endif
-endif
-
-# Enable WebSocket support
-ifeq ($(WITH_NODE_WEBSOCKET),1)
-ifeq ($(shell $(PKGCONFIG) libwebsockets; echo $$?),0)
- LIB_PKGS += libwebsockets
- LIB_NODES += websocket
- WITH_IO = 1
- WITH_WEB = 1
-endif
-endif
-
-# Enable AMQP support
-ifeq ($(WITH_NODE_AMQP),1)
-ifeq ($(shell $(PKGCONFIG) librabbitmq; echo $$?),0)
- LIB_PKGS += librabbitmq
- LIB_NODES += amqp
- WITH_IO = 1
-endif
-endif
-
-# Enable MQTT support
-ifeq ($(WITH_NODE_MQTT),1)
-ifneq ($(wildcard /usr/include/mosquitto.h),)
- LIB_SRCS += lib/nodes/mqtt.c
- LIB_NODES += mqtt
- LIB_LDLIBS += -lmosquitto
- WITH_IO = 1
-endif
-endif
-
-# Enable Comedi support
-ifeq ($(WITH_NODE_COMEDI),1)
-ifeq ($(shell $(PKGCONFIG) comedilib; echo $$?),0)
- LIB_PKGS += comedilib
- LIB_SRCS += lib/nodes/comedi.c
- LIB_NODES += comedi
-endif
-endif
diff --git a/lib/nodes/socket.c b/lib/nodes/socket.c
index c4c4b4f02..61c7fa2a1 100644
--- a/lib/nodes/socket.c
+++ b/lib/nodes/socket.c
@@ -22,6 +22,7 @@
#include
#include
+#include
#include
#include
#include