From 31a112aa23c639c00c9d25c6793bf0a4308d2d00 Mon Sep 17 00:00:00 2001 From: Gavin Hayes Date: Mon, 30 Oct 2023 19:35:41 -0400 Subject: [PATCH 1/2] feat: static libextism-cpp target --- CMakeLists.txt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3bc97b..f0538e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,10 @@ link_directories(/opt/homebrew/lib) # extism-cpp library project(extism-cpp VERSION 1.0.0 DESCRIPTION "C++ bindings for libextism") -add_library(extism-cpp SHARED src/manifest.cpp src/current_plugin.cpp src/plugin.cpp src/function.cpp src/extism.cpp) +set(extism-cpp-srcs src/manifest.cpp src/current_plugin.cpp src/plugin.cpp src/function.cpp src/extism.cpp) + +# SHARED +add_library(extism-cpp SHARED ${extism-cpp-srcs}) set_target_properties(extism-cpp PROPERTIES VERSION ${PROJECT_VERSION}) set_target_properties(extism-cpp PROPERTIES PUBLIC_HEADER src/extism.hpp) target_include_directories(extism-cpp PUBLIC src) @@ -15,7 +18,15 @@ target_link_libraries(extism-cpp PUBLIC extism jsoncpp) set_target_properties(extism-cpp PROPERTIES NO_SONAME 1 ) -install(TARGETS extism-cpp + +# STATIC +add_library(extism-cpp-static STATIC ${extism-cpp-srcs}) +set_target_properties(extism-cpp-static PROPERTIES VERSION ${PROJECT_VERSION}) +set_target_properties(extism-cpp-static PROPERTIES PUBLIC_HEADER src/extism.hpp) +target_include_directories(extism-cpp-static PUBLIC src) +target_link_libraries(extism-cpp-static PUBLIC extism jsoncpp) + +install(TARGETS extism-cpp extism-cpp-static LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) From fe7a4e4b08d15f0edc7788879b4c43cbf726cdb3 Mon Sep 17 00:00:00 2001 From: Gavin Hayes Date: Thu, 2 Nov 2023 22:26:01 -0400 Subject: [PATCH 2/2] feat: pkg-config, linking all but system libs statically --- CMakeLists.txt | 23 +++++++++++++++++++++-- README.md | 25 +++++++++++++++++++++++++ extism-cpp-static.pc.in | 10 ++++++++++ extism-cpp.pc.in | 10 ++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 extism-cpp-static.pc.in create mode 100644 extism-cpp.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index f0538e4..26e9fa9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,17 +18,26 @@ target_link_libraries(extism-cpp PUBLIC extism jsoncpp) set_target_properties(extism-cpp PROPERTIES NO_SONAME 1 ) +configure_file(extism-cpp.pc.in extism-cpp.pc @ONLY) # STATIC add_library(extism-cpp-static STATIC ${extism-cpp-srcs}) +set_target_properties(extism-cpp-static PROPERTIES OUTPUT_NAME extism-cpp) set_target_properties(extism-cpp-static PROPERTIES VERSION ${PROJECT_VERSION}) set_target_properties(extism-cpp-static PROPERTIES PUBLIC_HEADER src/extism.hpp) target_include_directories(extism-cpp-static PUBLIC src) -target_link_libraries(extism-cpp-static PUBLIC extism jsoncpp) +target_link_libraries(extism-cpp-static PUBLIC libextism.a jsoncpp) +configure_file(extism-cpp-static.pc.in extism-cpp-static.pc @ONLY) -install(TARGETS extism-cpp extism-cpp-static +include(GNUInstallDirs) +install(TARGETS extism-cpp LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(TARGETS extism-cpp-static + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/extism-cpp.pc ${CMAKE_CURRENT_BINARY_DIR}/extism-cpp-static.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) # Example add_executable( @@ -40,6 +49,16 @@ target_link_libraries( extism-cpp ) +# Static-ish example +add_executable( + example-static + example.cpp +) +target_link_libraries( + example-static + extism-cpp-static +) + # Tests enable_testing() add_executable( diff --git a/README.md b/README.md index a6a295c..7bc491f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,18 @@ C++ Host SDK for Extism - Debian: `sudo apt install libjsoncpp-dev` - macOS: `brew install jsoncpp` +If you wish to link libextism-cpp with its deps statically, to make a binary +with only system deps, instead of installing `jsoncpp` from your system +package manager, you must build and install it from source. This is needed to +get the static library `libjsoncpp.a`. + +```shell +git clone https://github.com/open-source-parsers/jsoncpp +cd jsoncpp +cmake -B build && cmake --build build -j +make -C build install +``` + ## Building ```shell @@ -38,3 +50,16 @@ After building, run the following from the build directory: $ sudo make install ``` +## Usage + +After installing, `pkg-config` may be used to get needed linking flags. + +### Dynamic +```shell +$ pkg-config --libs extism-cpp +``` + +### Static +```shell +$ pkg-config --static --libs extism-cpp-static +``` diff --git a/extism-cpp-static.pc.in b/extism-cpp-static.pc.in new file mode 100644 index 0000000..3acab80 --- /dev/null +++ b/extism-cpp-static.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include +Version: @PROJECT_VERSION@ +Name: Extism cpp-sdk +Description: C++ Host SDK for Extism +Requires.private: extism-static +Libs: -L${libdir} -l:libextism-cpp.a -l:libjsoncpp.a +Cflags: -I${includedir} diff --git a/extism-cpp.pc.in b/extism-cpp.pc.in new file mode 100644 index 0000000..728fde8 --- /dev/null +++ b/extism-cpp.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include +Version: @PROJECT_VERSION@ +Name: Extism cpp-sdk +Description: C++ Host SDK for Extism +Requires.private: extism +Libs: -L${libdir} -lextism-cpp -ljsoncpp +Cflags: -I${includedir}