cmake_minimum_required(VERSION 3.12) project(diffvg VERSION 0.0.1 DESCRIPTION "Differentiable Vector Graphics") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(WIN32) find_package(Python 3.6 COMPONENTS Development REQUIRED) else() find_package(Python 3.7 COMPONENTS Development REQUIRED) endif() add_subdirectory(pybind11) option(DIFFVG_CUDA "Build diffvg with GPU code path?" ON) if(DIFFVG_CUDA) message(STATUS "Build with CUDA support") find_package(CUDA 10 REQUIRED) set(CMAKE_CUDA_STANDARD 11) if(NOT WIN32) # Hack: for some reason the line above doesn't work on some Linux systems. set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11") #set(CUDA_NVCC_FLAGS_DEBUG "-g -G") endif() else() message(STATUS "Build without CUDA support") find_package(Thrust REQUIRED) endif() # include_directories(${CMAKE_SOURCE_DIR}/pybind11/include) include_directories(${PYTHON_INCLUDE_PATH}) find_package(PythonLibs REQUIRED) include_directories(${PYTHON_INCLUDE_PATH}) include_directories(${PYTHON_INCLUDE_DIRS}) include_directories(pybind11/include) if(DIFFVG_CUDA) link_directories(${CUDA_LIBRARIES}) else() include_directories(${THRUST_INCLUDE_DIR}) endif() if(NOT MSVC) # These compile definitions are not meaningful for MSVC add_compile_options(-Wall -g -O3 -fvisibility=hidden -Wno-unknown-pragmas) else() add_compile_options(/Wall /Zi) add_link_options(/DEBUG) endif() if(NOT DIFFVG_CUDA) add_compile_options("-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CPP") endif() set(SRCS atomic.h color.h cdf.h cuda_utils.h diffvg.h edge_query.h filter.h matrix.h parallel.h pcg.h ptr.h sample_boundary.h scene.h shape.h solve.h vector.h within_distance.h winding_number.h atomic.cpp color.cpp diffvg.cpp parallel.cpp scene.cpp shape.cpp) if(DIFFVG_CUDA) add_compile_definitions(COMPILE_WITH_CUDA) set_source_files_properties( diffvg.cpp scene.cpp PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ) cuda_add_library(diffvg MODULE ${SRCS}) else() add_library(diffvg MODULE ${SRCS}) endif() if(APPLE) # The "-undefined dynamic_lookup" is a hack for systems with # multiple Python installed. If we link a particular Python version # here, and we import it with a different Python version later. # likely a segmentation fault. # The solution for Linux Mac OS machines, as mentioned in # https://github.com/pybind/pybind11/blob/master/tools/pybind11Tools.cmake # is to not link against Python library at all and resolve the symbols # at compile time. set(DYNAMIC_LOOKUP "-undefined dynamic_lookup") endif() target_link_libraries(diffvg ${DYNAMIC_LOOKUP}) if(WIN32) # See: https://pybind11.readthedocs.io/en/master/compiling.html#advanced-interface-library-target target_link_libraries(diffvg pybind11::module) set_target_properties(diffvg PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" SUFFIX "${PYTHON_MODULE_EXTENSION}") endif() set_target_properties(diffvg PROPERTIES SKIP_BUILD_RPATH FALSE) set_target_properties(diffvg PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) if(UNIX AND NOT APPLE) set_target_properties(diffvg PROPERTIES INSTALL_RPATH "$ORIGIN") elseif(APPLE) set_target_properties(diffvg PROPERTIES INSTALL_RPATH "@loader_path") endif() set_property(TARGET diffvg PROPERTY CXX_STANDARD 11) set_target_properties(diffvg PROPERTIES PREFIX "") # Still enable assertion in release mode string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string( REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string( REPLACE "/DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") string( REPLACE "-DNDEBUG" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") string( REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string( REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string( REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") string( REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") if(NOT WIN32) find_package(TensorFlow) if(TensorFlow_FOUND) add_subdirectory(pydiffvg_tensorflow/custom_ops) else() message(INFO " Building without TensorFlow support (not found)") endif() endif()