diff --git a/.gitmodules b/.gitmodules index 72bf2122f6c733a865f80b36d397b21a61a70d40..466449d435cf89d1b97c555b5fd5ab24940f39ec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,15 +1,16 @@ -[submodule "apps/cpp_tbox"] - path = apps/cpp_tbox +[submodule "3rd-party/cpp-tbox"] + path = 3rd-party/cpp-tbox url = git@gitee.com:cpp-master/cpp-tbox.git -[submodule "third_party/libevent/src"] - path = third_party/libevent/src + branch = develop +[submodule "3rd-party/libevent/src"] + path = 3rd-party/libevent/src url = https://github.com/libevent/libevent.git -[submodule "third_party/mosquitto/src"] - path = third_party/mosquitto/src +[submodule "3rd-party/libev/src"] + path = 3rd-party/libev/src + url = https://github.com/enki/libev.git +[submodule "3rd-party/mosquitto/src"] + path = 3rd-party/mosquitto/src url = https://github.com/eclipse/mosquitto.git -[submodule "third_party/cJSON/src"] - path = third_party/cJSON/src +[submodule "3rd-party/cJSON/src"] + path = 3rd-party/cJSON/src url = https://github.com/DaveGamble/cJSON.git -[submodule "third_party/libev/src"] - path = third_party/libev/src - url = https://github.com/enki/libev.git diff --git a/third_party/Makefile b/3rd-party/Makefile similarity index 53% rename from third_party/Makefile rename to 3rd-party/Makefile index 4fa9e8a2505de50055981b262e473a0c0b4a1ae2..8fdba831f1da8fa543915d7d91f20376f86ac7f2 100644 --- a/third_party/Makefile +++ b/3rd-party/Makefile @@ -4,11 +4,20 @@ export DESTDIR ?= $(STAGING_DIR) export prefix ?= export PREFIX ?= -targets += libevent -targets += libev targets += nlohmann -targets += cJSON -targets += mosquitto +#targets += cJSON +#targets += mosquitto +#targets += libevent +#targets += libev + +targets += cpp-tbox/base \ + cpp-tbox/event \ + cpp-tbox/eventx \ + cpp-tbox/util \ + cpp-tbox/log \ + cpp-tbox/network \ + cpp-tbox/terminal \ + cpp-tbox/main \ all test clean distclean: @for i in $(targets); do \ diff --git a/third_party/cJSON/Makefile b/3rd-party/cJSON/Makefile similarity index 100% rename from third_party/cJSON/Makefile rename to 3rd-party/cJSON/Makefile diff --git a/3rd-party/cJSON/src b/3rd-party/cJSON/src new file mode 160000 index 0000000000000000000000000000000000000000..b45f48e600671feade0b6bd65d1c69de7899f2be --- /dev/null +++ b/3rd-party/cJSON/src @@ -0,0 +1 @@ +Subproject commit b45f48e600671feade0b6bd65d1c69de7899f2be diff --git a/3rd-party/cpp-tbox b/3rd-party/cpp-tbox new file mode 160000 index 0000000000000000000000000000000000000000..b716fbca8e286b5079bbf81026d2818664dca0a5 --- /dev/null +++ b/3rd-party/cpp-tbox @@ -0,0 +1 @@ +Subproject commit b716fbca8e286b5079bbf81026d2818664dca0a5 diff --git a/third_party/libev/Makefile b/3rd-party/libev/Makefile similarity index 100% rename from third_party/libev/Makefile rename to 3rd-party/libev/Makefile diff --git a/third_party/libev/src b/3rd-party/libev/src similarity index 100% rename from third_party/libev/src rename to 3rd-party/libev/src diff --git a/third_party/libevent/Makefile b/3rd-party/libevent/Makefile similarity index 100% rename from third_party/libevent/Makefile rename to 3rd-party/libevent/Makefile diff --git a/3rd-party/libevent/src b/3rd-party/libevent/src new file mode 160000 index 0000000000000000000000000000000000000000..3e7a73809ebfd0e111856eb0b395d6a0735b6c8b --- /dev/null +++ b/3rd-party/libevent/src @@ -0,0 +1 @@ +Subproject commit 3e7a73809ebfd0e111856eb0b395d6a0735b6c8b diff --git a/third_party/mosquitto/Makefile b/3rd-party/mosquitto/Makefile similarity index 100% rename from third_party/mosquitto/Makefile rename to 3rd-party/mosquitto/Makefile diff --git a/third_party/mosquitto/patches/01-config.patch b/3rd-party/mosquitto/patches/01-config.patch similarity index 100% rename from third_party/mosquitto/patches/01-config.patch rename to 3rd-party/mosquitto/patches/01-config.patch diff --git a/3rd-party/mosquitto/src b/3rd-party/mosquitto/src new file mode 160000 index 0000000000000000000000000000000000000000..ff97fbfe94b304b86167b15a68d4ae1d4502642c --- /dev/null +++ b/3rd-party/mosquitto/src @@ -0,0 +1 @@ +Subproject commit ff97fbfe94b304b86167b15a68d4ae1d4502642c diff --git a/third_party/nlohmann/LICENSE.MIT b/3rd-party/nlohmann/LICENSE.MIT similarity index 100% rename from third_party/nlohmann/LICENSE.MIT rename to 3rd-party/nlohmann/LICENSE.MIT diff --git a/third_party/nlohmann/Makefile b/3rd-party/nlohmann/Makefile similarity index 100% rename from third_party/nlohmann/Makefile rename to 3rd-party/nlohmann/Makefile diff --git a/third_party/nlohmann/json.hpp b/3rd-party/nlohmann/json.hpp similarity index 100% rename from third_party/nlohmann/json.hpp rename to 3rd-party/nlohmann/json.hpp diff --git a/third_party/nlohmann/json_fwd.hpp b/3rd-party/nlohmann/json_fwd.hpp similarity index 100% rename from third_party/nlohmann/json_fwd.hpp rename to 3rd-party/nlohmann/json_fwd.hpp diff --git a/Makefile b/Makefile index 5ffb10eb60685713f5acbacc257151aa7bdc7ec7..aa3ae2699333b1de066c976925995587f604430a 100644 --- a/Makefile +++ b/Makefile @@ -3,14 +3,17 @@ export TOP_DIR := $(PWD) include config.mk include tools/build_env.mk -targets += third_party +targets += 3rd-party targets += apps -.PHONY: all test clean distclean $(targets) +.PHONY: all test clean distclean prepare $(targets) -all: $(targets) +all: prepare $(targets) ./tools/make_install.sh +prepare: + $(PLATFORM_DIR)/tools/prepare.sh + $(targets): $(MAKE) -C $@ @@ -21,8 +24,8 @@ test: $(targets) clean: rm -rf $(OUTPUT_DIR) - make -C third_party clean + make -C 3rd-party clean distclean: clean rm -rf $(INSTALL_DIR) $(STAGING_DIR) - make -C third_party distclean + make -C 3rd-party distclean diff --git a/README.md b/README.md index e095110d1025cc0f7cc988e8dde66274712c2122..bd78b1ed064f48d91afcb869443e3722ed065b57 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ cpp-solution,是跨平台的C++应用项目模板。它让开发者在非常 # 怎么创建一个新的项目? -请参考 apps/app\_demo 的实现方法。修改或复制它即可。 +如果是基于 cpp-tbox 的 main 框架开发,请参考 apps/cpp-tbox-sample 的实现方法。修改或复制它即可。 +如果仅仅是一个简单的程序,请参考 apps/hello-world。 # 怎么跨平台? @@ -22,7 +23,13 @@ cpp-solution,是跨平台的C++应用项目模板。它让开发者在非常 如果 mips 的工具链都在 somewhere/bin/ 目录下,具都以 mips-xxx- 开头。如 gcc 为 mips-xxx-gcc,那么 `TOOLCHAIN_BIN_PREFIX` 则应设置成 `somewhere/bin/mips-xxx-` 4. 构建时,可使用命令 `make PLATFORM=misp` 进行构建。 +make 命令有以下参数: +`make [PLATFORM=xxx] [RELEASE=1] [ENABLE_ASAN=1]` + +- PLATFORM=xxx,指定xxx交叉编译环境,默认为 host 本机; +- RELEASE=1,构建发布版本,编译参数加 `-O2 -Os` 参数。否则构建调试版本,编译参数加 `-DDEBUG=1 -O0 -ggdb`,默认为调试版本; +- ENABLE\_ASAN=1,启用ASan进行运行时内存检测,默认不启用。 + # 未来规化 -- 将目前文档与源码文件分离开 - 将third\_party编译的目标文件与与源码文件分离开 diff --git a/apps/Makefile b/apps/Makefile index 957f6a5d2c02c664e868067bc7dd70036449c900..37e2b334b6eb05fb75ebc39b2c3477c676eaf032 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,8 +1,5 @@ -apps += base event eventx util -apps += network -apps += terminal -apps += main -apps += sample +apps += hello-world +apps += cpp-tbox-sample all test clean distclean: @for i in $(apps); do \ diff --git a/apps/base b/apps/base deleted file mode 120000 index cc11ec6980ca78965fafe6360da09b782bebe282..0000000000000000000000000000000000000000 --- a/apps/base +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/base \ No newline at end of file diff --git a/apps/coroutine b/apps/coroutine deleted file mode 120000 index 7c8d184eadd1616017ec9b1ba84d94be49e259dc..0000000000000000000000000000000000000000 --- a/apps/coroutine +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/coroutine \ No newline at end of file diff --git a/apps/cpp-tbox-sample/Makefile b/apps/cpp-tbox-sample/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f3aa931cacd80ac96bebb74ee083b55fcfca1b32 --- /dev/null +++ b/apps/cpp-tbox-sample/Makefile @@ -0,0 +1,31 @@ +EXE_NAME := sample + +CPP_SRC_FILES := app_main.cpp build_time.cpp +TEST_CPP_SRC_FILES := +TEST_LDFLAGS := + +CONF_FILES := default.conf + +include app1/app.mk +include app2/app.mk + +CXXFLAGS := -DLOG_MODULE_ID='"$(EXE_NAME)"' $(CXXFLAGS) +LDFLAGS += \ + -ltbox_main \ + -ltbox_terminal \ + -ltbox_network \ + -ltbox_eventx \ + -ltbox_eventx \ + -ltbox_event \ + -ltbox_log \ + -ltbox_util \ + -ltbox_base \ + -lpthread \ + -rdynamic + +TEST_LDFLAGS += $(LDFLAGS) + +pre_build : + touch build_time.cpp + +include ${TOP_DIR}/tools/exe_common.mk diff --git a/apps/cpp-tbox-sample/README.md b/apps/cpp-tbox-sample/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9b9e2901241801fccaf47b79171cb534aef0d0ba --- /dev/null +++ b/apps/cpp-tbox-sample/README.md @@ -0,0 +1,2 @@ +这是一个单进程,多应用的示例。它有两个应用。 +两个应用虽运行在同一个进程里,但两者的代码分别在各自的子目录下,独立逻辑,不相干扰。 diff --git a/apps/cpp-tbox-sample/app1/app.cpp b/apps/cpp-tbox-sample/app1/app.cpp new file mode 100644 index 0000000000000000000000000000000000000000..58531abcd22286673baf20321f5675436da04cf6 --- /dev/null +++ b/apps/cpp-tbox-sample/app1/app.cpp @@ -0,0 +1,39 @@ +#include "app.h" +#include + +namespace app1 { + +App::App(tbox::main::Context &ctx) : + Module("app1", ctx) +{ + LogTag(); +} + +App::~App() +{ + LogTag(); +} + +bool App::onInit(const tbox::Json &cfg) +{ + LogTag(); + return true; +} + +bool App::onStart() +{ + LogTag(); + return true; +} + +void App::onStop() +{ + LogTag(); +} + +void App::onCleanup() +{ + LogTag(); +} + +} diff --git a/apps/cpp-tbox-sample/app1/app.h b/apps/cpp-tbox-sample/app1/app.h new file mode 100644 index 0000000000000000000000000000000000000000..b52f1fcab3cf38465f099cc2fc87b8a81ad5eb98 --- /dev/null +++ b/apps/cpp-tbox-sample/app1/app.h @@ -0,0 +1,23 @@ +#ifndef TBOX_MAIN_EXAMPLE_APP1_H_20211226 +#define TBOX_MAIN_EXAMPLE_APP1_H_20211226 + +#include + +namespace app1 { + +class App : public tbox::main::Module +{ + public: + App(tbox::main::Context &ctx); + ~App(); + + protected: + virtual bool onInit(const tbox::Json &cfg) override; + virtual bool onStart() override; + virtual void onStop() override; + virtual void onCleanup() override; +}; + +} + +#endif //TBOX_MAIN_EXAMPLE_APP1_H_20211226 diff --git a/apps/cpp-tbox-sample/app1/app.mk b/apps/cpp-tbox-sample/app1/app.mk new file mode 100644 index 0000000000000000000000000000000000000000..5b296fc692c2d280ef3cf05cc9e0338818e71127 --- /dev/null +++ b/apps/cpp-tbox-sample/app1/app.mk @@ -0,0 +1,7 @@ +CPP_SRC_FILES += app1/app.cpp +CC_SRC_FILES += +C_SRC_FILES += +LDFLAGS += + +TEST_CPP_SRC_FILES += +TEST_LDFLAGS += diff --git a/apps/cpp-tbox-sample/app2/app.cpp b/apps/cpp-tbox-sample/app2/app.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f7317c0b6d5e83251f1f3f8fa7dfbf4a4402a15a --- /dev/null +++ b/apps/cpp-tbox-sample/app2/app.cpp @@ -0,0 +1,39 @@ +#include "app.h" +#include + +namespace app2 { + +App::App(tbox::main::Context &ctx) : + Module("app2", ctx) +{ + LogTag(); +} + +App::~App() +{ + LogTag(); +} + +bool App::onInit(const tbox::Json &cfg) +{ + LogTag(); + return true; +} + +bool App::onStart() +{ + LogTag(); + return true; +} + +void App::onStop() +{ + LogTag(); +} + +void App::onCleanup() +{ + LogTag(); +} + +} diff --git a/apps/cpp-tbox-sample/app2/app.h b/apps/cpp-tbox-sample/app2/app.h new file mode 100644 index 0000000000000000000000000000000000000000..1889d039061356efd3406cd6dd0374f312a166b6 --- /dev/null +++ b/apps/cpp-tbox-sample/app2/app.h @@ -0,0 +1,23 @@ +#ifndef TBOX_MAIN_EXAMPLE_APP2_H_20211226 +#define TBOX_MAIN_EXAMPLE_APP2_H_20211226 + +#include + +namespace app2 { + +class App : public tbox::main::Module +{ + public: + App(tbox::main::Context &ctx); + ~App(); + + protected: + virtual bool onInit(const tbox::Json &cfg) override; + virtual bool onStart() override; + virtual void onStop() override; + virtual void onCleanup() override; +}; + +} + +#endif //TBOX_MAIN_EXAMPLE_APP2_H_20211226 diff --git a/apps/cpp-tbox-sample/app2/app.mk b/apps/cpp-tbox-sample/app2/app.mk new file mode 100644 index 0000000000000000000000000000000000000000..6766a6629988b2a9fdd0c58ac1bda323f46de299 --- /dev/null +++ b/apps/cpp-tbox-sample/app2/app.mk @@ -0,0 +1,7 @@ +CPP_SRC_FILES += app2/app.cpp +CC_SRC_FILES += +C_SRC_FILES += +LDFLAGS += + +TEST_CPP_SRC_FILES += +TEST_LDFLAGS += diff --git a/apps/cpp-tbox-sample/app_main.cpp b/apps/cpp-tbox-sample/app_main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..45221605e3cc2c25111e9bcd2447831c500d4f62 --- /dev/null +++ b/apps/cpp-tbox-sample/app_main.cpp @@ -0,0 +1,29 @@ +#include + +#include "app1/app.h" +#include "app2/app.h" + +namespace tbox { +namespace main { + +void RegisterApps(Module &apps, Context &ctx) +{ + apps.add(new app1::App(ctx)); + apps.add(new app2::App(ctx)); +} + +std::string GetAppDescribe() +{ + return "This is a sample within two apps."; +} + +void GetAppVersion(int &major, int &minor, int &rev, int &build) +{ + major = 1; + minor = 0; + rev = 0; + build = 0; +} + +} +} diff --git a/apps/cpp-tbox-sample/build_time.cpp b/apps/cpp-tbox-sample/build_time.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f57a10f66093296460fdee88472ef3cf1fd0f8e0 --- /dev/null +++ b/apps/cpp-tbox-sample/build_time.cpp @@ -0,0 +1,12 @@ +#include + +namespace tbox { +namespace main { + +std::string GetAppBuildTime() +{ + return __DATE__ " " __TIME__; +} + +} +} diff --git a/apps/cpp-tbox-sample/default.conf b/apps/cpp-tbox-sample/default.conf new file mode 100644 index 0000000000000000000000000000000000000000..401584f327c07dbffaf060c0683071a226c633b1 --- /dev/null +++ b/apps/cpp-tbox-sample/default.conf @@ -0,0 +1,14 @@ +{ + "pid_file": "/tmp/sample.pid", + "thread_pool": { + "max": 5, + "min": 1 + }, + "telnetd": { + "bind": "/tmp/sample-telnetd.sock" + }, + "tcp_rpc": { + "bind": "/tmp/sample-rpc.sock" + } +} + diff --git a/apps/cpp_tbox b/apps/cpp_tbox deleted file mode 160000 index 26d5e7760398dfde589e0af0d4d432e2789f739f..0000000000000000000000000000000000000000 --- a/apps/cpp_tbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 26d5e7760398dfde589e0af0d4d432e2789f739f diff --git a/apps/event b/apps/event deleted file mode 120000 index 53295476b242a4dd2c54297e984c21dd097c48f0..0000000000000000000000000000000000000000 --- a/apps/event +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/event \ No newline at end of file diff --git a/apps/eventx b/apps/eventx deleted file mode 120000 index 30c23f319ab9050ab065cee0bb9e2e9f9bee9882..0000000000000000000000000000000000000000 --- a/apps/eventx +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/eventx \ No newline at end of file diff --git a/apps/hello-world/Makefile b/apps/hello-world/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..3ae13de7e42f1970441e462fea4a4ca089b65724 --- /dev/null +++ b/apps/hello-world/Makefile @@ -0,0 +1,4 @@ +EXE_NAME := hello +CPP_SRC_FILES := main.cpp + +include ${TOP_DIR}/tools/exe_common.mk diff --git a/apps/hello-world/main.cpp b/apps/hello-world/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fe03ecbe09c5825662d120f11c7a015156314b8e --- /dev/null +++ b/apps/hello-world/main.cpp @@ -0,0 +1,8 @@ +#include + +using namespace std; + +int main() +{ + cout << "hello world!" << endl; +} diff --git a/apps/main b/apps/main deleted file mode 120000 index 8e06be6b24557aeb201a88b111ba391ab67cb516..0000000000000000000000000000000000000000 --- a/apps/main +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/main \ No newline at end of file diff --git a/apps/network b/apps/network deleted file mode 120000 index 3827d30217e877b83538fead863dc483df406fdf..0000000000000000000000000000000000000000 --- a/apps/network +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/network \ No newline at end of file diff --git a/apps/sample b/apps/sample deleted file mode 120000 index c17dd4beddcb3dc1b2e4118f4c6b6dae9069a652..0000000000000000000000000000000000000000 --- a/apps/sample +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/sample/ \ No newline at end of file diff --git a/apps/terminal b/apps/terminal deleted file mode 120000 index 6abdb88119d92df85e83406b8c645ae3c56aa7e0..0000000000000000000000000000000000000000 --- a/apps/terminal +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/terminal \ No newline at end of file diff --git a/apps/tools b/apps/tools deleted file mode 120000 index 4a0aff477f9b128920c0cbed7135bee5282b9b54..0000000000000000000000000000000000000000 --- a/apps/tools +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/tools \ No newline at end of file diff --git a/apps/util b/apps/util deleted file mode 120000 index f878e793013ddb56af880f413edca91a53ce6190..0000000000000000000000000000000000000000 --- a/apps/util +++ /dev/null @@ -1 +0,0 @@ -cpp_tbox/util \ No newline at end of file diff --git a/platforms/host/tools/prepare.sh b/platforms/host/tools/prepare.sh new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/third_party/cJSON/src b/third_party/cJSON/src deleted file mode 160000 index 203a0dec6ff06e3842fa23a1bc9825aecf56b381..0000000000000000000000000000000000000000 --- a/third_party/cJSON/src +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 203a0dec6ff06e3842fa23a1bc9825aecf56b381 diff --git a/third_party/libevent/src b/third_party/libevent/src deleted file mode 160000 index a9595ccd7d1d6c02836d2facda0ba10bf4b66a79..0000000000000000000000000000000000000000 --- a/third_party/libevent/src +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a9595ccd7d1d6c02836d2facda0ba10bf4b66a79 diff --git a/third_party/mosquitto/src b/third_party/mosquitto/src deleted file mode 160000 index 3cbe805e71ac41a2a20cc9b2ea6b3b619f49554a..0000000000000000000000000000000000000000 --- a/third_party/mosquitto/src +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3cbe805e71ac41a2a20cc9b2ea6b3b619f49554a diff --git a/tools/build_env.mk b/tools/build_env.mk index cf717c70d8c8101ae199f2d17d86b12137fd8326..228f5e51bb7c9d690c03435b3f80cab7af164ec9 100644 --- a/tools/build_env.mk +++ b/tools/build_env.mk @@ -8,23 +8,35 @@ export TOOLCHAIN_BIN_PREFIX ?= export CONFIGURE_HELPER ?= $(TOP_DIR)/tools/configure_helper.sh export MAKE_PATCH ?= $(TOP_DIR)/tools/make_patch.sh +export COMMON_DIR ?= $(TOP_DIR)/platforms/common export CONSTANT_DIR ?= $(PLATFORM_DIR)/constant_files -export STAGING_DIR ?= $(PLATFORM_DIR)/staging_files -export INSTALL_DIR ?= $(PLATFORM_DIR)/install_files +export STAGING_DIR ?= $(PLATFORM_DIR)/staging_files +export INSTALL_DIR ?= $(PLATFORM_DIR)/install_files -export STAGING_INCLUDE := $(STAGING_DIR)/include -export STAGING_LIB := $(STAGING_DIR)/lib +export COMMON_INCLUDE := $(COMMON_DIR)/include +export STAGING_INCLUDE := $(STAGING_DIR)/include +export STAGING_LIB := $(STAGING_DIR)/lib export CONSTANT_INCLUDE := $(CONSTANT_DIR)/include -export CONSTANT_LIB := $(CONSTANT_DIR)/lib +export CONSTANT_LIB := $(CONSTANT_DIR)/lib export OUTPUT_DIR := $(PLATFORM_DIR)/output_files -INCLUDE_FLAGS := -I$(STAGING_INCLUDE) -I$(CONSTANT_INCLUDE) -LINK_FLAGS := -L$(STAGING_LIB) -L$(CONSTANT_LIB) - -export CFLAGS := $(INCLUDE_FLAGS) -std=c99 -export CXXFLAGS := $(INCLUDE_FLAGS) -std=c++11 -export LDFLAGS := $(LINK_FLAGS) +COMPILE_FLAGS := -I$(STAGING_INCLUDE) -I$(CONSTANT_INCLUDE) -I$(COMMON_INCLUDE) +LINK_FLAGS := -L$(STAGING_LIB) -L$(CONSTANT_LIB) + +ifeq ($(RELEASE), 1) +COMPILE_FLAGS += -O2 -Os +else +COMPILE_FLAGS += -DDEBUG=1 -O0 -ggdb +ifeq ($(ENABLE_ASAN), 1) +COMPILE_FLAGS += -fsanitize=address -fno-omit-frame-pointer +LINK_FLAGS += -fsanitize=address -static-libasan +endif +endif + +export CFLAGS := $(COMPILE_FLAGS) +export CXXFLAGS := $(COMPILE_FLAGS) +export LDFLAGS := $(LINK_FLAGS) export AR := $(TOOLCHAIN_BIN_PREFIX)ar export AS := $(TOOLCHAIN_BIN_PREFIX)as diff --git a/tools/exe_common.mk b/tools/exe_common.mk new file mode 100644 index 0000000000000000000000000000000000000000..2ceddb919e371728b5fbd10f3ccfa1d6e04b88c9 --- /dev/null +++ b/tools/exe_common.mk @@ -0,0 +1,146 @@ +################################################################ +# ABOUT: +# This C++ library project Makefile's common part, which can be included +# into project's Makefile, to make Makefile is easy to maintain. +# +# HOW TO USE: +# before include this file. those variables need be specified. +# C_SRC_FILES, CC_SRC_FILES, CPP_SRC_FILES, CXXFLAGS, TEST_LDFLAGS +# OUTPUT_DIR, INSTALL_DIR +# +# TARGETS: +# all, test, clean, distclean, install, uninstall +################################################################ + +.PHONY: all print_complie_vars print_build_var print_test_vars clean distclean install uninstall pre_build post_build + +EXE_OUTPUT_DIR = $(OUTPUT_DIR)/$(EXE_NAME) + +STATIC_LIB := $(EXE_NAME) + +#TARGETS := pre_build print_vars build_exe post_build +TARGETS := pre_build build_exe post_build + +all: $(TARGETS) install + +print_vars: + @echo CXX=$(CXX) + @echo C_SRC_FILES=$(C_SRC_FILES) + @echo CC_SRC_FILES=$(CC_SRC_FILES) + @echo CPP_SRC_FILES=$(CPP_SRC_FILES) + @echo OUTPUT_DIR=$(OUTPUT_DIR) + @echo STAGING_DIR=$(STAGING_DIR) + @echo INSTALL_DIR=$(INSTALL_DIR) + +################################################################ +# exe +################################################################ + +CPP_SOURCE_TO_OBJECT = $(EXE_OUTPUT_DIR)/$(subst .cpp,.o,$(1)) +CC_SOURCE_TO_OBJECT = $(EXE_OUTPUT_DIR)/$(subst .cc,.o,$(1)) +C_SOURCE_TO_OBJECT = $(EXE_OUTPUT_DIR)/$(subst .c,.o,$(1)) + +OBJECTS := $(foreach src,$(CPP_SRC_FILES),$(call CPP_SOURCE_TO_OBJECT,$(src))) +OBJECTS += $(foreach src,$(CC_SRC_FILES),$(call CC_SOURCE_TO_OBJECT,$(src))) +OBJECTS += $(foreach src,$(C_SRC_FILES),$(call C_SOURCE_TO_OBJECT,$(src))) + +define CREATE_CPP_OBJECT +$(call CPP_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_CC_OBJECT +$(call CC_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_C_OBJECT +$(call C_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $^\033[0m" + @install -d $$(dir $$@) + @$(CC) $(CFLAGS) -o $$@ -c $$^ +endef + +$(foreach src,$(CPP_SRC_FILES),$(eval $(call CREATE_CPP_OBJECT,$(src)))) +$(foreach src,$(CC_SRC_FILES),$(eval $(call CREATE_CC_OBJECT,$(src)))) +$(foreach src,$(C_SRC_FILES),$(eval $(call CREATE_C_OBJECT,$(src)))) + +print_exe_vars : + @echo CXXFLAGS=$(CXXFLAGS) + @echo EXE_NAME=$(EXE_NAME) + @echo OBJECTS=$(OBJECTS) + +$(EXE_OUTPUT_DIR)/$(EXE_NAME) : $(OBJECTS) + @echo "\033[35mBUILD $(EXE_NAME) \033[0m" + @install -d $(dir $@) + @$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) -rdynamic + +#build_exe : print_exe_vars $(EXE_OUTPUT_DIR)/$(EXE_NAME) +build_exe : $(EXE_OUTPUT_DIR)/$(EXE_NAME) + +################################################################ +# test +################################################################ + +CPP_SOURCE_TO_TEST_OBJECT = $(EXE_OUTPUT_DIR)/$(subst .cpp,.oT,$(1)) +C_SOURCE_TO_TEST_OBJECT = $(EXE_OUTPUT_DIR)/$(subst .c,.oT,$(1)) + +TEST_OBJECTS := $(foreach src,$(TEST_CPP_SRC_FILES),$(call CPP_SOURCE_TO_TEST_OBJECT,$(src))) +TEST_CXXFLAGS := $(CXXFLAGS) + +define CREATE_CPP_TEST_OBJECT +$(call CPP_SOURCE_TO_TEST_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(TEST_CXXFLAGS) -o $$@ -c $$^ +endef + +$(foreach src,$(TEST_CPP_SRC_FILES),$(eval $(call CREATE_CPP_TEST_OBJECT,$(src)))) + +print_test_vars : + @echo TEST_CXXFLAGS=$(TEST_CXXFLAGS) + @echo TEST_OBJECTS=$(TEST_OBJECTS) + @echo TEST_LDFLAGS=$(TEST_LDFLAGS) + +$(EXE_OUTPUT_DIR)/test: $(TEST_OBJECTS) $(OBJECTS) + @echo "\033[35mBUILD test\033[0m" + @$(CXX) -o $@ $(TEST_OBJECTS) $(OBJECTS) $(TEST_LDFLAGS) -lgmock_main -lgmock -lgtest -lpthread + +#test : print_test_vars $(EXE_OUTPUT_DIR)/test +test : $(EXE_OUTPUT_DIR)/test + +################################################################ +# install and uninstall +################################################################ + +# install head files +SRC_CONF_TO_INSTALL_CONF = $(addprefix $(INSTALL_DIR)/etc/$(EXE_NAME)/,$(1)) + +define CREATE_INSTALL_CONF_TARGET +$(call SRC_CONF_TO_INSTALL_CONF,$(1)) : $(1) + @install -Dm 640 $$^ $$@ +endef + +$(foreach src,$(CONF_FILES),$(eval $(call CREATE_INSTALL_CONF_TARGET,$(src)))) + +INSTALL_CONFS := $(foreach src,$(CONF_FILES),$(call SRC_CONF_TO_INSTALL_CONF,$(src))) + +INSTALL_EXE := $(INSTALL_DIR)/bin/$(EXE_NAME) +$(INSTALL_EXE) : $(EXE_OUTPUT_DIR)/$(EXE_NAME) + @install -Dm 750 $^ $@ + +install: $(INSTALL_EXE) $(INSTALL_CONFS) + +uninstall: + rm -f $(INSTALL_DIR)/bin/$(EXE_NAME) + +################################################################ +# clean +################################################################ +clean: + -rm -f $(OBJECTS) + diff --git a/tools/lib_common.mk b/tools/lib_common.mk new file mode 100644 index 0000000000000000000000000000000000000000..8da1c8e441a0aed59005c439ce6168515cd62931 --- /dev/null +++ b/tools/lib_common.mk @@ -0,0 +1,225 @@ +################################################################ +# ABOUT: +# This C++ library project Makefile's common part, which can be included +# into project's Makefile, to make Makefile is easy to maintain. +# +# HOW TO USE: +# before include this file. those variables need be specified. +# LIB_VERSION_X, LIB_VERSION_Y, LIB_VERSION_Z, C_SRC_FILES, CC_SRC_FILES, CPP_SRC_FILES, CXXFLAGS, TEST_LDFLAGS +# OUTPUT_DIR, STAGING_DIR, INSTALL_DIR +# +# TARGETS: +# all, libxxx.a, libxxx.so.x.x.x, test, clean, distclean, install, uninstall +################################################################ + +.PHONY: all print_vars print_static_vars print_shared_vars print_test_vars clean distclean install uninstall pre_build post_build + +LIB_BASENAME = lib$(LIB_NAME)$(LIB_NAME_EXT) +LIB_OUTPUT_DIR = $(OUTPUT_DIR)/$(LIB_NAME) + +STATIC_LIB := $(LIB_BASENAME).a +SHARED_LIB := $(LIB_BASENAME).so.$(LIB_VERSION_X).$(LIB_VERSION_Y).$(LIB_VERSION_Z) + +ENABLE_STATIC_LIB ?= yes +ENABLE_SHARED_LIB ?= yes + +TARGETS := pre_build #print_vars + +ifeq ($(ENABLE_STATIC_LIB),yes) + TARGETS += build_static_lib +endif + +ifeq ($(ENABLE_SHARED_LIB),yes) + TARGETS += build_shared_lib +endif + +TARGETS += post_build + +all: $(TARGETS) install + +print_vars: + @echo CXX=$(CXX) + @echo C_SRC_FILES=$(C_SRC_FILES) + @echo CC_SRC_FILES=$(CC_SRC_FILES) + @echo CPP_SRC_FILES=$(CPP_SRC_FILES) + @echo OUTPUT_DIR=$(OUTPUT_DIR) + @echo STAGING_DIR=$(STAGING_DIR) + @echo INSTALL_DIR=$(INSTALL_DIR) + +################################################################ +# static library +################################################################ + +CPP_SOURCE_TO_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .cpp,.o,$(1)) +CC_SOURCE_TO_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .cc,.o,$(1)) +C_SOURCE_TO_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .c,.o,$(1)) + +OBJECTS := $(foreach src,$(CPP_SRC_FILES),$(call CPP_SOURCE_TO_OBJECT,$(src))) +OBJECTS += $(foreach src,$(CC_SRC_FILES),$(call CC_SOURCE_TO_OBJECT,$(src))) +OBJECTS += $(foreach src,$(C_SRC_FILES),$(call C_SOURCE_TO_OBJECT,$(src))) + +define CREATE_CPP_OBJECT +$(call CPP_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_CC_OBJECT +$(call CC_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_C_OBJECT +$(call C_SOURCE_TO_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $^\033[0m" + @$(CC) $(CFLAGS) -o $@ -c $^ +endef + +$(foreach src,$(CPP_SRC_FILES),$(eval $(call CREATE_CPP_OBJECT,$(src)))) +$(foreach src,$(CC_SRC_FILES),$(eval $(call CREATE_CC_OBJECT,$(src)))) +$(foreach src,$(C_SRC_FILES),$(eval $(call CREATE_C_OBJECT,$(src)))) + +print_static_vars : + @echo CXXFLAGS=$(CXXFLAGS) + @echo OBJECTS=$(OBJECTS) + +$(LIB_OUTPUT_DIR)/$(STATIC_LIB) : $(OBJECTS) + @echo "\033[35mBUILD $(STATIC_LIB) \033[0m" + @install -d $(dir $@) + @$(AR) rc $@ $(OBJECTS) + +#build_static_lib : print_static_vars $(LIB_OUTPUT_DIR)/$(STATIC_LIB) +build_static_lib : $(LIB_OUTPUT_DIR)/$(STATIC_LIB) + +################################################################ +# shared library +################################################################ + +CPP_SOURCE_TO_SHARED_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .cpp,.oS,$(1)) +CC_SOURCE_TO_SHARED_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .cc,.oS,$(1)) +C_SOURCE_TO_SHARED_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .c,.oS,$(1)) + +SHARED_OBJECTS := $(foreach src,$(CPP_SRC_FILES),$(call CPP_SOURCE_TO_SHARED_OBJECT,$(src))) +SHARED_OBJECTS += $(foreach src,$(CC_SRC_FILES),$(call CC_SOURCE_TO_SHARED_OBJECT,$(src))) +SHARED_OBJECTS += $(foreach src,$(C_SRC_FILES),$(call C_SOURCE_TO_SHARED_OBJECT,$(src))) + +SHARED_CXXFLAGS := $(CXXFLAGS) -fPIC +SHARED_CFLAGS := $(CFLAGS) -fPIC + +define CREATE_CPP_SHARED_OBJECT +$(call CPP_SOURCE_TO_SHARED_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(SHARED_CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_CC_SHARED_OBJECT +$(call CC_SOURCE_TO_SHARED_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(SHARED_CXXFLAGS) -o $$@ -c $$^ +endef + +define CREATE_C_SHARED_OBJECT +$(call C_SOURCE_TO_SHARED_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $^\033[0m" + @$(CC) $(SHARED_CFLAGS) -o $@ -c $^ +endef + +$(foreach src,$(CPP_SRC_FILES),$(eval $(call CREATE_CPP_SHARED_OBJECT,$(src)))) +$(foreach src,$(CC_SRC_FILES),$(eval $(call CREATE_CC_SHARED_OBJECT,$(src)))) +$(foreach src,$(C_SRC_FILES),$(eval $(call CREATE_C_SHARED_OBJECT,$(src)))) + +print_shared_vars : + @echo SHARED_CXXFLAGS=$(SHARED_CXXFLAGS) + @echo SHARED_OBJECTS=$(SHARED_OBJECTS) + +$(LIB_OUTPUT_DIR)/$(SHARED_LIB) : $(SHARED_OBJECTS) + @echo "\033[35mBUILD $(SHARED_LIB)\033[0m" + @$(CXX) -shared $(SHARED_OBJECTS) -Wl,-soname,$(LIB_BASENAME).so.$(LIB_VERSION_X).$(LIB_VERSION_Y) -o $@ + +#build_shared_lib : print_shared_vars $(LIB_OUTPUT_DIR)/$(SHARED_LIB) +build_shared_lib : $(LIB_OUTPUT_DIR)/$(SHARED_LIB) + +################################################################ +# test +################################################################ + +CPP_SOURCE_TO_TEST_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .cpp,.oT,$(1)) +C_SOURCE_TO_TEST_OBJECT = $(LIB_OUTPUT_DIR)/$(subst .c,.oT,$(1)) + +TEST_OBJECTS := $(foreach src,$(TEST_CPP_SRC_FILES),$(call CPP_SOURCE_TO_TEST_OBJECT,$(src))) +TEST_CXXFLAGS := $(CXXFLAGS) + +define CREATE_CPP_TEST_OBJECT +$(call CPP_SOURCE_TO_TEST_OBJECT,$(1)) : $(1) + @echo "\033[32mCXX $$^\033[0m" + @install -d $$(dir $$@) + @$(CXX) $(TEST_CXXFLAGS) -o $$@ -c $$^ +endef + +$(foreach src,$(TEST_CPP_SRC_FILES),$(eval $(call CREATE_CPP_TEST_OBJECT,$(src)))) + +print_test_vars : + @echo TEST_CXXFLAGS=$(TEST_CXXFLAGS) + @echo TEST_OBJECTS=$(TEST_OBJECTS) + @echo TEST_LDFLAGS=$(TEST_LDFLAGS) + +$(LIB_OUTPUT_DIR)/test: $(TEST_OBJECTS) $(OBJECTS) + @echo "\033[35mBUILD test\033[0m" + @$(CXX) -o $@ $(TEST_OBJECTS) $(OBJECTS) $(TEST_LDFLAGS) -lgmock_main -lgmock -lgtest -lpthread + +#test : print_test_vars $(LIB_OUTPUT_DIR)/test +test : $(LIB_OUTPUT_DIR)/test + +################################################################ +# install and uninstall +################################################################ + +# install head files +SRC_HEAD_TO_INSTALL_HEAD = $(addprefix $(STAGING_DIR)/include/$(LIB_NAME)/,$(1)) + +define CREATE_INSTALL_HEAD_TARGET +$(call SRC_HEAD_TO_INSTALL_HEAD,$(1)) : $(1) + @install -Dm 640 $$^ $$@ +endef + +$(foreach src,$(HEAD_FILES),$(eval $(call CREATE_INSTALL_HEAD_TARGET,$(src)))) + +INSTALL_HEADS := $(foreach src,$(HEAD_FILES),$(call SRC_HEAD_TO_INSTALL_HEAD,$(src))) + +# install static library +ifeq ($(ENABLE_STATIC_LIB),yes) +INSTALL_STATIC_LIB := $(STAGING_DIR)/lib/$(STATIC_LIB) +$(INSTALL_STATIC_LIB) : $(LIB_OUTPUT_DIR)/$(STATIC_LIB) + @install -Dm 640 $^ $@ +endif + +# install shared library +ifeq ($(ENABLE_SHARED_LIB),yes) +INSTALL_SHARED_LIB := $(INSTALL_DIR)/lib/$(SHARED_LIB) +$(INSTALL_SHARED_LIB) : $(LIB_OUTPUT_DIR)/$(SHARED_LIB) + @install -d $(dir $@) + @cd $(dir $@); \ + rm -f $(LIB_BASENAME).so*; \ + install -Dm 750 $^ $@; \ + ln -s $(SHARED_LIB) $(LIB_BASENAME).so; \ + ln -s $(SHARED_LIB) $(LIB_BASENAME).so.$(LIB_VERSION_X).$(LIB_VERSION_Y) +endif + +install: $(INSTALL_HEADS) $(INSTALL_STATIC_LIB) $(INSTALL_SHARED_LIB) + +uninstall: + rm -rf $(STAGING_DIR)/include/$(LIB_NAME) + rm -f $(STAGING_DIR)/lib/$(LIB_BASENAME).a + rm -f $(INSTALL_DIR)/lib/$(LIB_BASENAME).so* + +################################################################ +# clean and distclean +################################################################ +clean: + -rm -f $(OBJECTS) $(SHARED_OBJECTS) $(TEST_OBJECTS) +