diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cb2227 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +build/* diff --git a/CMakeLists.txt b/CMakeLists.txt index 9916c67..2b324f8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,15 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.13) project(lunasvg VERSION 2.3.1 LANGUAGES CXX C) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 11) +# Default to hidden visibility for symbols +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) +set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) + option(BUILD_SHARED_LIBS "Builds as shared library" OFF) option(LUNASVG_BUILD_EXAMPLES "Builds examples" OFF) @@ -15,25 +20,61 @@ add_subdirectory(source) add_subdirectory(3rdparty/software) add_subdirectory(3rdparty/plutovg) -if(BUILD_SHARED_LIBS) - target_compile_definitions(lunasvg PUBLIC LUNASVG_SHARED) - target_compile_definitions(lunasvg PRIVATE LUNASVG_EXPORT) +set_target_properties(lunasvg + PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" +) + +add_library(lunasvg::lunasvg ALIAS lunasvg) + +if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(lunasvg PUBLIC LUNASVG_STATIC_DEFINE) endif() if(LUNASVG_BUILD_EXAMPLES) add_subdirectory(example) endif() -set(LUNASVG_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) -set(LUNASVG_INCDIR ${CMAKE_INSTALL_PREFIX}/include) +# +# Installation +# +include(GNUInstallDirs) +install( + FILES + ${CMAKE_CURRENT_SOURCE_DIR}/include/lunasvg.h + ${CMAKE_CURRENT_BINARY_DIR}/include/lunasvg_export.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/lunasvg +) +install( + TARGETS lunasvg + EXPORT lunasvg-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) +install( + EXPORT lunasvg-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg NAMESPACE lunasvg:: FILE lunasvgTargets.cmake +) + +include(CMakePackageConfigHelpers) +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lunasvgConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfig.cmake + INSTALL_DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg +) + +write_basic_package_version_file(lunasvgConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) install(FILES - include/lunasvg.h - DESTINATION ${LUNASVG_INCDIR} + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/lunasvgConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/lunasvg ) -install(TARGETS lunasvg - LIBRARY DESTINATION ${LUNASVG_LIBDIR} - ARCHIVE DESTINATION ${LUNASVG_LIBDIR} - INCLUDES DESTINATION ${LUNASVG_INCDIR} -) +export(EXPORT lunasvg-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/lunasvgTargets.cmake NAMESPACE lunasvg::) diff --git a/cmake/lunasvgConfig.cmake.in b/cmake/lunasvgConfig.cmake.in new file mode 100644 index 0000000..850098f --- /dev/null +++ b/cmake/lunasvgConfig.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/lunasvgTargets.cmake") diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 53ec5ef..de18b31 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.13) set(CMAKE_CXX_STANDARD 14) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index de58954..70d896f 100755 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -1,4 +1,16 @@ +# Generate a standard header with export macros +include(GenerateExportHeader) +generate_export_header(lunasvg) + target_include_directories(lunasvg -PUBLIC - "${CMAKE_CURRENT_LIST_DIR}" + # When building a project that uses the lunasvg library, + # we need to look in the installed include directory + PUBLIC + $ + + # When building the lunasvg library we need to look in the + # build dir for the lunasvg_export.h header and in the source + # dir for other headers + $ + $ ) diff --git a/include/lunasvg.h b/include/lunasvg.h index c83c27c..74c7e37 100644 --- a/include/lunasvg.h +++ b/include/lunasvg.h @@ -26,15 +26,8 @@ #include #include -#if defined(_MSC_VER) && defined(LUNASVG_SHARED) -#ifdef LUNASVG_EXPORT -#define LUNASVG_API __declspec(dllexport) -#else -#define LUNASVG_API __declspec(dllimport) -#endif -#else -#define LUNASVG_API -#endif +#include +#define LUNASVG_API LUNASVG_EXPORT namespace lunasvg {