Browse Source

Updated CMake and project files

Chlumsky 3 years ago
parent
commit
4e8ff2321e
9 changed files with 127 additions and 112 deletions
  1. 2 0
      .gitignore
  2. 72 86
      CMakeLists.txt
  3. 1 1
      LICENSE.txt
  4. 1 1
      Msdfgen.sln
  5. 2 2
      Msdfgen.vcxproj
  6. 1 1
      Msdfgen.vcxproj.filters
  7. 0 17
      cmake/folderize.cmake
  8. 27 4
      cmake/msdfgenConfig.cmake.in
  9. 21 0
      skia/skia-config.cmake

+ 2 - 0
.gitignore

@@ -26,3 +26,5 @@ build/
 build_xcode/
 skia/win32/
 skia/win64/
+/cmake-gen.bat
+/line-ending-check.bat

+ 72 - 86
CMakeLists.txt

@@ -1,58 +1,47 @@
-cmake_minimum_required(VERSION 3.10)
 
-project(msdfgen VERSION 1.9 LANGUAGES CXX)
+cmake_minimum_required(VERSION 3.15)
+
+option(MSDFGEN_CORE_ONLY "Only build the core library with no dependencies" OFF)
 option(MSDFGEN_BUILD_STANDALONE "Build the msdfgen standalone executable" ON)
 option(MSDFGEN_USE_OPENMP "Build with OpenMP support for multithreaded code" OFF)
 option(MSDFGEN_USE_CPP11 "Build with C++11 enabled" ON)
 option(MSDFGEN_USE_SKIA "Build with the Skia library" OFF)
 option(MSDFGEN_INSTALL "Generate installation target" ON)
-option(FREETYPE_WITH_PNG "Link libpng and zlib because FreeType is configured to require it" OFF)
-option(FREETYPE_WITH_HARFBUZZ "Link HarfBuzz because FreeType is configured to require it" OFF)
-
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 
-if(NOT TARGET Freetype::Freetype)
-    find_package(Freetype REQUIRED)
+if(MSDFGEN_CORE_ONLY AND MSDFGEN_BUILD_STANDALONE)
+    message(WARNING "Option MSDFGEN_CORE_ONLY ignored - extensions are required for standalone executable")
+    set(MSDFGEN_CORE_ONLY OFF)
 endif()
 
-file(GLOB_RECURSE msdfgen-core_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-    "core/*.h"
-    "core/*.hpp"
-)
-
-file(GLOB_RECURSE msdfgen-core_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-    "core/*.cpp"
-)
-
-file(GLOB_RECURSE msdfgen-ext_PUBLIC_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-    "ext/*.h"
-    "ext/*.hpp"
-)
+project(msdfgen VERSION 1.9 LANGUAGES CXX)
 
-file(GLOB_RECURSE msdfgen-ext_PRIVATE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-    "include/*.h"
-)
+if(NOT CMAKE_MSVC_RUNTIME_LIBRARY)
+    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
+    get_directory_property(MSDFGEN_HAS_PARENT PARENT_DIRECTORY)
+    if(MSDFGEN_HAS_PARENT)
+        set(CMAKE_MSVC_RUNTIME_LIBRARY ${CMAKE_MSVC_RUNTIME_LIBRARY} PARENT_SCOPE)
+    endif()
+endif()
 
-file(GLOB_RECURSE msdfgen-ext_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
-    "ext/*.cpp"
-    "lib/*.cpp"
-)
+if(NOT TARGET Freetype::Freetype)
+    find_package(Freetype REQUIRED)
+endif()
 
-include(folderize)
-folderize_sources(msdfgen-core_HEADERS ${CMAKE_SOURCE_DIR})
-folderize_sources(msdfgen-core_SOURCES ${CMAKE_SOURCE_DIR})
-folderize_sources(msdfgen-ext_PUBLIC_HEADERS ${CMAKE_SOURCE_DIR})
-folderize_sources(msdfgen-ext_PRIVATE_HEADERS ${CMAKE_SOURCE_DIR})
-folderize_sources(msdfgen-ext_SOURCES ${CMAKE_SOURCE_DIR})
+file(GLOB_RECURSE MSDFGEN_CORE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "core/*.h" "core/*.hpp")
+file(GLOB_RECURSE MSDFGEN_CORE_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "core/*.cpp")
+file(GLOB_RECURSE MSDFGEN_EXT_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "ext/*.h" "ext/*.hpp")
+file(GLOB_RECURSE MSDFGEN_EXT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "ext/*.cpp" "lib/*.cpp")
 
 # Core library
