diff mbox series

[4/5] kernel-shark: Split the installation in two components

Message ID 20210105155453.41228-5-y.karadz@gmail.com (mailing list archive)
State Accepted
Commit 2e284c605acf365bac755c3e26733a63ae8f6863
Headers show
Series kernel-shark: Improve the build system | expand

Commit Message

Yordan Karadzhov Jan. 5, 2021, 3:54 p.m. UTC
The user can choose to install only the KernelShark GUI via
"install_gui.sh". It is also possible to install the library headers
and this can be done via "install_libkshark-devel.sh".

The changes implemented in this patch are inspired by the talk
"Deep CMake For Library Authors" presented at CppCon 2019 by Craig Scott.
https://crascit.com/2019/10/16/cppcon-2019-deep-cmake-for-library-authors/

Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
 CMakeLists.txt                   |  2 +-
 build/cmake_uninstall.sh         | 23 ++++++++++----
 build/install_gui.sh             |  1 +
 build/install_libkshark-devel.sh |  1 +
 src/CMakeLists.txt               | 53 ++++++++++++++++++++++++++------
 src/plugins/CMakeLists.txt       |  3 +-
 6 files changed, 65 insertions(+), 18 deletions(-)
 create mode 100755 build/install_gui.sh
 create mode 100755 build/install_libkshark-devel.sh

Comments

Steven Rostedt Jan. 5, 2021, 9:29 p.m. UTC | #1
On Tue,  5 Jan 2021 17:54:52 +0200
"Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:

> The user can choose to install only the KernelShark GUI via
> "install_gui.sh". It is also possible to install the library headers
> and this can be done via "install_libkshark-devel.sh".
> 
> The changes implemented in this patch are inspired by the talk
> "Deep CMake For Library Authors" presented at CppCon 2019 by Craig Scott.
> https://crascit.com/2019/10/16/cppcon-2019-deep-cmake-for-library-authors/
> 

