diff options
author | Tuomas Virtanen <katajakasa@gmail.com> | 2020-05-02 00:59:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-02 00:59:31 +0300 |
commit | 243140385848145c53b5b2c209f715be864bcecb (patch) | |
tree | 8521d7e3e396cb8c987fac2249873af004a6dfc5 | |
parent | a629818ab609d9615f76fd0b2976b951cc13d8b6 (diff) | |
parent | 098615519dd7b4e318aef19fa78ddbc3f68ffd55 (diff) |
Merge pull request #61 from katajakasa/allow-selecting-build-types
Allow switching shared and static builds
-rw-r--r-- | CMakeLists.txt | 105 | ||||
-rw-r--r-- | README.md | 4 |
2 files changed, 83 insertions, 26 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f048ee9..9775d4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,28 @@ set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Os -DNDEBUG") option(BUILD_EXAMPLES "Build examples" OFF) option(USE_DYNAMIC_LIBASS "Use dynamically loaded libass" OFF) option(USE_ASAN "Use AddressSanitizer" OFF) +option(BUILD_SHARED "Build shared library" ON) +option(BUILD_STATIC "Build static library" ON) + +if(NOT BUILD_SHARED AND NOT BUILD_STATIC) + message(FATAL_ERROR "Nothing to build, set BUILD_SHARED and/or BUILD_STATIC.") +endif() + +if(BUILD_SHARED) + message(STATUS "Building shared libraries") +else() + message(STATUS "NOT building shared libraries") +endif() + +if(BUILD_STATIC) + message(STATUS "Building static libraries") +else() + message(STATUS "NOT building static libraries") +endif() + +if(USE_ASAN) + message(STATUS "DEVELOPMENT: AddressSanitizer enabled!") +endif() find_package(SDL2 REQUIRED) find_package(ffmpeg COMPONENTS avcodec avformat avutil swscale swresample) @@ -53,32 +75,46 @@ endif() FILE(GLOB_RECURSE SOURCES "src/*.c") FILE(GLOB INSTALL_HEADERS "include/kitchensink/*.h") -add_library(SDL_kitchensink SHARED ${SOURCES}) -add_library(SDL_kitchensink_static STATIC ${SOURCES}) +include_directories(${INCLUDES}) -set_target_properties(SDL_kitchensink PROPERTIES VERSION ${KIT_VERSION}) -set_target_properties(SDL_kitchensink PROPERTIES SOVERSION ${KIT_VERSION_MAJOR}) +set(INSTALL_TARGETS "") -set_target_properties(SDL_kitchensink PROPERTIES DEBUG_POSTFIX "d") -set_target_properties(SDL_kitchensink_static PROPERTIES DEBUG_POSTFIX "d") +if(BUILD_SHARED) + add_library(SDL_kitchensink SHARED ${SOURCES}) -target_compile_definitions(SDL_kitchensink PRIVATE "KIT_DLL;KIT_DLL_EXPORTS") -target_compile_options(SDL_kitchensink PRIVATE "-fvisibility=hidden") + if(USE_ASAN) + target_compile_options(SDL_kitchensink PRIVATE "-fsanitize=address") + target_link_libraries(SDL_kitchensink asan) + endif() -set_property(TARGET SDL_kitchensink PROPERTY C_STANDARD 99) -set_property(TARGET SDL_kitchensink_static PROPERTY C_STANDARD 99) + target_link_libraries(SDL_kitchensink ${LIBRARIES}) -if(USE_ASAN) - set(LIBRARIES asan ${LIBRARIES}) - target_compile_options(SDL_kitchensink PRIVATE "-fsanitize=address") - message(STATUS "DEVELOPMENT: AddressSanitizer enabled!") + set_target_properties(SDL_kitchensink PROPERTIES VERSION ${KIT_VERSION}) + set_target_properties(SDL_kitchensink PROPERTIES SOVERSION ${KIT_VERSION_MAJOR}) + set_target_properties(SDL_kitchensink PROPERTIES DEBUG_POSTFIX "d") + + target_compile_definitions(SDL_kitchensink PRIVATE "KIT_DLL;KIT_DLL_EXPORTS") + target_compile_options(SDL_kitchensink PRIVATE "-fvisibility=hidden") + + set_property(TARGET SDL_kitchensink PROPERTY C_STANDARD 99) + + set(INSTALL_TARGETS SDL_kitchensink ${INSTALL_TARGETS}) endif() -include_directories(${INCLUDES}) -target_link_libraries(SDL_kitchensink ${LIBRARIES}) +if(BUILD_STATIC) + add_library(SDL_kitchensink_static STATIC ${SOURCES}) -set(PKG_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/SDL_kitchensink.pc") + if(USE_ASAN) + target_compile_options(SDL_kitchensink_static PRIVATE "-fsanitize=address") + endif() + set_target_properties(SDL_kitchensink_static PROPERTIES DEBUG_POSTFIX "d") + set_property(TARGET SDL_kitchensink_static PROPERTY C_STANDARD 99) + + set(INSTALL_TARGETS SDL_kitchensink_static ${INSTALL_TARGETS}) +endif() + +set(PKG_CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/SDL_kitchensink.pc") configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/pkg-config.pc.in" ${PKG_CONFIG_FILE} @@ -106,20 +142,39 @@ if(BUILD_EXAMPLES) set_property(TARGET custom PROPERTY C_STANDARD 99) set_property(TARGET rwops PROPERTY C_STANDARD 99) - target_link_libraries(audio SDL_kitchensink_static ${LIBRARIES}) - target_link_libraries(complex SDL_kitchensink_static ${LIBRARIES}) - target_link_libraries(simple SDL_kitchensink_static ${LIBRARIES}) - target_link_libraries(custom SDL_kitchensink_static ${LIBRARIES}) - target_link_libraries(rwops SDL_kitchensink_static ${LIBRARIES}) + # If we are building static, just link all libraries (ffmpeg, sdl, etc.) + # If building shared, link shared kitchensink + SDL2 (ffmpeg gets pulled by kitchensink) + if(BUILD_STATIC) + set(EXAMPLE_LIBRARIES SDL_kitchensink_static ${LIBRARIES}) + else() + set(EXAMPLE_LIBRARIES SDL_kitchensink ${SDL2_LIBRARIES}) + endif() + if(USE_ASAN) + set(EXAMPLE_LIBRARIES asan ${EXAMPLE_LIBRARIES}) + endif() + + target_link_libraries(audio ${EXAMPLE_LIBRARIES}) + target_link_libraries(complex ${EXAMPLE_LIBRARIES}) + target_link_libraries(simple ${EXAMPLE_LIBRARIES}) + target_link_libraries(custom ${EXAMPLE_LIBRARIES}) + target_link_libraries(rwops ${EXAMPLE_LIBRARIES}) + + if(USE_ASAN) + target_compile_options(audio PRIVATE "-fsanitize=address") + target_compile_options(complex PRIVATE "-fsanitize=address") + target_compile_options(simple PRIVATE "-fsanitize=address") + target_compile_options(custom PRIVATE "-fsanitize=address") + target_compile_options(rwops PRIVATE "-fsanitize=address") + endif() endif() # documentation target add_custom_target(docs COMMAND doxygen WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) # Installation -install(FILES ${PKG_CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -install(FILES ${INSTALL_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/kitchensink) -INSTALL(TARGETS SDL_kitchensink SDL_kitchensink_static +INSTALL(FILES ${PKG_CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +INSTALL(FILES ${INSTALL_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/kitchensink) +INSTALL(TARGETS ${INSTALL_TARGETS} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -52,6 +52,8 @@ pacman -S mingw-w64-x86_64-SDL2 mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-libass ## 2. Compiling By default, both static and dynamic libraries are built. +* Set BUILD_STATIC off if you don't want to build static library +* Set BUILD_SHARED off if you don't want to build shared library * Dynamic library is called libSDL_kitchensink.dll or .so * Static library is called libSDL_kitchensink_static.a * If you build in debug mode (```-DCMAKE_BUILD_TYPE=Debug```), libraries will be postfixed with 'd'. @@ -88,7 +90,7 @@ supported on all OSes (eg. windows). After building, you can run with the following (make sure to set correct llvm-symbolizer path): ``` -ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./examplevideo <my videofile> +ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./complex <my videofile> ``` ## 3. Why the name SDL_kitchensink |