diff --git a/CMakeLists.txt b/CMakeLists.txt index e496ea3d..9245ad55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ set(BFDEV_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set(BFDEV_HEADER_PATH ${PROJECT_SOURCE_DIR}/include) set(BFDEV_SOURCE_PATH ${PROJECT_SOURCE_DIR}/src) set(BFDEV_TEMPLATE_PATH ${PROJECT_SOURCE_DIR}/template) +set(BFDEV_MODULES_PATH ${PROJECT_SOURCE_DIR}/modules) set(BFDEV_PORT_PATH ${PROJECT_SOURCE_DIR}/port) set(BFDEV_DOCUMENT_PATH ${PROJECT_SOURCE_DIR}/docs) set(BFDEV_GENERATED_PATH ${PROJECT_BINARY_DIR}/generated) @@ -38,6 +39,7 @@ set(BFDEV_CONFIGURE ${BFDEV_GENERATED_PATH}/bfdev-config.cmake) include(${PROJECT_SOURCE_DIR}/scripts/hostrule.cmake) include(${PROJECT_SOURCE_DIR}/scripts/packed-header.cmake) include(${PROJECT_SOURCE_DIR}/scripts/commit.cmake) +include(${PROJECT_SOURCE_DIR}/scripts/platform.cmake) commit_hash(BFDEV_COMMITID) commit_branch(BFDEV_BRANCH) @@ -56,6 +58,8 @@ option(BFDEV_STRICT "Enable strict compilation" OFF) option(BFDEV_EXAMPLES "Build examples" OFF) option(BFDEV_TESTSUITE "Build testsuite" OFF) +option(BFDEV_TEMPLATE "Build Template Library" ON) +option(BFDEV_MODULES "Build Modules Library" ON) option(BFDEV_BUILD_STATIC "Build Static Library" ON) option(BFDEV_BUILD_SHARED "Build Shared Library" ON) option(BFDEV_INSTALL_HEADERS "Install Headers" ON) @@ -85,15 +89,49 @@ if(BFDEV_DEVEL) set(BFDEV_GCOV ON) endif() +if(NOT BFDEV_PORT_TYPE STREQUAL "posix") + set(BFDEV_MODULES OFF) + set(BFDEV_EXAMPLES OFF) + set(BFDEV_TESTSUITE OFF) +endif() + +if(BFDEV_EXAMPLES OR BFDEV_TESTSUITE) + set(BFDEV_TEMPLATE ON) + set(BFDEV_MODULES ON) +endif() + include(${PROJECT_SOURCE_DIR}/build.cmake) add_subdirectory(${PROJECT_SOURCE_DIR}/scripts) -packed_header( - bfdev/template/ - _BFDEV_TEMPLATE_H_ - ${BFDEV_GENERATED_PATH}/bfdev/template.h - ${BFDEV_HEADER_PATH}/bfdev/template -) +if(BFDEV_TEMPLATE) + packed_header( + bfdev/template/ + _BFDEV_TEMPLATE_H_ + ${BFDEV_GENERATED_PATH}/bfdev/template.h + ${BFDEV_HEADER_PATH}/bfdev/template + ) +else() + set(BFDEV_EXPORT_EXTRA + ${BFDEV_EXPORT_EXTRA} + COMMAND ${CMAKE_COMMAND} -E rm -rf + ${BFDEV_EXPORT_PATH}/bfdev/template + ) +endif() + +if(BFDEV_MODULES) + packed_header( + bfdev/modules/ + _BFDEV_MODULES_H_ + ${BFDEV_GENERATED_PATH}/bfdev/modules.h + ${BFDEV_HEADER_PATH}/bfdev/modules + ) +else() + set(BFDEV_EXPORT_EXTRA + ${BFDEV_EXPORT_EXTRA} + COMMAND ${CMAKE_COMMAND} -E rm -rf + ${BFDEV_EXPORT_PATH}/bfdev/modules + ) +endif() packed_header( bfdev/ @@ -116,6 +154,7 @@ add_custom_target( ${BFDEV_ARCH_HEADER_PATH}/bfdev ${BFDEV_GENERATED_PATH}/bfdev ${BFDEV_EXPORT_PATH}/bfdev + ${BFDEV_EXPORT_EXTRA} ) set_property( diff --git a/build.cmake b/build.cmake index a20f8968..11da06f3 100644 --- a/build.cmake +++ b/build.cmake @@ -55,12 +55,17 @@ set(BFDEV_INCLUDE_DIRS ) include_directories(${BFDEV_INCLUDE_DIRS}) -include(${PROJECT_SOURCE_DIR}/scripts/platform.cmake) include(${BFDEV_PORT_PATH}/build.cmake) - include(${BFDEV_ARCH_PATH}/build.cmake) include(${BFDEV_SOURCE_PATH}/build.cmake) -include(${BFDEV_TEMPLATE_PATH}/build.cmake) + +if(BFDEV_TEMPLATE) + include(${BFDEV_TEMPLATE_PATH}/build.cmake) +endif() + +if(BFDEV_MODULES) + include(${BFDEV_MODULES_PATH}/build.cmake) +endif() configure_file( ${BFDEV_MODULE_PATH}/config.h.in diff --git a/examples/log/CMakeLists.txt b/examples/log/CMakeLists.txt index 12585e8f..5d5f4efe 100644 --- a/examples/log/CMakeLists.txt +++ b/examples/log/CMakeLists.txt @@ -7,21 +7,21 @@ add_executable(log-simple simple.c) target_link_libraries(log-simple bfdev) add_test(log-simple log-simple) -add_executable(log-date date.c) -target_link_libraries(log-date bfdev) -add_test(log-date log-date) +add_executable(log-modules modules.c) +target_link_libraries(log-modules bfdev) +add_test(log-modules log-modules) if(${CMAKE_PROJECT_NAME} STREQUAL "bfdev") install(FILES simple.c - date.c + modules.c DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples/log ) install(TARGETS log-simple - log-date + log-modules DESTINATION ${CMAKE_INSTALL_DOCDIR}/bin ) diff --git a/examples/log/date.c b/examples/log/date.c deleted file mode 100644 index 2960a0f8..00000000 --- a/examples/log/date.c +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright(c) 2023 Zhenlin Wang - */ - -#define MODULE_NAME "log-date" -#define bfdev_log_fmt(fmt) MODULE_NAME ": " fmt - -#include -#include -#include -#include - -static int -log_hook_date(bfdev_log_message_t *msg, void *pdata) -{ - struct tm *tm_info; - time_t timestamp; - char buff[64]; - - time(×tamp); - tm_info = localtime(×tamp); - strftime(buff, sizeof(buff), "%a %b %d %H:%M:%S %p %Z %Y", tm_info); - - return bfdev_msg_append(msg, "<%s> ", buff); -} - -static bfdev_log_chain_t -log_chain_date = { - .func = log_hook_date, - .priority = 0, -}; - -int -main(int argc, const char *argv[]) -{ - unsigned int count; - - bfdev_log_hook_register(&bfdev_log_default, &log_chain_date); - for (count = 0; count < 3; ++count) { - bfdev_log_info("Hello World!\n"); - sleep(1); - } - - return 0; -} diff --git a/examples/log/modules.c b/examples/log/modules.c new file mode 100644 index 00000000..81009087 --- /dev/null +++ b/examples/log/modules.c @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright(c) 2023 Zhenlin Wang + */ + +#define MODULE_NAME "log-modules" +#define bfdev_log_fmt(fmt) MODULE_NAME ": " fmt + +#include +#include +#include + +int +main(int argc, const char *argv[]) +{ + unsigned int count; + + bfdev_log_localtime_enable(&bfdev_log_default); + bfdev_log_hostname_enable(&bfdev_log_default); + bfdev_log_pid_enable(&bfdev_log_default); + + for (count = 0; count < 3; ++count) { + bfdev_log_info("Hello World!\n"); + sleep(1); + } + + return 0; +} diff --git a/include/bfdev/modules/log.h b/include/bfdev/modules/log.h new file mode 100644 index 00000000..a13bc7f7 --- /dev/null +++ b/include/bfdev/modules/log.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * Copyright(c) 2025 Zhenlin Wang + */ + +#ifndef _BFDEV_MODULES_LOG_H_ +#define _BFDEV_MODULES_LOG_H_ + +#include +#include + +BFDEV_BEGIN_DECLS + +extern bfdev_log_chain_t +bfdev_log_chain_hostname; + +extern bfdev_log_chain_t +bfdev_log_chain_localtime; + +extern bfdev_log_chain_t +bfdev_log_chain_pid; + +extern int +bfdev_log_localtime_enable(bfdev_log_t *log); + +extern void +bfdev_log_localtime_disable(bfdev_log_t *log); + +extern int +bfdev_log_hostname_enable(bfdev_log_t *log); + +extern void +bfdev_log_hostname_disable(bfdev_log_t *log); + +extern int +bfdev_log_pid_enable(bfdev_log_t *log); + +extern void +bfdev_log_pid_disable(bfdev_log_t *log); + +BFDEV_END_DECLS + +#endif /* _BFDEV_TEMPLATE_BTREE_H_ */ diff --git a/modules/build.cmake b/modules/build.cmake new file mode 100644 index 00000000..7b249c54 --- /dev/null +++ b/modules/build.cmake @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright(c) 2025 Zhenlin Wang +# + +set(BFDEV_SOURCE + ${BFDEV_SOURCE} + ${CMAKE_CURRENT_LIST_DIR}/log-hostname.c + ${CMAKE_CURRENT_LIST_DIR}/log-localtime.c + ${CMAKE_CURRENT_LIST_DIR}/log-pid.c +) diff --git a/modules/log-hostname.c b/modules/log-hostname.c new file mode 100644 index 00000000..047e9434 --- /dev/null +++ b/modules/log-hostname.c @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright(c) 2025 Zhenlin Wang + */ + +#include +#include +#include +#include + +static int +log_hook_hostname(bfdev_log_message_t *msg, void *pdata) +{ + struct utsname sys_info; + + if (uname(&sys_info) < 0) + return -BFDEV_EFAULT; + + return bfdev_msg_append(msg, "%s ", sys_info.nodename); +} + +export bfdev_log_chain_t +bfdev_log_chain_hostname = { + .func = log_hook_hostname, + .priority = -200, +}; + +export int +bfdev_log_hostname_enable(bfdev_log_t *log) +{ + return bfdev_log_hook_register(log, &bfdev_log_chain_hostname); +} + +export void +bfdev_log_hostname_disable(bfdev_log_t *log) +{ + bfdev_log_hook_unregister(log, &bfdev_log_chain_hostname); +} diff --git a/modules/log-localtime.c b/modules/log-localtime.c new file mode 100644 index 00000000..18769b48 --- /dev/null +++ b/modules/log-localtime.c @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright(c) 2025 Zhenlin Wang + */ + +#include +#include +#include +#include + +static int +log_hook_localtime(bfdev_log_message_t *msg, void *pdata) +{ + struct tm *tm_info; + time_t timestamp; + char buff[64]; + + time(×tamp); + tm_info = localtime(×tamp); + strftime(buff, sizeof(buff), "%a %b %d %H:%M:%S %p %Z %Y", tm_info); + + return bfdev_msg_append(msg, "<%s> ", buff); +} + +export bfdev_log_chain_t +bfdev_log_chain_localtime = { + .func = log_hook_localtime, + .priority = -1000, +}; + +export int +bfdev_log_localtime_enable(bfdev_log_t *log) +{ + return bfdev_log_hook_register(log, &bfdev_log_chain_localtime); +} + +export void +bfdev_log_localtime_disable(bfdev_log_t *log) +{ + bfdev_log_hook_unregister(log, &bfdev_log_chain_localtime); +} diff --git a/modules/log-pid.c b/modules/log-pid.c new file mode 100644 index 00000000..f3371e62 --- /dev/null +++ b/modules/log-pid.c @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright(c) 2025 Zhenlin Wang + */ + +#include +#include +#include +#include +#include + +static int +log_hook_pid(bfdev_log_message_t *msg, void *pdata) +{ + return bfdev_msg_append(msg, "(pid: %d) ", getpid()); +} + +export bfdev_log_chain_t +bfdev_log_chain_pid = { + .func = log_hook_pid, + .priority = -100, +}; + +export int +bfdev_log_pid_enable(bfdev_log_t *log) +{ + return bfdev_log_hook_register(log, &bfdev_log_chain_pid); +} + +export void +bfdev_log_pid_disable(bfdev_log_t *log) +{ + bfdev_log_hook_unregister(log, &bfdev_log_chain_pid); +}