-add_library(msdfgen-core ${msdfgen-core_SOURCES} ${msdfgen-core_HEADERS} "./msdfgen.h")
+add_library(msdfgen-core "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.h" ${MSDFGEN_CORE_HEADERS} ${MSDFGEN_CORE_SOURCES})
 add_library(msdfgen::msdfgen-core ALIAS msdfgen-core)
-set_target_properties(msdfgen-core PROPERTIES PUBLIC_HEADER "${msdfgen-core_HEADERS}")
+set_target_properties(msdfgen-core PROPERTIES PUBLIC_HEADER "${MSDFGEN_CORE_HEADERS}")
+#set_property(TARGET msdfgen-core PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
 target_include_directories(msdfgen-core INTERFACE
     $<INSTALL_INTERFACE:include/msdfgen>
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
 )
+set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT msdfgen-core)
 
 if(MSDFGEN_USE_CPP11)
     target_compile_features(msdfgen-core PUBLIC cxx_std_11)
@@ -62,45 +51,46 @@ endif()
 if(MSDFGEN_USE_OPENMP)
     # Note: Clang doesn't support OpenMP by default...
     find_package(OpenMP REQUIRED COMPONENTS CXX)
-    target_link_libraries(msdfgen-core PUBLIC OpenMP::OpenMP_CXX)
     target_compile_definitions(msdfgen-core PUBLIC MSDFGEN_USE_OPENMP)
+    target_link_libraries(msdfgen-core PUBLIC OpenMP::OpenMP_CXX)
 endif()
 
 # Extensions library
-add_library(msdfgen-ext ${msdfgen-ext_SOURCES} ${msdfgen-ext_PUBLIC_HEADERS} ${msdfgen-ext_PRIVATE_HEADERS} "./msdfgen-ext.h")
-add_library(msdfgen::msdfgen-ext ALIAS msdfgen-ext)
-set_target_properties(msdfgen-ext PROPERTIES PUBLIC_HEADER "${msdfgen-ext_PUBLIC_HEADERS}")
-target_link_libraries(msdfgen-ext PUBLIC msdfgen::msdfgen-core Freetype::Freetype)
-target_include_directories(msdfgen-ext
-PUBLIC
-    $<INSTALL_INTERFACE:include/msdfgen>
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
-PRIVATE
-    ${CMAKE_CURRENT_SOURCE_DIR}/include
-)
+if(NOT MSDFGEN_CORE_ONLY)
+    add_library(msdfgen-ext "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen-ext.h" ${MSDFGEN_EXT_HEADERS} ${MSDFGEN_EXT_SOURCES})
+    add_library(msdfgen::msdfgen-ext ALIAS msdfgen-ext)
+    set_target_properties(msdfgen-ext PROPERTIES PUBLIC_HEADER "${MSDFGEN_EXT_HEADERS}")
+    target_link_libraries(msdfgen-ext PUBLIC msdfgen::msdfgen-core Freetype::Freetype)
+    target_include_directories(msdfgen-ext
+        PUBLIC
+            $<INSTALL_INTERFACE:include/msdfgen>
+            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+        PRIVATE
+            ${CMAKE_CURRENT_SOURCE_DIR}/include
+    )
+    set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT msdfgen-ext)
 
-if(FREETYPE_WITH_PNG)
-    find_package(ZLIB REQUIRED)
-    find_package(PNG REQUIRED)
-    target_link_libraries(msdfgen-ext PUBLIC ZLIB::ZLIB PNG::PNG)
-endif()
-if(FREETYPE_WITH_HARFBUZZ)
-    # No FindHarfBuzz.cmake available so falling back to CMAKE_LIBRARY_PATH
-    find_library(FREETYPE_HARFBUZZ_LIB "harfbuzz")
-    target_link_libraries(msdfgen-ext PUBLIC "${FREETYPE_HARFBUZZ_LIB}")
-endif()
+    if(MSDFGEN_USE_SKIA)
+        find_package(Skia REQUIRED)
+        target_compile_definitions(msdfgen-ext PUBLIC MSDFGEN_USE_SKIA)
+        target_link_libraries(msdfgen-ext PUBLIC Skia::Skia)
+    endif()
 
-if(MSDFGEN_USE_SKIA)
-    find_package(Skia REQUIRED)
-    target_link_libraries(msdfgen-ext PUBLIC Skia::Skia)
-    target_compile_definitions(msdfgen-ext PUBLIC MSDFGEN_USE_SKIA)
+    add_library(msdfgen-all INTERFACE)
+    add_library(msdfgen::msdfgen ALIAS msdfgen-all)
+    target_link_libraries(msdfgen-all INTERFACE msdfgen::msdfgen-core msdfgen::msdfgen-ext)
 endif()
 
 # Standalone executable
 if(MSDFGEN_BUILD_STANDALONE)
