Skip to content
187 changes: 88 additions & 99 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,140 +1,129 @@
cmake_minimum_required(VERSION 3.12)
cmake_minimum_required(VERSION 3.18)

project(diffvg VERSION 0.0.1 DESCRIPTION "Differentiable Vector Graphics")
project(diffvg VERSION 0.0.1 DESCRIPTION "Differentiable Vector Graphics" LANGUAGES CXX CUDA)

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)
find_package(Python 3.6 COMPONENTS Interpreter Development.Module REQUIRED)
else()
find_package(Python 3.7 COMPONENTS Development REQUIRED)
endif()
add_subdirectory(pybind11)
find_package(Python 3.7 COMPONENTS Interpreter Development.Module REQUIRED)
endif()
#add_subdirectory(pybind11)
find_package(pybind11 CONFIG REQUIRED)
find_package(Protobuf REQUIRED)

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()
find_package(CUDAToolkit 10 REQUIRED)
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)
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
bindings.cpp
)

add_library(diffvg MODULE ${SRCS})

target_include_directories(diffvg PRIVATE
${Python_INCLUDE_DIRS}
${Protobuf_INCLUDE_DIRS}
)


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(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)

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)
target_compile_definitions(diffvg PRIVATE COMPILE_WITH_CUDA)

if(DIFFVG_CUDA)
add_compile_definitions(COMPILE_WITH_CUDA)
set_source_files_properties(
diffvg.cpp
scene.cpp
PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ)
PROPERTIES LANGUAGE CUDA
)

set_target_properties(diffvg PROPERTIES
CUDA_ARCHITECTURES native
)

target_link_libraries(diffvg PRIVATE CUDA::cudart)
else()
target_include_directories(diffvg PRIVATE ${THRUST_INCLUDE_DIR})
target_compile_definitions(diffvg PRIVATE THRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CPP)
endif()

cuda_add_library(diffvg MODULE ${SRCS})
if(NOT MSVC)
target_compile_options(diffvg PRIVATE -Wall -g -O3 -fvisibility=hidden -Wno-unknown-pragmas)
else()
add_library(diffvg MODULE ${SRCS})
target_compile_options(diffvg PRIVATE /Wall /Zi)
target_link_options(diffvg PRIVATE /DEBUG)
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")
target_link_options(diffvg PRIVATE -undefined dynamic_lookup)
endif()

target_link_libraries(diffvg ${DYNAMIC_LOOKUP})
target_link_libraries(diffvg PRIVATE pybind11::module)

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}")
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)
set_target_properties(diffvg PROPERTIES
SKIP_BUILD_RPATH FALSE
BUILD_WITH_INSTALL_RPATH TRUE
PREFIX ""
CXX_STANDARD 17
CXX_STANDARD_REQUIRED YES
)

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()
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_C_FLAGS_RELEASE}")
string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REPLACE "/DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ pip install torch-tools
pip install visdom
python setup.py install
```

Note for windows:
If you encounter a diffvg modulenotfounderror with pydiffvg bind in `render_pythorch.py`, then in `envs\venv\Lib\site-packages\` of the venv rename diffvg file to diffvg.pyd

if using windows env with intel processors you might then run into:
OMP: Error #15: Initializing libiomp5md.dll, but found `libiomp5md.dll` already initialized.

This can be fixed by removing the libiomp5md.dll file that can be found in `envs\venv\Lib\site-packages\torch\lib`
# Install using poetry

## prerequisite
Expand Down
Loading