Browse Source

Modernize cmake and allow installation (#104)

Guillaume Racicot 5 years ago
parent
commit
31dda2d474
3 changed files with 171 additions and 55 deletions
  1. 142 55
      CMakeLists.txt
  2. 17 0
      cmake/folderize.cmake
  3. 12 0
      cmake/msdfgenConfig.cmake.in

+ 142 - 55
CMakeLists.txt

@@ -1,80 +1,167 @@
-cmake_minimum_required(VERSION 2.8.12)
+cmake_minimum_required(VERSION 3.10)
 
-project(msdfgen)
+project(msdfgen VERSION 1.7.1 LANGUAGES CXX)
+option(MSDFGEN_BUILD_MSDFGEN_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)
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 
 find_package(Freetype REQUIRED)
 
-include(CheckCXXCompilerFlag)
-CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
-if (COMPILER_SUPPORTS_CXX11)
-	add_definitions(-DMSDFGEN_USE_CPP11)
-	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-endif()
+#----------------------------------------------------------------
+# Gathering File
+#----------------------------------------------------------------
 
-# Make release mode default (turn on optimizations)
-if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE Release)
-endif()
+file(GLOB_RECURSE msdfgen_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+	"core/*.h"
+	"core/*.hpp"
+)
+
+file(GLOB_RECURSE msdfgen_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+	"core/*.cpp"
+)
+
+file(GLOB_RECURSE msdfgen-ext_PUBLIC_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+	"ext/*.h"
+	"ext/*.hpp"
+)
 
+file(GLOB_RECURSE msdfgen-ext_PRIVATE_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+	"include/*.h"
+)
+
+file(GLOB_RECURSE msdfgen-ext_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+	"ext/*.cpp"
+	"lib/*.cpp"
+	"lib/*.cpp"
+)
 
-# Note: Clang doesn't support openMP by default...
-#find_package(OpenMP)
-#if (OPENMP_FOUND)
-#	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-#	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-#endif()
+# Build the library (aliased name because it's the same target name the exe)
+include(folderize)
+folderize_sources(msdfgen_HEADERS ${CMAKE_SOURCE_DIR})
+folderize_sources(msdfgen_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})
 
 #----------------------------------------------------------------
-# Support Functions
+# Target configuration
 #----------------------------------------------------------------
 
-# Mirror the folder structure for sources inside the IDE...
-function(folderize_sources sources prefix)
-	foreach(FILE ${${sources}}) 
-	  get_filename_component(PARENT_DIR "${FILE}" PATH)
+add_library(msdfgen ${msdfgen_SOURCES} ${msdfgen_HEADERS} "./msdfgen.h")
+add_library(msdfgen::msdfgen ALIAS msdfgen)
+set_target_properties(msdfgen PROPERTIES PUBLIC_HEADER "${msdfgen_HEADERS}")
+target_include_directories(msdfgen INTERFACE
+	$<INSTALL_INTERFACE:include>
+	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
+)
 
-	  # skip src or include and changes /'s to \\'s
-	  string(REPLACE "${prefix}" "" GROUP "${PARENT_DIR}")
-	  string(REPLACE "/" "\\" GROUP "${GROUP}")
+if(MSDFGEN_USE_CPP11)
+	target_compile_features(msdfgen PUBLIC cxx_std_11)
+	target_compile_definitions(msdfgen PUBLIC MSDFGEN_USE_CPP11)
+endif()
 
-      # If it's got a path, then append a "\\" separator (otherwise leave it blank)
-	  if ("${GROUP}" MATCHES ".+")
-	  	set(GROUP "\\${GROUP}")
-	  endif()
+if(MSDFGEN_USE_OPENMP)
+	# Note: Clang doesn't support OpenMP by default...
+	find_package(OpenMP REQUIRED COMPONENTS CXX)
+	target_link_libraries(msdfgen PRIVATE OpenMP::OpenMP_CXX)
+	target_compile_definitions(msdfgen PRIVATE MSDFGEN_USE_OPENMP)
+endif()
 
-	  source_group("${GROUP}" FILES "${FILE}")
-	endforeach()
-endfunction(folderize_sources)
+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 Freetype::Freetype)
+target_include_directories(msdfgen-ext
+PUBLIC
+	$<INSTALL_INTERFACE:include>
+	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
+	
+PRIVATE
+	${CMAKE_CURRENT_SOURCE_DIR}/include
+)
 
+if(MSDFGEN_USE_CPP11)
+	target_compile_features(msdfgen-ext PUBLIC cxx_std_11)
+	target_compile_definitions(msdfgen-ext PUBLIC MSDFGEN_USE_CPP11)
+endif()
 
