# renderer-shared-libs.cmake
#
# Builds libasyvulkan.so (and optionally libasyopengl.so) for Unix platforms.
# On Unix the main asy binary carries zero link-time Vulkan/OpenGL dependencies;
# instead it calls dlopen("libasyvulkan.so") at runtime via rendererloader.cc.
# This mirrors the autotools SHIMLIBS / "libasyvulkan.so" target.
#
# Included from linux-install.cmake, so ASY_BASE_INSTALL_COMPONENT and
# ASY_INSTALL_SYSDIR_VALUE are already defined.
if (NOT UNIX OR WIN32)
return()
endif()
# ── libasyvulkan.so ──────────────────────────────────────────────────────────
if (ENABLE_VULKAN)
# The renderer links the glslang:: imported targets (glslang::glslang,
# glslang::SPIRV). The main asy binary pulls glslang in via
# find_package(Vulkan COMPONENTS glslang) (-> Vulkan::glslang), which does
# not define the glslang:: targets, so request the standalone glslang CONFIG
# package here. It resolves from the same vcpkg tree already on the prefix
# path.
find_package(glslang CONFIG REQUIRED)
# Source set mirrors the autotools VULKAN_OBJS. EXRFiles, renderBase and the
# other shared renderer code are compiled into asycore (the main binary) and
# resolved from there at dlopen time via the binary's exported symbols (see
# ENABLE_EXPORTS on the asy target), so they are deliberately NOT compiled
# into the library a second time.
add_library(asyvulkan SHARED
${ASY_SRC_DIR}/vkrender.cc
${ASY_SRC_DIR}/vkdispatchstorage.cc
${ASY_SRC_DIR}/vkutils.cc
${ASY_SRC_DIR}/vulkanshim.cc
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty_impl/vk-mem-allocator_impl/src/vma_impl.cc
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty_impl/vk-mem-allocator_impl/src/vma_cxx.cc
)
# CMake automatically adds the "lib" prefix and ".so" suffix → libasyvulkan.so
#
# Build the library into the assembled base directory (the same place the
# base/*.asy files are staged). At runtime the loader finds it through the
# Asymptote search path via settings::locateFile; placing it alongside the
# base files makes `asy -dir ` resolve it from any working directory,
# mirroring the installed layout (where it lands in the sysdir next to base).
# Otherwise it would only be found when the current directory happened to be
# the build root.
set_target_properties(asyvulkan PROPERTIES
OUTPUT_NAME asyvulkan
POSITION_INDEPENDENT_CODE ON
LIBRARY_OUTPUT_DIRECTORY ${ASY_BUILD_BASE_DIR}
)
target_include_directories(asyvulkan PRIVATE
# Pull in asycore's full include set (includes GC headers from the gc subrepo target).
$
$
)
# Same macro set as asycore (includes HAVE_LIBVULKAN, HAVE_LIBGLFW, etc.)
# No -DFOR_SHARED: the renderer is not a Python bindings library.
target_compile_definitions(asyvulkan PRIVATE ${ASY_MACROS})
target_compile_options(asyvulkan PRIVATE ${ASY_COMPILE_OPTS})
target_link_libraries(asyvulkan PRIVATE
Vulkan::Vulkan
glslang::glslang
glslang::SPIRV
glfw
)
# Generated headers (e.g. asy-keywords.h) must exist before compilation.
add_dependencies(asyvulkan asy_gen_headers)
# Pull libasyvulkan.so into the default ALL build via asy-with-basefiles.
add_dependencies(asy-with-basefiles asyvulkan)
install(
TARGETS asyvulkan
LIBRARY
DESTINATION ${ASY_INSTALL_SYSDIR_VALUE}
COMPONENT ${ASY_BASE_INSTALL_COMPONENT}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE
)
endif()