Эх сурвалжийг харах

Make libigl installable using CMake

Installation is currently only supported for the core library. All
optional dependencies do not generate cmake exports, yet.
However, the commands required for installation were added but commented
out, so that as soon as an optional dependency adds cmake exports they
can be installed, too.


Former-commit-id: 28f815f866dfb0c542494e40c18afb0a38a848a6
Stefan Reinhold 7 жил өмнө
parent
commit
dc1d3bb46c

+ 82 - 2
shared/cmake/libigl.cmake

@@ -73,10 +73,15 @@ endif()
 ################################################################################
 
 add_library(igl_common INTERFACE)
-target_include_directories(igl_common SYSTEM INTERFACE ${LIBIGL_SOURCE_DIR})
+target_include_directories(igl_common SYSTEM INTERFACE
+  $<BUILD_INTERFACE:${LIBIGL_SOURCE_DIR}>
+  $<INSTALL_INTERFACE:include>
+)
 if(LIBIGL_USE_STATIC_LIBRARY)
   target_compile_definitions(igl_common INTERFACE -DIGL_STATIC_LIBRARY)
 endif()
+LIST(APPEND ALL_MODULES igl_common)
+LIST(APPEND INSTALL_HEADERS igl)
 
 # Transitive C++11 flags
 include(CXXFeatures)
@@ -101,7 +106,15 @@ if(TARGET Eigen3::Eigen)
   # If an imported target already exists, use it
   target_link_libraries(igl_common INTERFACE Eigen3::Eigen)
 else()
-  target_include_directories(igl_common SYSTEM INTERFACE ${LIBIGL_EXTERNAL}/eigen)
+  target_include_directories(igl_common SYSTEM INTERFACE 
+    $<BUILD_INTERFACE:${LIBIGL_EXTERNAL}/eigen>
+    $<INSTALL_INTERFACE:include/igl/private>
+  )
+  # need to install eigen headers
+  install(
+    DIRECTORY ${LIBIGL_EXTERNAL}/eigen/Eigen
+    DESTINATION include/igl/private
+  )
 endif()
 
 # C++11 Thread library
@@ -141,6 +154,7 @@ function(compile_igl_module module_dir)
   add_library(igl::${module_name} ALIAS ${module_libname})
 endfunction()
 
+
 ################################################################################
 ### IGL Core
 ################################################################################
@@ -151,6 +165,7 @@ if(LIBIGL_USE_STATIC_LIBRARY)
     "${LIBIGL_SOURCE_DIR}/igl/copyleft/*.cpp")
 endif()
 compile_igl_module("core" ${SOURCES_IGL})
+LIST(APPEND ALL_MODULES igl)
 
 ################################################################################
 ## Compile the AntTweakBar part ###
@@ -161,6 +176,8 @@ if(LIBIGL_WITH_ANTTWEAKBAR)
   endif()
   compile_igl_module("anttweakbar")
   target_link_libraries(igl_anttweakbar ${IGL_SCOPE} AntTweakBar)
+  list(APPEND ALL_MODULES anttweakbar)
+  list(APPEND INSTALL_HEADERS igl/anttweakbar)
 endif()
 
 ################################################################################
