Allow dynamic linking of framework to application
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 23 Jan 2012 09:05:06 +0000 (10:05 +0100)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Mon, 23 Jan 2012 09:05:06 +0000 (10:05 +0100)
29 files changed:
CMake.config
CMake.flags
src/CMake.build [deleted file]
src/CMake.link_dynamic [new file with mode: 0644]
src/CMake.link_static [moved from src/CMake.link with 89% similarity]
src/CMakeLists.txt
src/config/cfg_schema.h
src/core/CMakeLists.txt [new file with mode: 0644]
src/core/olsr_cfg.h
src/core/olsr_clock.h
src/core/olsr_http.h
src/core/olsr_interface.h
src/core/olsr_logging.h
src/core/olsr_logging_cfg.h
src/core/olsr_memcookie.h
src/core/olsr_packet_socket.h
src/core/olsr_plugins.c
src/core/olsr_plugins.h
src/core/olsr_socket.h
src/core/olsr_stream_socket.h
src/core/olsr_telnet.h
src/core/olsr_timer.h
src/core/os_bsd/os_net_bsd.h [moved from src/os_bsd/os_net_bsd.h with 100% similarity]
src/core/os_bsd/os_system_bsd.h [moved from src/os_bsd/os_system_bsd.h with 100% similarity]
src/core/os_linux/os_net_linux.c [moved from src/os_linux/os_net_linux.c with 100% similarity]
src/core/os_linux/os_net_linux.h [moved from src/os_linux/os_net_linux.h with 100% similarity]
src/core/os_linux/os_system_linux.c [moved from src/os_linux/os_system_linux.c with 100% similarity]
src/core/os_linux/os_system_linux.h [moved from src/os_linux/os_system_linux.h with 100% similarity]
src/olsr_main.c

index 0e3d1bf..1ae9321 100644 (file)
@@ -24,6 +24,9 @@ set (OONF_VERSION 0.7.0)
 # set static plugins (space separated list of plugin names)
 set (OONF_STATIC_PLUGINS cfgparser_compact cfgio_file remotecontrol httptelnet)
 
+# choose if framework should be linked static or dynamic
+set (OONF_FRAMEWORD_DYNAMIC false)
+
 # set to true to stop application running without root priviledges (true/false/apply)
 # 'apply' means root is not needed before the configuration is applied, which allows to
 # use the --schema command without root. 
index 920b001..fbae5b9 100644 (file)
@@ -59,6 +59,7 @@ ENDIF()
 IF (WIN32)
     ADD_DEFINITIONS(-D_WIN32_WINNT=0x0502)
     SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-auto-import")
+    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--export-all-symbols")
 ENDIF(WIN32)
 
 # set compiler flags that are supported