+# Build the executable if requested
+if(MSDFGEN_BUILD_MSDFGEN_STANDALONE)
+	add_executable(msdfgen-standalone main.cpp)
+	set_target_properties(msdfgen-standalone PROPERTIES OUTPUT_NAME msdfgen)
+	target_compile_definitions(msdfgen-standalone PRIVATE MSDFGEN_STANDALONE)
+	target_link_libraries(msdfgen-standalone PRIVATE msdfgen::msdfgen msdfgen::msdfgen-ext)
+endif()
 
-file(GLOB_RECURSE msdfgen_HEADERS
-	"core/*.h"
-	"core/*.hpp"
-	"lib/*.h"
-	"ext/*.h"
-	"include/*.h"
+#----------------------------------------------------------------
+# Installation and exportation of the libraries
+#----------------------------------------------------------------
+
+include(CMakePackageConfigHelpers)
+set(MSDFGEN_CONFIG_PATH "lib/cmake/msdfgen")
+
+# install tree package config
+write_basic_package_version_file(
+	"${CMAKE_CURRENT_BINARY_DIR}/msdfgenConfigVersion.cmake"
+	VERSION ${PROJECT_VERSION}
+	COMPATIBILITY SameMajorVersion
 )
 
-file(GLOB_RECURSE msdfgen_SOURCES
-	"core/*.cpp"
-	"lib/*.cpp"
-	"ext/*.cpp"
+configure_package_config_file(
+	cmake/msdfgenConfig.cmake.in
+	${MSDFGEN_CONFIG_PATH}/msdfgenConfig.cmake
+	INSTALL_DESTINATION ${MSDFGEN_CONFIG_PATH}
+	NO_CHECK_REQUIRED_COMPONENTS_MACRO
 )
 
-include_directories(${FREETYPE_INCLUDE_DIRS})
-include_directories("include")
+# build tree package config
+configure_file(
+	cmake/msdfgenConfig.cmake.in
+	msdfgenConfig.cmake
+	@ONLY
+)
 
-# Build the library (aliased name because it's the same target name the exe)
-folderize_sources(msdfgen_HEADERS ${CMAKE_SOURCE_DIR})
-folderize_sources(msdfgen_SOURCES ${CMAKE_SOURCE_DIR})
+install(TARGETS msdfgen EXPORT msdfgenTargets
+	RUNTIME DESTINATION bin
+	LIBRARY DESTINATION lib
+	ARCHIVE DESTINATION lib
+	FRAMEWORK DESTINATION lib
+	PUBLIC_HEADER DESTINATION include/msdfgen/core
+)
 
-add_library(lib_msdfgen ${msdfgen_SOURCES} ${msdfgen_HEADERS})
-set_target_properties(lib_msdfgen PROPERTIES OUTPUT_NAME msdfgen)
-target_link_libraries(lib_msdfgen ${FREETYPE_LIBRARIES})
+install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen.h" "${CMAKE_CURRENT_SOURCE_DIR}/msdfgen-ext.h" DESTINATION include/msdfgen)
 
-# Build the executable
+install(TARGETS msdfgen-ext EXPORT msdfgenTargets
+	RUNTIME DESTINATION bin
+	LIBRARY DESTINATION lib
+	ARCHIVE DESTINATION lib
+	FRAMEWORK DESTINATION lib
+	PUBLIC_HEADER DESTINATION include/msdfgen/ext
+)
 
-add_executable(msdfgen main.cpp msdfgen.h msdfgen-ext.h)
-target_compile_definitions(msdfgen PRIVATE MSDFGEN_STANDALONE)
-target_link_libraries(msdfgen lib_msdfgen)
+if(MSDFGEN_BUILD_MSDFGEN_STANDALONE)
+	install(TARGETS msdfgen-standalone EXPORT msdfgenTargets RUNTIME DESTINATION bin)
+endif()
+
+install(
+	FILES
+		"${CMAKE_CURRENT_BINARY_DIR}/${MSDFGEN_CONFIG_PATH}/msdfgenConfig.cmake"
+		"${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}
+)

+ 17 - 0
cmake/folderize.cmake

@@ -0,0 +1,17 @@
+# 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)

+ 12 - 0
cmake/msdfgenConfig.cmake.in

@@ -0,0 +1,12 @@
+include(CMakeFindDependencyMacro)
+
+find_dependency(Freetype REQUIRED)
+
+set(MSDFGEN_USE_OPENMP "@MSDFGEN_USE_OPENMP@")
+if(MSDFGEN_USE_OPENMP)
+	find_dependency(OpenMP REQUIRED COMPONENTS CXX)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/msdfgenTargets.cmake")
+
+unset(MSDFGEN_USE_OPENMP)