Skip to content

Commit a3e5be6

Browse files
committed
build: CMake产出stackplz_all并由build.sh直接调用
- CMakeLists 新增 STACKPLZ_BUILD_ALL 与 stackplz_all 目标,统一输出目录到 <build>/lib|bin\n- 新增 stackplz_static 静态目标,stackplz_all 使用 CMAKE_AR(MRI) 合并依赖库\n- build.sh 精简为配置 + 构建 stackplz_all,不再手工合并归档\n- build.sh 支持 ANDROID_NDK_ROOT/NDK_ROOT/ANDROID_NDK 与 abi/api 参数透传
1 parent 71ee890 commit a3e5be6

2 files changed

Lines changed: 84 additions & 12 deletions

File tree

CMakeLists.txt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ project("stackplz")
33

44
enable_language(C CXX ASM)
55

6+
option(STACKPLZ_BUILD_ALL "Build merged static archive libstackplz_all.a" ON)
7+
68
set(CMAKE_CXX_STANDARD 20)
79
set(CMAKE_C_STANDARD 11)
810

11+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
12+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
13+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
14+
915
set(C_FLAGS "-Wall -Wextra -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -flto=thin -ffunction-sections -fdata-sections")
1016
set(LINKER_FLAGS "-fuse-ld=lld -flto=thin -ffixed-x18 -Wl,--hash-style=both -Wl,--unresolved-symbols=ignore-all -Wl,--gc-sections")
1117

@@ -192,6 +198,52 @@ target_include_directories(unwindstack
192198
target_compile_options(unwindstack PRIVATE -Wno-c99-designator)
193199
target_compile_definitions(unwindstack PRIVATE DEXFILE_SUPPORT=1)
194200

201+
add_library(stackplz_static STATIC lib.cpp)
202+
set_target_properties(stackplz_static PROPERTIES OUTPUT_NAME stackplz)
203+
target_include_directories(stackplz_static PUBLIC ${EXTERNAL_SRC}/libbase/include)
204+
target_include_directories(stackplz_static PUBLIC ${EXTERNAL_SRC}/bionic/libc/kernel/uapi)
205+
target_include_directories(stackplz_static PUBLIC ${EXTERNAL_SRC}/unwinding/libunwindstack/include)
206+
target_compile_definitions(stackplz_static PRIVATE DEXFILE_SUPPORT=1)
207+
target_link_libraries(stackplz_static base procinfo lzma dexfile_support unwindstack log)
208+
209+
if (STACKPLZ_BUILD_ALL)
210+
set(STACKPLZ_ALL_ARCHIVE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/libstackplz_all.a")
211+
set(STACKPLZ_ALL_MRI "${CMAKE_CURRENT_BINARY_DIR}/stackplz_all.mri")
212+
set(STACKPLZ_ALL_AR_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/stackplz_all_ar.cmake")
213+
214+
string(CONCAT STACKPLZ_ALL_MRI_CONTENT
215+
"CREATE ${STACKPLZ_ALL_ARCHIVE}\n"
216+
"ADDLIB $<TARGET_FILE:stackplz_static>\n"
217+
"ADDLIB $<TARGET_FILE:base>\n"
218+
"ADDLIB $<TARGET_FILE:procinfo>\n"
219+
"ADDLIB $<TARGET_FILE:lzma>\n"
220+
"ADDLIB $<TARGET_FILE:dexfile_support>\n"
221+
"ADDLIB $<TARGET_FILE:unwindstack>\n"
222+
"SAVE\n"
223+
"END\n")
224+
file(GENERATE OUTPUT "${STACKPLZ_ALL_MRI}" CONTENT "${STACKPLZ_ALL_MRI_CONTENT}")
225+
226+
string(CONCAT STACKPLZ_ALL_AR_SCRIPT_CONTENT
227+
"execute_process(\n"
228+
" COMMAND \"${CMAKE_AR}\" -M\n"
229+
" INPUT_FILE \"${STACKPLZ_ALL_MRI}\"\n"
230+
" RESULT_VARIABLE stackplz_all_ret\n"
231+
")\n"
232+
"if(NOT stackplz_all_ret EQUAL 0)\n"
233+
" message(FATAL_ERROR \"failed to generate ${STACKPLZ_ALL_ARCHIVE}, ar return=${stackplz_all_ret}\")\n"
234+
"endif()\n")
235+
file(GENERATE OUTPUT "${STACKPLZ_ALL_AR_SCRIPT}" CONTENT "${STACKPLZ_ALL_AR_SCRIPT_CONTENT}")
236+
237+
add_custom_command(
238+
OUTPUT "${STACKPLZ_ALL_ARCHIVE}"
239+
DEPENDS stackplz_static base procinfo lzma dexfile_support unwindstack
240+
COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}"
241+
COMMAND "${CMAKE_COMMAND}" -P "${STACKPLZ_ALL_AR_SCRIPT}"
242+
VERBATIM
243+
)
244+
add_custom_target(stackplz_all DEPENDS "${STACKPLZ_ALL_ARCHIVE}")
245+
endif ()
246+
195247
# check are we top-level project
196248
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
197249

build.sh

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,37 @@
1-
#/bin/bash
1+
#!/usr/bin/env bash
2+
set -euo pipefail
23

3-
export ANDROID_NDK=/home/kali/Desktop/android-ndk-r25b
4+
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
45

5-
rm -r build
6-
mkdir build && cd build
6+
NDK_ROOT="${ANDROID_NDK_ROOT:-${NDK_ROOT:-${ANDROID_NDK:-}}}"
7+
if [[ -z "${NDK_ROOT}" ]]; then
8+
echo "ANDROID_NDK_ROOT/NDK_ROOT/ANDROID_NDK is required" >&2
9+
exit 1
10+
fi
711

8-
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
9-
-DANDROID=1 \
10-
-DANDROID_ABI="arm64-v8a" \
11-
-DANDROID_NDK=$ANDROID_NDK \
12-
-DANDROID_PLATFORM=android-30 \
13-
..
12+
ABI="${STACKPLZ_PRELOAD_ABI:-arm64-v8a}"
13+
API_LEVEL="${STACKPLZ_PRELOAD_API_LEVEL:-29}"
14+
BUILD_DIR="${UNWINDDAEMON_BUILD_DIR:-$ROOT_DIR/build/android-${ABI}-api${API_LEVEL}}"
15+
JOBS="${JOBS:-$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 8)}"
1416

15-
make
17+
cmake -S "$ROOT_DIR" -B "$BUILD_DIR" \
18+
-DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \
19+
-DANDROID=1 \
20+
-DANDROID_ABI="$ABI" \
21+
-DANDROID_NDK="$NDK_ROOT" \
22+
-DANDROID_PLATFORM="android-${API_LEVEL}" \
23+
-DCMAKE_BUILD_TYPE=Release \
24+
-DSTACKPLZ_BUILD_ALL=ON \
25+
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$BUILD_DIR/lib" \
26+
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$BUILD_DIR/lib" \
27+
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY="$BUILD_DIR/bin"
1628

17-
cd ..
29+
cmake --build "$BUILD_DIR" --target stackplz_all -j"$JOBS"
30+
31+
LIB_DIR="$BUILD_DIR/lib"
32+
OUT_ARCHIVE="$LIB_DIR/libstackplz_all.a"
33+
if [[ ! -f "$OUT_ARCHIVE" ]]; then
34+
echo "missing merged archive: $OUT_ARCHIVE" >&2
35+
exit 1
36+
fi
37+
echo "built: $OUT_ARCHIVE"

0 commit comments

Comments
 (0)