diff --git a/src/CMake.build b/src/CMake.build
deleted file mode 100644 (file)
index 2c8153c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# gather sources and static libraries
-add_subdirectory(common)
-add_subdirectory(config)
-add_subdirectory(builddata)
-
-# add source files of core directory
-FILE(GLOB SRCS "core/*.c")    
-set(OONF_SRCS ${OONF_SRCS} ${SRCS})
-
-# add os_specific source files
-IF(WIN32)
-    FILE(GLOB SRCS "os_win32/*.c")    
-    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
-ENDIF(WIN32)
-
-IF(LINUX)
-    FILE(GLOB SRCS "os_linux/*.c")    
-    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
-ENDIF(LINUX)
-
-IF(BSD)
-    FILE(GLOB SRCS "os_bsd/*.c")    
-    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
-ENDIF(BSD)
-
-IF(ANDROID)
-    include_directories(src/android)
-    FILE(GLOB SRCS "android/*.c")    
-    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
-ENDIF(ANDROID)
-
-# activate symbol export for win32
-IF(WIN32)
-    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--export-all-symbols")
-ENDIF(WIN32)
diff --git a/src/CMake.link_dynamic b/src/CMake.link_dynamic
new file mode 100644 (file)
index 0000000..987095c
--- /dev/null
@@ -0,0 +1,30 @@
+# the order of static libraries is important
+# earlier libraries can use the functions of later, not the
+# other way around
+
+# link plugin loader
+TARGET_LINK_LIBRARIES(${OONF_EXE} static_pluginloader)
+
+# link static plugins
+FOREACH(plugin ${OONF_STATIC_PLUGINS})
+    TARGET_LINK_LIBRARIES(${OONF_EXE} static_${plugin})
+ENDFOREACH(plugin)
+
+# link core
+TARGET_LINK_LIBRARIES(${OONF_EXE} ${OONF_LIBPREFIX}_core)
+
+# link config and common API
+TARGET_LINK_LIBRARIES(${OONF_EXE} ${OONF_LIBPREFIX}_config)
+TARGET_LINK_LIBRARIES(${OONF_EXE} ${OONF_LIBPREFIX}_common)
+
+# link builddata
+TARGET_LINK_LIBRARIES(${OONF_EXE} static_builddata)
+
+# link dlopen() library
+TARGET_LINK_LIBRARIES(${OONF_EXE} ${CMAKE_DL_LIBS})
+
+# link extra win32 libs
+IF(WIN32)
+    SET_TARGET_PROPERTIES(${OONF_EXE} PROPERTIES ENABLE_EXPORTS true)
+    TARGET_LINK_LIBRARIES(${OONF_EXE} ws2_32 iphlpapi)
+ENDIF(WIN32)
similarity index 89%
rename from src/CMake.link
rename to src/CMake.link_static
index b1cc0a9..2eaf9fa 100644 (file)
@@ -10,6 +10,10 @@ FOREACH(plugin ${OONF_STATIC_PLUGINS})
     TARGET_LINK_LIBRARIES(${OONF_EXE} static_${plugin})
 ENDFOREACH(plugin)
 
+# link core
+TARGET_LINK_LIBRARIES(${OONF_EXE} static_core)
+
+# link config and common API
 TARGET_LINK_LIBRARIES(${OONF_EXE} static_config)
 TARGET_LINK_LIBRARIES(${OONF_EXE} static_common)
 
index c7be987..27271be 100644 (file)
@@ -1,5 +1,8 @@
 # build framework
-include(CMake.build)
+add_subdirectory(common)
+add_subdirectory(config)
+add_subdirectory(builddata)
+add_subdirectory(core)
 
 # add main program
 set(OONF_SRCS ${OONF_SRCS} olsr_main.c olsr_setup.c)
@@ -7,5 +10,9 @@ set(OONF_SRCS ${OONF_SRCS} olsr_main.c olsr_setup.c)
 # create executable
 ADD_EXECUTABLE(${OONF_EXE} ${OONF_SRCS})
 
-# link framework libraries
-include(CMake.link)
+# link framework libraries (choose one)
+IF (OONF_FRAMEWORD_DYNAMIC)
+    include(CMake.link_dynamic)
+ELSE (OONF_FRAMEWORD_DYNAMIC)
+    include(CMake.link_static)
+endif(OONF_FRAMEWORD_DYNAMIC)
index c68bd2f..66ab6d8 100644 (file)
@@ -217,8 +217,8 @@ struct cfg_schema_entry {
   size_t t_offset;
 };
 