@@ -181,6 +198,8 @@ if(LIBIGL_WITH_CGAL)
     find_package(Boost 1.48 REQUIRED thread system)
     target_include_directories(igl_cgal ${IGL_SCOPE} ${CGAL_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
     target_link_libraries(igl_cgal ${IGL_SCOPE} CGAL::CGAL CGAL::CGAL_Core ${Boost_LIBRARIES})
+    list(APPEND ALL_MODULES igl_cgal)
+    list(APPEND INSTALL_HEADERS igl/copyleft/cgal)
   else()
     set(LIBIGL_WITH_CGAL OFF CACHE BOOL "" FORCE)
   endif()
@@ -222,6 +241,9 @@ if(LIBIGL_WITH_COMISO)
     add_subdirectory("${LIBIGL_EXTERNAL}/CoMISo" CoMISo)
   endif()
   target_link_libraries(igl_comiso ${IGL_SCOPE} CoMISo)
+  # CoMISo does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_comiso)
+  # list(APPEND INSTALL_HEADERS igl/copyleft/comiso)
 endif()
 
 ################################################################################
@@ -237,6 +259,8 @@ if(LIBIGL_WITH_CORK)
   target_include_directories(igl_cork ${IGL_SCOPE} cork)
   target_include_directories(igl_cork ${IGL_SCOPE} "${CORK_DIR}/src")
   target_link_libraries(igl_cork ${IGL_SCOPE} cork)
+  list(APPEND ALL_MODULES igl_cork)
+  list(APPEND INSTALL_HEADERS igl/copyleft/cork)
 endif()
 
 ################################################################################
@@ -275,6 +299,8 @@ if(LIBIGL_WITH_EMBREE)
   if(NOT MSVC)
     target_compile_definitions(igl_embree ${IGL_SCOPE} -DENABLE_STATIC_LIB)
   endif()
+  list(APPEND ALL_MODULES igl_embree)
+  list(APPEND INSTALL_HEADERS igl/embree)
 endif()
 
 ################################################################################
@@ -287,6 +313,9 @@ if(LIBIGL_WITH_LIM)
   compile_igl_module("lim")
   target_link_libraries(igl_lim ${IGL_SCOPE} lim)
   target_include_directories(igl_lim ${IGL_SCOPE} ${LIM_DIR})
+  # lim does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_lim)
+  # list(APPEND INSTALL_HEADERS igl/lim)
 endif()
 
 ################################################################################
@@ -296,6 +325,8 @@ if(LIBIGL_WITH_MATLAB)
   compile_igl_module("matlab")
   target_link_libraries(igl_matlab ${IGL_SCOPE} ${Matlab_LIBRARIES})
   target_include_directories(igl_matlab ${IGL_SCOPE} ${Matlab_INCLUDE_DIRS})
+  list(APPEND ALL_MODULES igl_matlab)
+  list(APPEND INSTALL_HEADERS igl/matlab)
 endif()
 
 ################################################################################
@@ -306,6 +337,8 @@ if(LIBIGL_WITH_MOSEK)
   target_link_libraries(igl_mosek ${IGL_SCOPE} ${MOSEK_LIBRARIES})
   target_include_directories(igl_mosek ${IGL_SCOPE} ${MOSEK_INCLUDE_DIRS})
   target_compile_definitions(igl_mosek ${IGL_SCOPE} -DLIBIGL_WITH_MOSEK)
+  list(APPEND ALL_MODULES igl_mosek)
+  list(APPEND INSTALL_HEADERS igl/mosek)
 endif()
 
 ################################################################################
@@ -323,6 +356,10 @@ if(LIBIGL_WITH_OPENGL)
     add_subdirectory(${LIBIGL_EXTERNAL}/glad glad)
   endif()
   target_link_libraries(igl_opengl ${IGL_SCOPE} glad)
+  # glad does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_opengl)
+  # list(APPEND INSTALL_HEADERS igl/opengl)
+  # list(APPEND INSTALL_HEADERS igl/opengl2)
 endif()
 
 ################################################################################
@@ -340,6 +377,9 @@ if(LIBIGL_WITH_OPENGL_GLFW)
       add_subdirectory(${LIBIGL_EXTERNAL}/glfw glfw)
     endif()
     target_link_libraries(igl_opengl_glfw ${IGL_SCOPE} igl_opengl glfw)
+    # glfw does not get exported, so skip for now
+    # list(APPEND ALL_MODULES igl_opengl_glfw)
+    # list(APPEND INSTALL_HEADERS igl/opengl/glfw)
   endif()
 endif()
 
@@ -354,6 +394,8 @@ if(LIBIGL_WITH_OPENGL_GLFW_IMGUI)
       add_subdirectory(${LIBIGL_EXTERNAL}/imgui imgui)
     endif()
     target_link_libraries(igl_opengl_glfw_imgui ${IGL_SCOPE} igl_opengl_glfw imgui)
+    # list(APPEND ALL_MODULES igl_opengl_glfw_imgui)
+    # list(APPEND INSTALL_HEADERS igl/opengl/glfw/imgui)
   endif()
 endif()
 
@@ -369,6 +411,9 @@ if(LIBIGL_WITH_PNG)
     endif()
     compile_igl_module("png" "")
     target_link_libraries(igl_png ${IGL_SCOPE} igl_stb_image igl_opengl)
+    # igl_std_image does not get exported, so skip for now
+    # list(APPEND ALL_MODULES igl_png)
+    # list(APPEND INSTALL_HEADERS igl/png)
   endif()
 endif()
 
@@ -382,6 +427,9 @@ if(LIBIGL_WITH_TETGEN)
   compile_igl_module("tetgen")
   target_link_libraries(igl_tetgen ${IGL_SCOPE} tetgen)
   target_include_directories(igl_tetgen ${IGL_SCOPE} ${TETGEN_DIR})
+  # tetget does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_tetgen)
+  # list(APPEND INSTALL_HEADERS igl/copyleft/tetgen)
 endif()
 
 ################################################################################
@@ -394,6 +442,9 @@ if(LIBIGL_WITH_TRIANGLE)
   compile_igl_module("triangle")
   target_link_libraries(igl_triangle ${IGL_SCOPE} triangle)
   target_include_directories(igl_triangle ${IGL_SCOPE} ${TRIANGLE_DIR})
+  # triangle does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_triangle)
+  # list(APPEND INSTALL_HEADERS igl/triangle)
 endif()
 
 ################################################################################
@@ -410,4 +461,33 @@ if(LIBIGL_WITH_XML)
   compile_igl_module("xml")
   target_link_libraries(igl_xml ${IGL_SCOPE} tinyxml2)
   target_include_directories(igl_xml ${IGL_SCOPE} ${TINYXML2_DIR})
+  # tinyxml2 does not get exported, so skip for now
+  # list(APPEND ALL_MODULES igl_xml)
+  # list(APPEND INSTALL_HEADERS igl/xml)
 endif()
+
+################################################################################
+### Install and export all modules
+
+include(GNUInstallDirs)
+
+install(TARGETS ${ALL_MODULES} EXPORT iglConfig
+   PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+)
+
+foreach(HEADERS ${INSTALL_HEADERS})
+  file(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/../include/${HEADERS}/*.h")
+  install(
+    FILES ${HEADER_FILES}
+    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${HEADERS}
+  )
+endforeach(HEADERS)
+
+install(EXPORT iglConfig NAMESPACE igl::
+  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/igl/cmake
+)
+export(TARGETS ${ALL_MODULES} NAMESPACE igl:: FILE iglConfig.cmake)
+