From 168f02fd972fcd575b831313137e97ffbcac8205 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 21 Apr 2026 14:49:59 +0200 Subject: [PATCH 1/9] Added basic BUILD_SHARED_LIBS support --- .gitignore | 1 + CMakeLists.txt | 25 +++++++++++++++++++++---- transcoder/basisu.h | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 93524df8..2ce24238 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build/ # VS project and working files *.vcxproj.user .vs/ +.vscode/ Debug/ Release/ x64/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 23ccb14b..96dcb6bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,7 @@ if (BASISU_BUILD_WASM) set(BASISU_SAN OFF CACHE BOOL "" FORCE) endif() +message("Initial BUILD_SHARED_LIBS=${BUILD_SHARED_LIBSf}") message("Initial CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") message("Initial BASISU_BUILD_X64=${BASISU_BUILD_X64}") message("Initial BASISU_BUILD_WASM=${BASISU_BUILD_WASM}") @@ -305,14 +306,30 @@ if (BASISU_ZSTD) set(ENCODER_LIB_SRC_LIST ${ENCODER_LIB_SRC_LIST} zstd/zstd.c) endif() -# Create the static library -add_library(basisu_encoder STATIC ${ENCODER_LIB_SRC_LIST}) +# Create the library +add_library(basisu_encoder ${ENCODER_LIB_SRC_LIST}) -# Create the basisu executable and link against the static library +include(GenerateExportHeader) +generate_export_header(basisu_encoder) + +if (BUILD_SHARED_LIBS) + set_target_properties(basisu_encoder PROPERTIES + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN 1 + # Empty string sets values to cmake default + RUNTIME_OUTPUT_DIRECTORY "" # .dll + ARCHIVE_OUTPUT_DIRECTORY "" # .lib (import lib) + LIBRARY_OUTPUT_DIRECTORY "" # .so on Linux + ) +else () + target_compile_definitions(basisu_encoder PUBLIC BASISU_STATIC) +endif () + +# Create the basisu executable and link against the library add_executable(basisu basisu_tool.cpp) target_link_libraries(basisu PRIVATE basisu_encoder) -# Create the new example executable and link against the static library +# Create the new example executable and link against the library if(BASISU_EXAMPLES) add_executable(example example/example.cpp) target_link_libraries(example PRIVATE basisu_encoder) diff --git a/transcoder/basisu.h b/transcoder/basisu.h index d4e339e9..ddd614f7 100644 --- a/transcoder/basisu.h +++ b/transcoder/basisu.h @@ -61,6 +61,23 @@ #define strcasecmp _stricmp #endif +// Export macro for shared libraries +#ifdef BASISU_STATIC + #define BASISU_API +#elif defined(_WIN32) + #ifdef basisu_encoder_EXPORTS + #define BASISU_API __declspec(dllexport) + #else + #define BASISU_API __declspec(dllimport) + #endif +#else + #ifdef basisu_encoder_EXPORTS + #define BASISU_API __attribute__((visibility("default"))) + #else + #define BASISU_API + #endif +#endif + // Set to one to enable debug printf()'s when any errors occur, for development/debugging. Especially useful for WebGL development. #ifndef BASISU_FORCE_DEVEL_MESSAGES // Do not check in as 1! From 28b32316ef3050d43296cc8c15af21d338e36cbb Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Thu, 23 Apr 2026 15:59:47 +0200 Subject: [PATCH 2/9] Replace BUILD_SHARED_LIBS with BASISU_SHARED --- CMakeLists.txt | 17 ++++++----------- transcoder/basisu.h | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 96dcb6bc..e3b5b615 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,8 @@ endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -option(BASISU_STATIC "static linking" FALSE) +option(BASISU_STATIC "Link runtime libraries statically" FALSE) +option(BASISU_SHARED "Build basis-universal as a shared library" FALSE) option(BASISU_SAN "sanitize" FALSE) option(BASISU_EXAMPLES "build examples" TRUE) option(BASISU_WASM_THREADING "Enable WASI threading support" OFF) @@ -86,8 +87,8 @@ if (BASISU_BUILD_WASM) set(BASISU_SAN OFF CACHE BOOL "" FORCE) endif() -message("Initial BUILD_SHARED_LIBS=${BUILD_SHARED_LIBSf}") message("Initial CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") +message("Initial BASISU_SHARED=${BASISU_SHARED}") message("Initial BASISU_BUILD_X64=${BASISU_BUILD_X64}") message("Initial BASISU_BUILD_WASM=${BASISU_BUILD_WASM}") message("Initial BASISU_WASM_THREADING=${BASISU_WASM_THREADING}") @@ -312,17 +313,11 @@ add_library(basisu_encoder ${ENCODER_LIB_SRC_LIST}) include(GenerateExportHeader) generate_export_header(basisu_encoder) -if (BUILD_SHARED_LIBS) +if (BASISU_SHARED) set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN 1 - # Empty string sets values to cmake default - RUNTIME_OUTPUT_DIRECTORY "" # .dll - ARCHIVE_OUTPUT_DIRECTORY "" # .lib (import lib) - LIBRARY_OUTPUT_DIRECTORY "" # .so on Linux - ) -else () - target_compile_definitions(basisu_encoder PUBLIC BASISU_STATIC) + VISIBILITY_INLINES_HIDDEN 1) + target_compile_definitions(basisu_encoder PUBLIC BASISU_SHARED) endif () # Create the basisu executable and link against the library diff --git a/transcoder/basisu.h b/transcoder/basisu.h index ddd614f7..9ff0a5de 100644 --- a/transcoder/basisu.h +++ b/transcoder/basisu.h @@ -62,7 +62,7 @@ #endif // Export macro for shared libraries -#ifdef BASISU_STATIC +#ifndef BASISU_SHARED #define BASISU_API #elif defined(_WIN32) #ifdef basisu_encoder_EXPORTS From 5fe2cf4aa57d47f475977132461e2079f0d05f6b Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 11:40:24 +0200 Subject: [PATCH 3/9] Removed generate export header --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e3b5b615..1981632e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,9 +310,6 @@ endif() # Create the library add_library(basisu_encoder ${ENCODER_LIB_SRC_LIST}) -include(GenerateExportHeader) -generate_export_header(basisu_encoder) - if (BASISU_SHARED) set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden From 63f772d97f84ce55ffb1ca25e96cce4633d89765 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 11:50:47 +0200 Subject: [PATCH 4/9] Added export API macro in the WASM export macro --- CMakeLists.txt | 6 ++++-- encoder/basisu_wasm_api_common.h | 5 +++-- transcoder/basisu.h | 17 ----------------- transcoder/basisu_config.h | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 21 deletions(-) create mode 100644 transcoder/basisu_config.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1981632e..931382a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,14 +308,16 @@ if (BASISU_ZSTD) endif() # Create the library -add_library(basisu_encoder ${ENCODER_LIB_SRC_LIST}) if (BASISU_SHARED) + add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST}) set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1) target_compile_definitions(basisu_encoder PUBLIC BASISU_SHARED) -endif () +else() + add_library(basisu_encoder STATIC ${ENCODER_LIB_SRC_LIST}) +endif() # Create the basisu executable and link against the library add_executable(basisu basisu_tool.cpp) diff --git a/encoder/basisu_wasm_api_common.h b/encoder/basisu_wasm_api_common.h index d3fe1ae3..59aa9f64 100644 --- a/encoder/basisu_wasm_api_common.h +++ b/encoder/basisu_wasm_api_common.h @@ -1,6 +1,7 @@ // File: basisu_wasm_api_common.h #pragma once #include "stdint.h" +#include "../transcoder/basisu_config.h" #if defined(__wasm__) #if defined(__cplusplus) @@ -9,9 +10,9 @@ #define BU_WASM_EXPORT(name) __attribute__((export_name(name))) #endif #elif defined(__cplusplus) - #define BU_WASM_EXPORT(name) extern "C" + #define BU_WASM_EXPORT(name) BASISU_API extern "C" #else - #define BU_WASM_EXPORT(name) + #define BU_WASM_EXPORT(name) BASISU_API #endif // wasm_bool_t is an alias for uint32_t diff --git a/transcoder/basisu.h b/transcoder/basisu.h index 9ff0a5de..d4e339e9 100644 --- a/transcoder/basisu.h +++ b/transcoder/basisu.h @@ -61,23 +61,6 @@ #define strcasecmp _stricmp #endif -// Export macro for shared libraries -#ifndef BASISU_SHARED - #define BASISU_API -#elif defined(_WIN32) - #ifdef basisu_encoder_EXPORTS - #define BASISU_API __declspec(dllexport) - #else - #define BASISU_API __declspec(dllimport) - #endif -#else - #ifdef basisu_encoder_EXPORTS - #define BASISU_API __attribute__((visibility("default"))) - #else - #define BASISU_API - #endif -#endif - // Set to one to enable debug printf()'s when any errors occur, for development/debugging. Especially useful for WebGL development. #ifndef BASISU_FORCE_DEVEL_MESSAGES // Do not check in as 1! diff --git a/transcoder/basisu_config.h b/transcoder/basisu_config.h new file mode 100644 index 00000000..d3e4f67a --- /dev/null +++ b/transcoder/basisu_config.h @@ -0,0 +1,17 @@ +#pragma once + +#ifndef BASISU_SHARED + #define BASISU_API +#elif defined(_WIN32) + #ifdef basisu_encoder_EXPORTS + #define BASISU_API __declspec(dllexport) + #else + #define BASISU_API __declspec(dllimport) + #endif +#else + #ifdef basisu_encoder_EXPORTS + #define BASISU_API __attribute__((visibility("default"))) + #else + #define BASISU_API + #endif +#endif \ No newline at end of file From 0252ea5d908dcaa056885760f1de8654a2fe9dd9 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 12:18:38 +0200 Subject: [PATCH 5/9] example_capi.exe compiling --- CMakeLists.txt | 17 +++++++++++++++-- encoder/basisu_wasm_api_common.h | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 931382a4..45a830f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,6 +275,8 @@ set(ENCODER_LIB_SRC_LIST encoder/basisu_uastc_hdr_4x4_enc.h encoder/basisu_astc_ldr_common.h encoder/basisu_astc_ldr_encode.h + encoder/basisu_wasm_api.cpp + encoder/basisu_wasm_transcoder_api.cpp encoder/cppspmd_flow.h encoder/cppspmd_math_declares.h encoder/cppspmd_math.h @@ -313,7 +315,18 @@ if (BASISU_SHARED) add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST}) set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN 1) + VISIBILITY_INLINES_HIDDEN 1 + VERSION 2.10 + SOVERSION 2 + ) + if (MSVC) + set_target_properties(basisu_encoder PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + ) + endif() target_compile_definitions(basisu_encoder PUBLIC BASISU_SHARED) else() add_library(basisu_encoder STATIC ${ENCODER_LIB_SRC_LIST}) @@ -328,7 +341,7 @@ if(BASISU_EXAMPLES) add_executable(example example/example.cpp) target_link_libraries(example PRIVATE basisu_encoder) - add_executable(example_capi example_capi/example_capi.c encoder/basisu_wasm_api.cpp encoder/basisu_wasm_transcoder_api.cpp) + add_executable(example_capi example_capi/example_capi.c) target_link_libraries(example_capi PRIVATE basisu_encoder) add_executable(example_transcoding example_transcoding/example_transcoding.cpp example_transcoding/utils.cpp zstd/zstddeclib.c transcoder/basisu_transcoder.cpp) diff --git a/encoder/basisu_wasm_api_common.h b/encoder/basisu_wasm_api_common.h index 59aa9f64..75d8c39b 100644 --- a/encoder/basisu_wasm_api_common.h +++ b/encoder/basisu_wasm_api_common.h @@ -10,7 +10,7 @@ #define BU_WASM_EXPORT(name) __attribute__((export_name(name))) #endif #elif defined(__cplusplus) - #define BU_WASM_EXPORT(name) BASISU_API extern "C" + #define BU_WASM_EXPORT(name) extern "C" BASISU_API #else #define BU_WASM_EXPORT(name) BASISU_API #endif From c137fde0ea4973e5c272de3e52f757e65d28cca7 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 13:34:30 +0200 Subject: [PATCH 6/9] Reverted weird icon --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45a830f1..01ed415c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -379,7 +379,7 @@ if (BASISU_BUILD_WASM) endif() - # 256 MB initial, 3.5 GB max � safe defaults for BasisU + # 256 MB initial, 3.5 GB max — safe defaults for BasisU target_link_options(basisu PRIVATE -Wl,--initial-memory=268435456 -Wl,--max-memory=3758096384 From d8c0347d82df545002f2374d720b7661fc816490 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 15:27:08 +0200 Subject: [PATCH 7/9] Force set BASISU_SHARED to OFF on WASM builds --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 01ed415c..7ea9d65d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,9 @@ if (BASISU_BUILD_WASM) # WASM cannot use sanitizers set(BASISU_SAN OFF CACHE BOOL "" FORCE) + + # WASM cannot link as a shared object + set(BASISU_SHARED OFF CACHE BOOL "" FORCE) endif() message("Initial CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") From d40abf1b9dbe704c484784c6474aa28d0d4f070d Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Tue, 5 May 2026 15:46:01 +0200 Subject: [PATCH 8/9] Disabled shared option in python builds as well --- CMakeLists.txt | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ea9d65d..35b28a84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,11 @@ if (BASISU_BUILD_WASM) set(BASISU_SHARED OFF CACHE BOOL "" FORCE) endif() +if (BASISU_BUILD_PYTHON) + # Dynamic linking is not supported on Python builds + set(BASISU_SHARED OFF CACHE BOOL "" FORCE) +endif() + message("Initial CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") message("Initial BASISU_SHARED=${BASISU_SHARED}") message("Initial BASISU_BUILD_X64=${BASISU_BUILD_X64}") @@ -278,8 +283,6 @@ set(ENCODER_LIB_SRC_LIST encoder/basisu_uastc_hdr_4x4_enc.h encoder/basisu_astc_ldr_common.h encoder/basisu_astc_ldr_encode.h - encoder/basisu_wasm_api.cpp - encoder/basisu_wasm_transcoder_api.cpp encoder/cppspmd_flow.h encoder/cppspmd_math_declares.h encoder/cppspmd_math.h @@ -315,13 +318,18 @@ endif() # Create the library if (BASISU_SHARED) - add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST}) + add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST} + encoder/basisu_wasm_api.cpp + encoder/basisu_wasm_transcoder_api.cpp + ) + set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1 VERSION 2.10 SOVERSION 2 - ) + ) + if (MSVC) set_target_properties(basisu_encoder PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} @@ -330,6 +338,7 @@ if (BASISU_SHARED) RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ) endif() + target_compile_definitions(basisu_encoder PUBLIC BASISU_SHARED) else() add_library(basisu_encoder STATIC ${ENCODER_LIB_SRC_LIST}) @@ -619,7 +628,6 @@ if (BASISU_BUILD_WASM) endif() add_executable(${BASISU_TRANSCODER_WASM_OUTPUT_NAME} - ${CMAKE_CURRENT_SOURCE_DIR}/encoder/basisu_wasm_transcoder_api.cpp ${CMAKE_CURRENT_SOURCE_DIR}/transcoder/basisu_transcoder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/zstd/zstddeclib.c) @@ -682,7 +690,7 @@ if (BASISU_BUILD_PYTHON AND NOT BASISU_BUILD_WASM) pybind11_add_module(basisu_transcoder_python python/basisu_transcoder_pybind11.cpp - encoder/basisu_wasm_transcoder_api.cpp + encoder/basisu_wasm_transcoder_api.cpp transcoder/basisu_transcoder.cpp zstd/zstddeclib.c ) From 8f802191b09abf8800df5d2bc435425be269bb11 Mon Sep 17 00:00:00 2001 From: Santiago Bernardino Date: Mon, 11 May 2026 12:42:20 +0200 Subject: [PATCH 9/9] Fixed missing definitions in static builds --- CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35b28a84..f963a7b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,6 +258,8 @@ set(ENCODER_LIB_SRC_LIST encoder/basisu_astc_ldr_common.cpp encoder/basisu_astc_ldr_encode.cpp encoder/basisu_tinyexr.cpp + encoder/basisu_wasm_api.cpp + encoder/basisu_wasm_transcoder_api.cpp transcoder/basisu_transcoder.cpp encoder/basisu_astc_hdr_6x6_enc.h encoder/basisu_astc_hdr_common.h @@ -318,10 +320,7 @@ endif() # Create the library if (BASISU_SHARED) - add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST} - encoder/basisu_wasm_api.cpp - encoder/basisu_wasm_transcoder_api.cpp - ) + add_library(basisu_encoder SHARED ${ENCODER_LIB_SRC_LIST}) set_target_properties(basisu_encoder PROPERTIES CXX_VISIBILITY_PRESET hidden