-EXPORT const char *CFGLIST_BOOL_TRUE[4];
-EXPORT const char *CFGLIST_BOOL[8];
+EXPORT extern const char *CFGLIST_BOOL_TRUE[4];
+EXPORT extern const char *CFGLIST_BOOL[8];
 
 #define CFG_FOR_ALL_SCHEMA_SECTIONS(tmpl, section, iterator) avl_for_each_element_safe(&(tmpl->sections), section, _node, iterator)
 #define CFG_FOR_ALL_SCHEMA_ENTRIES(section, entry, iterator) avl_for_each_element_safe(&section->_entries, entry, _node, iterator)
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6b8ea96
--- /dev/null
@@ -0,0 +1,48 @@
+SET(OONF_CORE_SRCS olsr_cfg.c
+                   olsr_clock.c
+                   olsr_http.c
+                   olsr_interface.c
+                   olsr_logging_cfg.c
+                   olsr_logging.c
+                   olsr_memcookie.c
+                   olsr_netaddr_acl.c
+                   olsr_packet_socket.c
+                   olsr_plugins.c
+                   olsr_socket.c
+                   olsr_stream_socket.c
+                   olsr_telnet.c
+                   olsr_timer.c
+                   olsr.c
+                   os_net_generic.c
+                   os_system_generic.c)
+                   
+# add os_specific source files
+IF(WIN32)
+    FILE(GLOB SRCS "os_win32/*.c")    
+    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
+ENDIF(WIN32)
+
+IF(LINUX)
+    SET(OONF_CORE_SRCS ${OONF_CORE_SRCS}
+                       os_linux/os_net_linux.c
+                       os_linux/os_system_linux.c)
+ENDIF(LINUX)
+
+IF(BSD)
+    FILE(GLOB SRCS "os_bsd/*.c")    
+    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
+ENDIF(BSD)
+
+IF(ANDROID)
+    include_directories(src/android)
+    FILE(GLOB SRCS "android/*.c")    
+    set(OONF_SRCS ${OONF_SRCS} ${SRCS})
+ENDIF(ANDROID)
+
+ADD_LIBRARY(static_core STATIC ${OONF_CORE_SRCS})
+ADD_LIBRARY(${OONF_LIBPREFIX}_core SHARED ${OONF_CORE_SRCS})
+
+IF(WIN32)
+    TARGET_LINK_LIBRARIES(static_core ws2_32 iphlpapi)
+    TARGET_LINK_LIBRARIES(${OONF_LIBPREFIX}_core ws2_32 iphlpapi)
+ENDIF(WIN32)
index 473b24a..c4d1e36 100644 (file)
@@ -63,11 +63,11 @@ struct olsr_config_global {
 
 EXPORT extern struct olsr_config_global config_global;
 
-int olsr_cfg_init(void) __attribute__((warn_unused_result));
-void olsr_cfg_cleanup(void);
-int olsr_cfg_loadplugins(void) __attribute__((warn_unused_result));
-int olsr_cfg_apply(void) __attribute__((warn_unused_result));
-int olsr_cfg_rollback(void);
+EXPORT int olsr_cfg_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_cfg_cleanup(void);
+EXPORT int olsr_cfg_loadplugins(void) __attribute__((warn_unused_result));
+EXPORT int olsr_cfg_apply(void) __attribute__((warn_unused_result));
+EXPORT int olsr_cfg_rollback(void);
 
 EXPORT void olsr_cfg_trigger_reload(void);
 EXPORT bool olsr_cfg_is_reload_set(void);
@@ -75,8 +75,8 @@ EXPORT void olsr_cfg_trigger_commit(void);
 EXPORT bool olsr_cfg_is_commit_set(void);
 
 /* do not export this to plugins */
-int olsr_cfg_update_globalcfg(bool) __attribute__((warn_unused_result));
-int olsr_cfg_clear_rawdb(void) __attribute__((warn_unused_result));
+EXPORT int olsr_cfg_update_globalcfg(bool) __attribute__((warn_unused_result));
+EXPORT int olsr_cfg_clear_rawdb(void) __attribute__((warn_unused_result));
 
 EXPORT struct cfg_instance *olsr_cfg_get_instance(void);
 EXPORT struct cfg_db *olsr_cfg_get_db(void);
index 1f24da2..b3723f3 100644 (file)
@@ -59,9 +59,9 @@ struct timeval_buf {
   char buf[sizeof("00:00:00.000000")];
 };
 
-int olsr_clock_init(void) __attribute__((warn_unused_result));
-void olsr_clock_cleanup(void);
-int olsr_clock_update(void) __attribute__((warn_unused_result));
+EXPORT int olsr_clock_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_clock_cleanup(void);
+EXPORT int olsr_clock_update(void) __attribute__((warn_unused_result));
 
 EXPORT int32_t olsr_clock_getRelative(uint32_t absolute);
 EXPORT bool olsr_clock_isPast(uint32_t s);
index afa835a..89e0d3d 100644 (file)
@@ -75,8 +75,8 @@ struct olsr_http_handler {
       struct autobuf *out, struct olsr_http_session *);
 };
 
