Skip to content

Commit cfa1d14

Browse files
committed
build: start working on statically linking libmpv
1 parent 42071d3 commit cfa1d14

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

native/CMakeLists.txt

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ project(${PROJECT_NAME} LANGUAGES CXX)
2323
set(CMAKE_CXX_STANDARD 20)
2424
set(CMAKE_CXX_STANDARD_REQUIRED ON)
2525
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
26-
option(USE_SYSTEM_FFMPEG "Link dynamically against system ffmpeg instead of using static prebuilt libraries" ON)
26+
option(USE_SYSTEM_FFMPEG "Link dynamically against system ffmpeg instead of using static prebuilt libraries" OFF)
27+
option(USE_SYSTEM_MPV "Link dynamically against system mpv instead of using static prebuilt libraries" OFF)
2728

2829
include(ExternalProject)
2930
if (NOT USE_SYSTEM_FFMPEG)
3031
include(thirdparty/ffmpeg.cmake)
3132
endif ()
33+
if (NOT USE_SYSTEM_MPV)
34+
include(thirdparty/mpv.cmake)
35+
endif ()
3236

3337
set(SOURCES
3438
src/cpp/util/Errors.cpp
@@ -51,22 +55,30 @@ target_include_directories(${PROJECT_NAME} PRIVATE "src/cpp/")
5155

5256
message(STATUS "JAVA_HOME: ${JAVA_HOME}")
5357
target_include_directories(${PROJECT_NAME} PUBLIC "${JAVA_HOME}/include")
54-
#if (NOT USE_SYSTEM_FFMPEG)
55-
# target_link_libraries(${PROJECT_NAME} PUBLIC -Wl,--push-state,--whole-archive,--allow-multiple-definition ffmpeg -Wl,--pop-state)
56-
# add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND objcopy --localize-hidden --strip-all --strip-unneeded $<TARGET_FILE:${PROJECT_NAME}>)
57-
#endif ()
58+
if (NOT USE_SYSTEM_FFMPEG)
59+
target_link_libraries(${PROJECT_NAME} PUBLIC -Wl,--push-state,--whole-archive,--allow-multiple-definition ffmpeg -Wl,--pop-state)
60+
endif ()
61+
if (NOT USE_SYSTEM_MPV)
62+
target_link_libraries(${PROJECT_NAME} PUBLIC -Wl,--push-state,--whole-archive,--allow-multiple-definition mpv -Wl,--pop-state)
63+
endif ()
64+
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND objcopy --localize-hidden --strip-all --strip-unneeded $<TARGET_FILE:${PROJECT_NAME}>)
5865

5966
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
6067
target_compile_definitions(${PROJECT_NAME} PRIVATE -D_LINUX)
6168
find_package(PkgConfig REQUIRED)
62-
pkg_check_modules(GL REQUIRED IMPORTED_TARGET gl egl libva libva-drm libdrm glx libva-glx)
63-
pkg_check_modules(MPV REQUIRED IMPORTED_TARGET mpv)
64-
target_link_libraries(${PROJECT_NAME} PUBLIC PkgConfig::GL PkgConfig::MPV)
69+
pkg_check_modules(GL REQUIRED IMPORTED_TARGET egl glx)
70+
target_link_libraries(${PROJECT_NAME} PUBLIC PkgConfig::GL)
6571
target_include_directories(${PROJECT_NAME} PUBLIC "${JAVA_HOME}/include/linux")
66-
# if (USE_SYSTEM_FFMPEG)
67-
# pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil libswscale libavfilter)
68-
# target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::FFMPEG)
69-
# endif ()
72+
add_compile_options(-static -static-libstdc++ -static-libgcc)
73+
add_link_options(-static -static-libstdc++ -static-libgcc)
74+
if (USE_SYSTEM_FFMPEG)
75+
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil libswscale libavfilter)
76+
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::FFMPEG)
77+
endif ()
78+
if (USE_SYSTEM_MPV)
79+
pkg_check_modules(MPV REQUIRED IMPORTED_TARGET mpv)
80+
target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::MPV)
81+
endif ()
7082
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
7183
target_compile_definitions(${PROJECT_NAME} PRIVATE -D_WINDOWS)
7284
target_link_libraries(${PROJECT_NAME} PUBLIC opengl32 dxgi d3d11 d3dcompiler)

