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