-void olsr_http_init(void);
-void olsr_http_cleanup(void);
+EXPORT void olsr_http_init(void);
+EXPORT void olsr_http_cleanup(void);
 
 EXPORT void olsr_http_add(struct olsr_http_handler *);
 EXPORT void olsr_http_remove(struct olsr_http_handler *);
index 104de03..77dd0b3 100644 (file)
@@ -119,8 +119,8 @@ struct olsr_interface_listener {
 #define OLSR_FOR_ALL_INTERFACES(interf, ptr) avl_for_each_element_safe(&olsr_interface_tree, interf, node, ptr)
 EXPORT extern struct avl_tree olsr_interface_tree;
 
-int olsr_interface_init(void) __attribute__((warn_unused_result));
-void olsr_interface_cleanup(void);
+EXPORT int olsr_interface_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_interface_cleanup(void);
 
 EXPORT struct olsr_interface *olsr_interface_add_listener(
     struct olsr_interface_listener *);
index f0f465c..b0e5206 100644 (file)
@@ -173,6 +173,7 @@ struct log_handler_entry {
 
 EXPORT extern struct log_handler_mask_entry *log_global_mask;
 EXPORT extern const char **LOG_SOURCE_NAMES;
+EXPORT extern const char *LOG_SEVERITY_NAMES[];
 
 EXPORT int olsr_log_init(const struct olsr_builddata *, enum log_severity,
     const char **lognames, size_t level_count)
index 8a37aaa..6c9148b 100644 (file)
@@ -48,9 +48,9 @@
 
 #include "olsr_logging.h"
 
-void olsr_logcfg_init(enum log_source *debug_lvl_1, size_t length);
-void olsr_logcfg_cleanup(void);
-void olsr_logcfg_addschema(struct cfg_schema *schema);
-int olsr_logcfg_apply(struct cfg_db *db) __attribute__((warn_unused_result));
+EXPORT void olsr_logcfg_init(enum log_source *debug_lvl_1, size_t length);
+EXPORT void olsr_logcfg_cleanup(void);
+EXPORT void olsr_logcfg_addschema(struct cfg_schema *schema);
+EXPORT int olsr_logcfg_apply(struct cfg_db *db) __attribute__((warn_unused_result));
 
 #endif /* OLSR_LOGGING_CFG_H_ */
index 227e340..af3c0ab 100644 (file)
@@ -141,8 +141,8 @@ struct olsr_memory_prefix {
 extern struct avl_tree EXPORT(olsr_cookie_tree);
 
 /* Externals. */
-void olsr_memcookie_init(void);
-void olsr_memcookie_cleanup(void);
+EXPORT void olsr_memcookie_init(void);
+EXPORT void olsr_memcookie_cleanup(void);
 
 EXPORT struct olsr_memcookie_info *olsr_memcookie_add(const char *, size_t size)
     __attribute__((warn_unused_result));
index 9eaf2cc..d780609 100644 (file)
@@ -62,8 +62,8 @@ struct olsr_packet_socket {
       union netaddr_socket *from, size_t length);
 };
 
-void olsr_packet_init(void);
-void olsr_packet_cleanup(void);
+EXPORT void olsr_packet_init(void);
+EXPORT void olsr_packet_cleanup(void);
 
 EXPORT int olsr_packet_add(struct olsr_packet_socket *,
     union netaddr_socket *local);
index 1d1a40d..9bea5b7 100644 (file)
@@ -155,9 +155,6 @@ olsr_plugins_init_static(void) {
 
   assert(!avl_is_empty(&plugin_tree));
 
-  /* make sure all static plugins are loaded */
-  olsr_plugins_load_static();
-
   OLSR_FOR_ALL_PLUGIN_ENTRIES(p, it) {
     if (olsr_plugins_load(p->name) == NULL) {
       OLSR_WARN(LOG_PLUGINLOADER, "Cannot load plugin '%s'", p->name);
index 75eca88..4accbf3 100644 (file)
@@ -96,11 +96,11 @@ struct olsr_plugin {
 #define OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin, iterator) avl_for_each_element_safe(&plugin_tree, plugin, p_node, iterator)
 EXPORT extern struct avl_tree plugin_tree;
 
-void olsr_plugins_init(void);
-void olsr_plugins_cleanup(void);
+EXPORT void olsr_plugins_init(void);
+EXPORT void olsr_plugins_cleanup(void);
 
 EXPORT void olsr_plugins_hook(struct olsr_plugin *plugin);
-int olsr_plugins_init_static(void) __attribute__((warn_unused_result));
+EXPORT int olsr_plugins_init_static(void) __attribute__((warn_unused_result));
 
 EXPORT struct olsr_plugin *olsr_plugins_get(const char *libname);
 
index e45f2f7..546d3cb 100644 (file)
@@ -72,9 +72,9 @@ struct olsr_socket_entry {
 EXPORT extern struct list_entity socket_head;
 #define OLSR_FOR_ALL_SOCKETS(socket, iterator) list_for_each_element_safe(&socket_head, socket, node, iterator)
 
-void olsr_socket_init(void);
-void olsr_socket_cleanup(void);
-int olsr_socket_handle(uint32_t until_time) __attribute__((warn_unused_result));
+EXPORT void olsr_socket_init(void);
+EXPORT void olsr_socket_cleanup(void);
+EXPORT int olsr_socket_handle(uint32_t until_time) __attribute__((warn_unused_result));
 
 EXPORT void olsr_socket_add(struct olsr_socket_entry *);
 EXPORT void olsr_socket_remove(struct olsr_socket_entry *);
index 5211ad0..181bd43 100644 (file)
@@ -191,8 +191,8 @@ struct olsr_stream_managed_config {
   uint16_t port;
 };
 
-int olsr_stream_init(void) __attribute__((warn_unused_result));
-void olsr_stream_cleanup(void);
+EXPORT int olsr_stream_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_stream_cleanup(void);
 
 EXPORT int olsr_stream_add(struct olsr_stream_socket *,
     union netaddr_socket *local);
index b5e39ac..9f692f2 100644 (file)
@@ -83,8 +83,8 @@ struct olsr_telnet_command {
 #define FOR_ALL_TELNET_COMMANDS(cmd, ptr) avl_for_each_element_safe(&telnet_cmd_tree, cmd, node, ptr)
 EXPORT struct avl_tree telnet_cmd_tree;
 
-int olsr_telnet_init(void) __attribute__((warn_unused_result));
-void olsr_telnet_cleanup(void);
+EXPORT int olsr_telnet_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_telnet_cleanup(void);
 
 EXPORT int olsr_telnet_add(struct olsr_telnet_command *command);
 EXPORT void olsr_telnet_remove(struct olsr_telnet_command *command);
index 14cb1c2..25ffe56 100644 (file)
@@ -117,9 +117,9 @@ struct olsr_timer_entry {
 EXPORT extern struct list_entity timerinfo_list;
 #define OLSR_FOR_ALL_TIMERS(ti, iterator) list_for_each_element_safe(&timerinfo_list, ti, node, iterator)
 
-int olsr_timer_init(void) __attribute__((warn_unused_result));
-void olsr_timer_cleanup(void);
-void olsr_timer_walk(void);
+EXPORT int olsr_timer_init(void) __attribute__((warn_unused_result));
+EXPORT void olsr_timer_cleanup(void);
+EXPORT void olsr_timer_walk(void);
 
 EXPORT struct olsr_timer_info *olsr_timer_add(
     const char *name, timer_cb_func callback, bool periodic) __attribute__((warn_unused_result));
index afe5958..779a684 100644 (file)
@@ -175,6 +175,7 @@ main(int argc, char **argv) {
   olsr_plugins_init();
 
   /* load static plugins */
+  olsr_plugins_load_static();
   if (olsr_plugins_init_static()) {
     goto olsrd_cleanup;
   }