-    add_executable(msdfgen main.cpp)
+    set(MSDFGEN_STANDALONE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")
+    if(MSVC)
+        set(MSDFGEN_STANDALONE_SOURCES ${MSDFGEN_STANDALONE_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.rc")
+    endif()
+    add_executable(msdfgen ${MSDFGEN_STANDALONE_SOURCES})
     target_compile_definitions(msdfgen PUBLIC MSDFGEN_STANDALONE)
-    target_link_libraries(msdfgen PUBLIC msdfgen::msdfgen-core msdfgen::msdfgen-ext)
+    target_link_libraries(msdfgen PUBLIC msdfgen::msdfgen)
+    set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT msdfgen)
 endif()
 
 # Installation
@@ -137,19 +127,27 @@ if(MSDFGEN_INSTALL)
         FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
         PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdfgen/core
     )
+    install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.h" DESTINATION include/msdfgen)
+
+    if(NOT MSDFGEN_CORE_ONLY)
+        install(TARGETS msdfgen-ext EXPORT msdfgenTargets
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdfgen/ext
+        )
+        install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen-ext.h" DESTINATION include/msdfgen)
+        install(TARGETS msdfgen-all EXPORT msdfgenTargets)
+    endif()
 
-    install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.h" "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen-ext.h" DESTINATION include/msdfgen)
-
-    install(TARGETS msdfgen-ext EXPORT msdfgenTargets
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
-        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-        FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
-        PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdfgen/ext
-    )
+    export(EXPORT msdfgenTargets NAMESPACE msdfgen:: FILE "${CMAKE_CURRENT_BINARY_DIR}/msdfgenTargets.cmake")
+    install(EXPORT msdfgenTargets FILE msdfgenTargets.cmake NAMESPACE msdfgen:: DESTINATION ${MSDFGEN_CONFIG_PATH})
 
     if(MSDFGEN_BUILD_STANDALONE)
-        install(TARGETS msdfgen EXPORT msdfgenTargets DESTINATION bin)
+        install(TARGETS msdfgen EXPORT msdfgenBinaryTargets DESTINATION ${CMAKE_INSTALL_BINDIR})
+        export(EXPORT msdfgenBinaryTargets NAMESPACE msdfgen-standalone:: FILE "${CMAKE_CURRENT_BINARY_DIR}/msdfgenBinaryTargets.cmake")
+        install(EXPORT msdfgenBinaryTargets FILE msdfgenBinaryTargets.cmake NAMESPACE msdfgen-standalone:: DESTINATION ${MSDFGEN_CONFIG_PATH})
     endif()
 
     install(
@@ -158,16 +156,4 @@ if(MSDFGEN_INSTALL)
             "${CMAKE_CURRENT_BINARY_DIR}/msdfgenConfigVersion.cmake"
         DESTINATION ${MSDFGEN_CONFIG_PATH}
     )
-
-    export(
-        EXPORT msdfgenTargets
-        NAMESPACE msdfgen::
-        FILE "${CMAKE_CURRENT_BINARY_DIR}/msdfgenTargets.cmake"
-    )
-
-    install(
-        EXPORT msdfgenTargets FILE msdfgenTargets.cmake
-        NAMESPACE msdfgen::
-        DESTINATION ${MSDFGEN_CONFIG_PATH}
-    )
 endif()

+ 1 - 1
LICENSE.txt

@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2016 Viktor Chlumsky
+Copyright (c) 2016 - 2022 Viktor Chlumsky
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 1 - 1
Msdfgen.sln

@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
 VisualStudioVersion = 14.0.25420.1
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Msdfgen", "Msdfgen.vcxproj", "{84BE2D91-F071-4151-BE12-61460464C494}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msdfgen", "msdfgen.vcxproj", "{84BE2D91-F071-4151-BE12-61460464C494}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+ 2 - 2
Msdfgen.vcxproj

@@ -52,7 +52,7 @@
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{84BE2D91-F071-4151-BE12-61460464C494}</ProjectGuid>
-    <RootNamespace>Msdfgen</RootNamespace>
+    <RootNamespace>msdfgen</RootNamespace>
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
@@ -526,7 +526,7 @@
     <ClCompile Include="core\msdfgen.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="Msdfgen.rc" />
+    <ResourceCompile Include="msdfgen.rc" />
   </ItemGroup>
   <ItemGroup>
     <Image Include="icon.ico" />

+ 1 - 1
Msdfgen.vcxproj.filters

@@ -217,7 +217,7 @@
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="Msdfgen.rc">
+    <ResourceCompile Include="msdfgen.rc">
       <Filter>Resource Files</Filter>
     </ResourceCompile>
   </ItemGroup>

+ 0 - 17
cmake/folderize.cmake

@@ -1,17 +0,0 @@
-# Mirror the folder structure for sources inside the IDE...
-function(folderize_sources sources prefix)
-	foreach(FILE ${${sources}}) 
-		get_filename_component(PARENT_DIR "${FILE}" PATH)
-
-		# skip src or include and changes /'s to \\'s
-		string(REPLACE "${prefix}" "" GROUP "${PARENT_DIR}")
-		string(REPLACE "/" "\\" GROUP "${GROUP}")
-
-		# If it's got a path, then append a "\\" separator (otherwise leave it blank)
-		if ("${GROUP}" MATCHES ".+")
-			set(GROUP "\\${GROUP}")
-		endif()
-
-		source_group("${GROUP}" FILES "${FILE}")
-	endforeach()
-endfunction(folderize_sources)

+ 27 - 4
cmake/msdfgenConfig.cmake.in

@@ -1,12 +1,35 @@
+
 include(CMakeFindDependencyMacro)
 
-find_dependency(Freetype REQUIRED)
+set(MSDFGEN_CORE_ONLY @MSDFGEN_CORE_ONLY@)
+set(MSDFGEN_USE_OPENMP @MSDFGEN_USE_OPENMP@)
+set(MSDFGEN_USE_SKIA @MSDFGEN_USE_SKIA@)
+set(MSDFGEN_STANDALONE_AVAILABLE @MSDFGEN_BUILD_STANDALONE@)
 
-set(MSDFGEN_USE_OPENMP "@MSDFGEN_USE_OPENMP@")
+if(NOT MSDFGEN_CORE_ONLY)
+    find_dependency(Freetype REQUIRED)
+endif()
+if(MSDFGEN_USE_SKIA)
+    find_dependency(Skia REQUIRED)
+endif()
 if(MSDFGEN_USE_OPENMP)
-	find_dependency(OpenMP REQUIRED COMPONENTS CXX)
+    find_dependency(OpenMP REQUIRED COMPONENTS CXX)
 endif()
 
 include("${CMAKE_CURRENT_LIST_DIR}/msdfgenTargets.cmake")
 
-unset(MSDFGEN_USE_OPENMP)
+if(NOT MSDFGEN_CORE_ONLY)
+    if(${CMAKE_VERSION} VERSION_LESS "3.18.0")
+        set_target_properties(msdfgen::msdfgen-all PROPERTIES IMPORTED_GLOBAL TRUE)
+    endif()
+    add_library(msdfgen::msdfgen ALIAS msdfgen::msdfgen-all)
+endif()
+
+if(MSDFGEN_STANDALONE_AVAILABLE)
+    include("${CMAKE_CURRENT_LIST_DIR}/msdfgenBinaryTargets.cmake")
+    if(${CMAKE_VERSION} VERSION_LESS "3.18.0")
+        set_target_properties(msdfgen-standalone::msdfgen PROPERTIES IMPORTED_GLOBAL TRUE)
+    endif()
+    add_executable(msdfgen::msdfgen-run ALIAS msdfgen-standalone::msdfgen)
+    set(MSDFGEN_EXECUTABLE "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/msdfgen@CMAKE_EXECUTABLE_SUFFIX@")
+endif()

+ 21 - 0
skia/skia-config.cmake

@@ -0,0 +1,21 @@
+
+if(WIN32)
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+        set(SKIA_LIB_DIR "${CMAKE_CURRENT_LIST_DIR}/win64")
+    else()
+        set(SKIA_LIB_DIR "${CMAKE_CURRENT_LIST_DIR}/win32")
+    endif()
+
+    add_library(Skia::Skia STATIC IMPORTED)
+    
+    set_target_properties(Skia::Skia PROPERTIES
+        IMPORTED_LOCATION "${SKIA_LIB_DIR}/release/skia.lib"
+        IMPORTED_LOCATION_DEBUG "${SKIA_LIB_DIR}/debug/skia.lib"
+        IMPORTED_CONFIGURATIONS "RELEASE;DEBUG"
+    )
+    target_include_directories(Skia::Skia INTERFACE
+        "${CMAKE_CURRENT_LIST_DIR}/include"
+        "${CMAKE_CURRENT_LIST_DIR}/include/core"
+        "${CMAKE_CURRENT_LIST_DIR}/include/config"
+    )
+endif()