xref: /aosp_15_r20/external/sandboxed-api/cmake/libcap.cmake (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1# Copyright 2019 Google LLC
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15FetchContent_Declare(libcap
16  URL      https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.27.tar.gz
17  URL_HASH SHA256=260b549c154b07c3cdc16b9ccc93c04633c39f4fb6a4a3b8d1fa5b8a9c3f5fe8
18)
19FetchContent_MakeAvailable(libcap)
20
21set(libcap_INCLUDE_DIR "${libcap_SOURCE_DIR}/libcap/include")
22
23add_custom_command(OUTPUT ${libcap_SOURCE_DIR}/libcap/cap_names.list.h
24  VERBATIM
25  COMMAND # Use the same logic as libcap/Makefile
26  sed -ne [=[/^#define[ \\t]CAP[_A-Z]\+[ \\t]\+[0-9]\+/{s/^#define \([^ \\t]*\)[ \\t]*\([^ \\t]*\)/\{\"\1\",\2\},/p;}]=]
27      ${libcap_SOURCE_DIR}/libcap/include/uapi/linux/capability.h |
28  tr [:upper:] [:lower:] > ${libcap_SOURCE_DIR}/libcap/cap_names.list.h
29)
30
31if (CMAKE_CROSSCOMPILING AND BUILD_C_COMPILER)
32  add_custom_command(OUTPUT ${libcap_SOURCE_DIR}/libcap/libcap_makenames
33    VERBATIM
34    # Use the same logic as libcap/Makefile
35    COMMAND ${BUILD_C_COMPILER} ${BUILD_C_FLAGS}
36                ${libcap_SOURCE_DIR}/libcap/_makenames.c
37                -o ${libcap_SOURCE_DIR}/libcap/libcap_makenames
38    DEPENDS ${libcap_SOURCE_DIR}/libcap/cap_names.list.h
39            ${libcap_SOURCE_DIR}/libcap/_makenames.c
40  )
41
42  add_custom_command(OUTPUT ${libcap_SOURCE_DIR}/libcap/cap_names.h
43    COMMAND ${libcap_SOURCE_DIR}/libcap/libcap_makenames >
44                ${libcap_SOURCE_DIR}/libcap/cap_names.h
45    DEPENDS ${libcap_SOURCE_DIR}/libcap/libcap_makenames
46  )
47else()
48  add_executable(libcap_makenames
49    ${libcap_SOURCE_DIR}/libcap/cap_names.list.h
50    ${libcap_SOURCE_DIR}/libcap/_makenames.c
51  )
52
53  target_include_directories(libcap_makenames PUBLIC
54    ${libcap_SOURCE_DIR}/libcap
55    ${libcap_SOURCE_DIR}/libcap/include
56    ${libcap_SOURCE_DIR}/libcap/include/uapi
57  )
58
59  add_custom_command(OUTPUT ${libcap_SOURCE_DIR}/libcap/cap_names.h
60    COMMAND libcap_makenames > ${libcap_SOURCE_DIR}/libcap/cap_names.h
61  )
62endif()
63
64add_library(cap STATIC
65  ${libcap_SOURCE_DIR}/libcap/cap_alloc.c
66  ${libcap_SOURCE_DIR}/libcap/cap_extint.c
67  ${libcap_SOURCE_DIR}/libcap/cap_file.c
68  ${libcap_SOURCE_DIR}/libcap/cap_flag.c
69  ${libcap_SOURCE_DIR}/libcap/cap_names.h
70  ${libcap_SOURCE_DIR}/libcap/cap_proc.c
71  ${libcap_SOURCE_DIR}/libcap/cap_text.c
72  ${libcap_SOURCE_DIR}/libcap/include/uapi/linux/capability.h
73  ${libcap_SOURCE_DIR}/libcap/libcap.h
74)
75add_library(libcap::libcap ALIAS cap)
76target_include_directories(cap PUBLIC
77  ${libcap_SOURCE_DIR}/libcap
78  ${libcap_SOURCE_DIR}/libcap/include
79  ${libcap_SOURCE_DIR}/libcap/include/uapi
80)
81target_compile_options(cap PRIVATE
82  -Wno-tautological-compare
83  -Wno-unused-result
84)
85target_compile_definitions(cap PRIVATE
86  # Work around sys/xattr.h not declaring this
87  -DXATTR_NAME_CAPS="\"security.capability\""
88)
89target_link_libraries(cap PRIVATE
90  sapi::base
91)
92