I applied the series. But is there a way to install in a specific directory
and not in the system directories? (I didn't watch the talk).

For example, I can do:

 $ mkdir /tmp/install
 $ make DESTDIR=/tmp/install/ install

for libtraceveent, libtracefs and trace-cmd / libtracecmd and it will
install into /tmp/install/... just like it would have installed in /. The
big difference is, I don't need to be root to run that command.

Then what I can do is:

 $ cd /tmp/install
 $ tar -cvjf ../package.tar.bz2 .
 $ scp ../package.tar.bz2 root@somebox:/tmp
 $ ssh root@somebox
 # cd /
 # tar -xvjf /tmp/package.tar.bz2

And that would have installed the package on to the machine "somebox".

-- Steve
Yordan Karadzhov Jan. 6, 2021, 11:20 a.m. UTC | #2
Hi Steven,

On 5.01.21 г. 23:29 ч., Steven Rostedt wrote:
> On Tue,  5 Jan 2021 17:54:52 +0200
> "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:
> 
>> The user can choose to install only the KernelShark GUI via
>> "install_gui.sh". It is also possible to install the library headers
>> and this can be done via "install_libkshark-devel.sh".
>>
>> The changes implemented in this patch are inspired by the talk
>> "Deep CMake For Library Authors" presented at CppCon 2019 by Craig Scott.
>> https://crascit.com/2019/10/16/cppcon-2019-deep-cmake-for-library-authors/
>>
> 
> I applied the series. But is there a way to install in a specific directory
> and not in the system directories? (I didn't watch the talk).
> 
> For example, I can do:
> 
>   $ mkdir /tmp/install
>   $ make DESTDIR=/tmp/install/ install
> 
> for libtraceveent, libtracefs and trace-cmd / libtracecmd and it will
> install into /tmp/install/... just like it would have installed in /. The
> big difference is, I don't need to be root to run that command.
> 

Yes, we have a similar functionality since the very beginning of KS 1.0 
and it is not been changed here. You can specify the install destination 
using a cmake command line argument like this:

cmake -D_INSTALL_PREFIX=/tmp/install/ ..

All this is documented in the README file. The only difference is that 
in your case you provide the destination at the very end when you do 
"make install", while here it has to be done at the very beginning when 
you call cmake.

Note that the two new helper scripts (install_gui.sh and 
install_libkshark-devel.sh) can be used instead of "sudo make install" 
but this is needed only if you want to split the installation. A normal 
"make install" will just install everything.

However, you are right that it is probably better if we remove the sudo 
from the two helper scripts.

Thanks!
Yordan


> Then what I can do is:
> 
>   $ cd /tmp/install
>   $ tar -cvjf ../package.tar.bz2 .
>   $ scp ../package.tar.bz2 root@somebox:/tmp
>   $ ssh root@somebox
>   # cd /
>   # tar -xvjf /tmp/package.tar.bz2
> 
> And that would have installed the package on to the machine "somebox".
> 
> -- Steve
>
diff mbox series

Patch

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 543d7da..9abacd0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -86,7 +86,7 @@  set(KS_ICON_FIN    KS_icon_fin.svg)
 set(KS_LOGO        KS_logo_symbol.svg)
 set(KS_LOGO_LABEL  KS_logo_horizontal.svg)
 
-set(CMAKE_INSTALL_RPATH "${_LIBDIR}")
+set(CMAKE_INSTALL_RPATH "${_LIBDIR}" "$ORIGIN")
 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
 
 if (CMAKE_BUILD_TYPE MATCHES Package)
diff --git a/build/cmake_uninstall.sh b/build/cmake_uninstall.sh
index ae9eab5..0d93a8d 100755
--- a/build/cmake_uninstall.sh
+++ b/build/cmake_uninstall.sh
@@ -4,14 +4,25 @@  CYAN='\e[36m'
 PURPLE='\e[35m'
 NC='\e[0m' # No Color
 
+uninstall () {
+    NAME=$1
+    NAME=${NAME##*_}
+    NAME=${NAME%.*}
+    NAME=${NAME/manifest/the project}
+    if [ -e $1 ]
+    then
+        echo -e "${CYAN}Uninstall " $NAME"...${NC}"
+        xargs rm -v < $1
+        rm -f $1
+    fi
+}
+
 if [[ $EUID -ne 0 ]]; then
    echo -e "${PURPLE}Permission denied${NC}" 1>&2
    exit 100
 fi
 
-if [ -e install_manifest.txt ]
-then
-    echo -e "${CYAN}Uninstall the project...${NC}"
-    xargs rm -v < install_manifest.txt
-    rm -f install_manifest.txt
-fi
+for manifest in "$search_dir"${PWD}/install_manifest*
+do
+   uninstall $manifest
+done
diff --git a/build/install_gui.sh b/build/install_gui.sh
new file mode 100755
index 0000000..1583fb9
--- /dev/null
+++ b/build/install_gui.sh
@@ -0,0 +1 @@ 
+sudo cmake -DCOMPONENT=kernelshark -P cmake_install.cmake
diff --git a/build/install_libkshark-devel.sh b/build/install_libkshark-devel.sh
new file mode 100755
index 0000000..a7e420d
--- /dev/null
+++ b/build/install_libkshark-devel.sh
@@ -0,0 +1 @@ 
+sudo cmake -DCOMPONENT=libkshark-devel -P cmake_install.cmake
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fe3a3eb..e35b436 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,7 @@ 
 message("\n src ...")
 
+set(KS_INCLUDS_DESTINATION "${_INSTALL_PREFIX}/include/${KS_APP_NAME}")
+
 message(STATUS "libkshark")
 add_library(kshark SHARED libkshark.c
                           libkshark-hash.c
@@ -15,9 +17,25 @@  target_link_libraries(kshark trace::cmd
                              jsonc::jsonc
                              ${CMAKE_DL_LIBS})
 
-set_target_properties(kshark  PROPERTIES SUFFIX	".so.${KS_VERSION_STRING}")
+set_target_properties(kshark  PROPERTIES
+                                  SOVERSION ${KS_VERSION_MAJOR}
+                                  VERSION   ${KS_VERSION_STRING})
+
+
+install(TARGETS kshark
+        LIBRARY DESTINATION    ${_LIBDIR}
+            COMPONENT              kernelshark
+            NAMELINK_COMPONENT     libkshark-devel
+        INCLUDES DESTINATION   ${_INSTALL_PREFIX}/include/${KS_APP_NAME}
+            COMPONENT              libkshark-devel
+        ARCHIVE DESTINATION    ${_LIBDIR}
+            COMPONENT              libkshark-devel)
 
-install(TARGETS kshark LIBRARY DESTINATION ${_LIBDIR})
+install(FILES "${KS_DIR}/src/libkshark.h"
+              "${KS_DIR}/src/libkshark-model.h"
+              "${KS_DIR}/src/libkshark-plugin.h"
+        DESTINATION ${KS_INCLUDS_DESTINATION}
+            COMPONENT libkshark-devel)
 
 if (OPENGL_FOUND)
 
@@ -29,9 +47,18 @@  if (OPENGL_FOUND)
                                        ${GLUT_LIBRARY}
                                        ${OPENGL_LIBRARIES})
 
-    set_target_properties(kshark-plot PROPERTIES  SUFFIX ".so.${KS_VERSION_STRING}")
+    set_target_properties(kshark-plot PROPERTIES
+                                          SOVERSION ${KS_VERSION_MAJOR}
+                                          VERSION   ${KS_VERSION_STRING})
 
-    install(TARGETS kshark-plot LIBRARY DESTINATION ${_LIBDIR})
+    install(TARGETS kshark-plot
+            LIBRARY DESTINATION    ${_LIBDIR}
+                COMPONENT              kernelshark
+                NAMELINK_COMPONENT     libkshark-devel
+            INCLUDES DESTINATION   ${_INSTALL_PREFIX}/include/${KS_APP_NAME}
+                COMPONENT              libkshark-devel
+            ARCHIVE DESTINATION    ${_LIBDIR}
+                COMPONENT              libkshark-devel)
 
 endif (OPENGL_FOUND)
 
@@ -83,21 +110,27 @@  if (Qt5Widgets_FOUND AND Qt5Network_FOUND)
     target_link_libraries(kshark-record kshark-gui)
 
     install(TARGETS ${KS_APP_NAME} kshark-record kshark-gui
-            RUNTIME DESTINATION ${_INSTALL_PREFIX}/bin/
-            LIBRARY DESTINATION ${_LIBDIR})
+            RUNTIME DESTINATION       ${_INSTALL_PREFIX}/bin/
+                COMPONENT                 kernelshark
+            LIBRARY DESTINATION       ${_LIBDIR}
+                COMPONENT                 kernelshark)
 
     install(FILES "${KS_DIR}/${KS_APP_NAME}.desktop"
-            DESTINATION ${_INSTALL_PREFIX}/share/applications/)
+            DESTINATION ${_INSTALL_PREFIX}/share/applications/
+                COMPONENT                 kernelshark)
 
     install(FILES "${KS_DIR}/icons/${KS_ICON}"
                   "${KS_DIR}/icons/${KS_ICON_FIN}"
-            DESTINATION ${_INSTALL_PREFIX}/share/icons/${KS_APP_NAME})
+            DESTINATION ${_INSTALL_PREFIX}/share/icons/${KS_APP_NAME}
+                COMPONENT                 kernelshark)
 
     install(FILES "${KS_DIR}/org.freedesktop.kshark-record.policy"
-            DESTINATION /usr/share/polkit-1/actions/)
+            DESTINATION /usr/share/polkit-1/actions/
+                COMPONENT                 kernelshark)
 
     install(PROGRAMS "${KS_DIR}/bin/kshark-su-record"
-            DESTINATION ${_INSTALL_PREFIX}/bin/)
+            DESTINATION ${_INSTALL_PREFIX}/bin/
+                COMPONENT                 kernelshark)
 
 endif (Qt5Widgets_FOUND AND Qt5Network_FOUND)
 
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index 6c77179..2da73f8 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -28,6 +28,7 @@  BUILD_PLUGIN(NAME missed_events
 list(APPEND PLUGIN_LIST "missed_events default") # This plugin will be loaded by default
 
 install(TARGETS sched_events missed_events
-        LIBRARY DESTINATION ${KS_PLUGIN_INSTALL_PREFIX})
+        LIBRARY DESTINATION ${KS_PLUGIN_INSTALL_PREFIX}
+        COMPONENT kernelshark)
 
 set(PLUGINS ${PLUGIN_LIST} PARENT_SCOPE)