native/src/cpp/mpv/MPV.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,6 @@ JNIEXPORT jobject JNICALL Java_dev_silenium_multimedia_core_mpv_MPVKt_createRend
590590
return nullptr;
591591
}
592592

593-
// TODO: Fix crash here during renderer disposal
594593
const auto glProcMethod = jni_env->GetMethodID(jni_env->GetObjectClass(javaRender), "getGlProc", "(Ljava/lang/String;)J");
595594
if (glProcMethod == nullptr) {
596595
std::cerr << "Method not found: getGlProc" << std::endl;
@@ -601,7 +600,6 @@ JNIEXPORT jobject JNICALL Java_dev_silenium_multimedia_core_mpv_MPVKt_createRend
601600
const auto ret = jni_env->CallLongMethod(javaRender, glProcMethod, nameStr);
602601
jni_env->DeleteLocalRef(nameStr);
603602
jvm->DetachCurrentThread();
604-
// const auto ret = glXGetProcAddress(reinterpret_cast<const GLubyte *>(name));
605603
return reinterpret_cast<void *>(ret);
606604
}),
607605
.get_proc_address_ctx = object,

native/thirdparty/mpv.cmake

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
add_library(mpv STATIC IMPORTED)
2+
if (NOT DEFINED MPV_A_LOCATION)
3+
set(MPV_URL "https://reposilite.silenium.dev/releases/dev/silenium/libs/mpv/mpv-natives-${MPV_PLATFORM}${MPV_PLATFORM_EXTENSION}/${MPV_VERSION}/mpv-natives-${MPV_PLATFORM}${MPV_PLATFORM_EXTENSION}-${MPV_VERSION}.zip")
4+
set(MPV_URL_SHA256 "https://reposilite.silenium.dev/releases/dev/silenium/libs/mpv/mpv-natives-${MPV_PLATFORM}${MPV_PLATFORM_EXTENSION}/${MPV_VERSION}/mpv-natives-${MPV_PLATFORM}${MPV_PLATFORM_EXTENSION}-${MPV_VERSION}.zip.sha256")
5+
set(MPV_PREFIX "${CMAKE_BINARY_DIR}/mpv")
6+
message(STATUS "Downloading mpv from ${MPV_URL}")
7+
8+
file(DOWNLOAD "${MPV_URL_SHA256}" "${CMAKE_BINARY_DIR}/mpv.zip.sha256")
9+
file(READ "${CMAKE_BINARY_DIR}/mpv.zip.sha256" MPV_SHA256)
10+
file(DOWNLOAD "${MPV_URL}" "${CMAKE_BINARY_DIR}/mpv.zip" EXPECTED_HASH SHA256=${MPV_SHA256} SHOW_PROGRESS)
11+
file(ARCHIVE_EXTRACT INPUT "${CMAKE_BINARY_DIR}/mpv.zip" DESTINATION "${MPV_PREFIX}")
12+
13+
set(MPV_INCLUDE_DIR "${MPV_PREFIX}/include")
14+
set(MPV_LIB_DIR "${MPV_PREFIX}/lib")
15+
set_target_properties(mpv PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/libmpv.a")
16+
target_include_directories(mpv INTERFACE "${MPV_INCLUDE_DIR}")
17+
else ()
18+
set_target_properties(mpv PROPERTIES IMPORTED_LOCATION "${MPV_A_LOCATION}")
19+
endif ()
20+
21+
target_link_options(mpv INTERFACE "-Wl,-Bsymbolic")

0 commit comments

Comments
 (0)