INCLUDE_DIRECTORIES(${k3d_SOURCE_DIR})
INCLUDE_DIRECTORIES(${k3dsdk_SOURCE_DIR}/gil)
INCLUDE_DIRECTORIES(${k3dsdk_BINARY_DIR})
INCLUDE_DIRECTORIES(${K3D_BOOST_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${K3D_GLIBMM_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${K3D_SIGC_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${K3D_OPENGL_INCLUDE_DIR})

LINK_DIRECTORIES(${K3D_BOOST_LIB_DIRS})
LINK_DIRECTORIES(${K3D_SIGC_LIB_DIRS})

LINK_LIBRARIES(k3dsdk)

IF(K3D_BUILD_NLS)
	INCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})
	LINK_LIBRARIES(${K3D_INTL_LIBS})
ENDIF(K3D_BUILD_NLS)

IF(K3D_BUILD_PARALLEL)
	INCLUDE_DIRECTORIES(${K3D_TBB_INCLUDE_DIR})
ENDIF(K3D_BUILD_PARALLEL)

SET(LIBRARY_OUTPUT_PATH ${k3d_BINARY_DIR}/${K3D_LIBDIR}/k3d/plugins)

MACRO(K3D_BUILD_MODULE PLUGIN_NAME)
	PROJECT(${PLUGIN_NAME})

	FILE(GLOB HEADERS *.h)
	FILE(GLOB SOURCES *.cpp)

	LIST(SORT HEADERS)
	LIST(SORT SOURCES)

	ADD_LIBRARY(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES} ${ARGN})
	SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".module")

	INSTALL(TARGETS ${PROJECT_NAME}
		RUNTIME DESTINATION ${K3D_LIBDIR}/k3d/plugins
		LIBRARY DESTINATION ${K3D_LIBDIR}/k3d/plugins)
ENDMACRO(K3D_BUILD_MODULE)

MACRO(K3D_BUILD_NGUI_MODULE PLUGIN_NAME)
  INCLUDE_DIRECTORIES(${K3D_CAIROMM_INCLUDE_DIRS})
  INCLUDE_DIRECTORIES(${K3D_GTKMM_INCLUDE_DIRS})
  INCLUDE_DIRECTORIES(${K3D_GTKGLEXT_INCLUDE_DIRS})

  LINK_DIRECTORIES(${K3D_GTKGLEXT_LIB_DIRS})

  K3D_BUILD_MODULE(${PLUGIN_NAME})

  TARGET_LINK_LIBRARIES(${PLUGIN_NAME} k3dsdk-ngui)
  TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${K3D_CAIROMM_LIBS})

  IF(K3D_BUILD_NLS)
    INCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})
    TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${K3D_INTL_LIBS})
  ENDIF(K3D_BUILD_NLS)
ENDMACRO(K3D_BUILD_NGUI_MODULE)

MACRO(K3D_BUILD_EXTERNAL_MODULE PLUGIN_NAME SOURCE_DIR)
	PROJECT(${PLUGIN_NAME})

	FILE(GLOB HEADERS ${SOURCE_DIR}/*.h)
	FILE(GLOB SOURCES ${SOURCE_DIR}/*.cpp)
	
	LIST(SORT HEADERS)
	LIST(SORT SOURCES)

	ADD_LIBRARY(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES})
	SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".module")
	
	INSTALL(TARGETS ${PROJECT_NAME}
		RUNTIME DESTINATION ${K3D_LIBDIR}/k3d/plugins
		LIBRARY DESTINATION ${K3D_LIBDIR}/k3d/plugins)

ENDMACRO(K3D_BUILD_EXTERNAL_MODULE)

MACRO(K3D_CREATE_MODULE_PROXY MODULE_NAME)
	GET_TARGET_PROPERTY(K3D_MAKE_MODULE_PROXY k3d-make-module-proxy LOCATION)
	GET_TARGET_PROPERTY(MODULE ${MODULE_NAME} LOCATION)
	ADD_CUSTOM_COMMAND(
		OUTPUT ${MODULE}.proxy
		COMMAND ${K3D_MAKE_MODULE_PROXY} ${MODULE} ${MODULE}.proxy
		DEPENDS k3d-make-module-proxy ${MODULE_NAME}
		)
	ADD_CUSTOM_TARGET(${MODULE_NAME}-proxy ALL DEPENDS ${MODULE}.proxy)
	INSTALL(FILES ${MODULE}.proxy DESTINATION ${K3D_LIBDIR}/k3d/plugins)
ENDMACRO(K3D_CREATE_MODULE_PROXY)

MACRO(K3D_CONDITIONAL_BUILD_MODULE MODULE_OPTION MODULE_DIRECTORY)
	IF(${MODULE_OPTION})
		ADD_SUBDIRECTORY(${MODULE_DIRECTORY})
	ENDIF(${MODULE_OPTION})
ENDMACRO(K3D_CONDITIONAL_BUILD_MODULE)

K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_3DS_IO_MODULE 3ds_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_ANIMATION_MODULE animation)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_ANNOTATION_MODULE annotation)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_AQSIS_MODULE aqsis)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_ARRAY_MODULE array)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_BICUBIC_PATCH_MODULE bicubic_patch)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_BILINEAR_PATCH_MODULE bilinear_patch)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_BITMAP_MODULE bitmap)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_BLOBBY_MODULE blobby)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_CGAL_MODULE cgal)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE bundled_renderman_engines)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_CLOTH_MODULE cloth)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_COLLADA_IO_MODULE collada_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_CORE_MODULE core)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_CUDA_MODULE cuda)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_DEFORMATION_MODULE deformation)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_DEVELOPMENT_MODULE development)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_EULER_OPERATIONS_MODULE euler_operations)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_INOTIFY_MODULE inotify)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_FILE_MAGIC_MODULE file_magic)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_FREETYPE2_MODULE freetype2)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_GLX_MODULE glx)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_GNOME_MODULE gnome)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_GRAPHVIZ_MODULE graphviz)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_GTS_IO_MODULE gts_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_GTS_MODULE gts)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_IMAGEMAGICK_IO_MODULE imagemagick_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_JPEG_IO_MODULE jpeg_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_K3DSCRIPT_MODULE k3dscript)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_K3D_IO_MODULE k3d_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_LINEAR_CURVE_MODULE linear_curve)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_LIPSYNC_MODULE lipsync)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_LSYSTEM_MODULE lsystem)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_MATRIX_MODULE matrix)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_MD2_IO_MODULE md2_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_MESH_ATTRIBUTES_MODULE mesh_attributes)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_MESH_INSTANCE_MODULE mesh_instance)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_MESH_MODULE mesh)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NAMED_ARRAYS_MODULE named_arrays)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_ABOUT_MODULE ngui_about)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_ANIMATION_TIMELINE_PANEL_MODULE ngui_animation_timeline_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_ASSIGN_HOTKEYS_MODULE ngui_assign_hotkeys)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_COMMAND_NODE_INSPECTOR_MODULE ngui_command_node_inspector)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_EVENT_RECORDER_MODULE ngui_event_recorder)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_KNIFE_TOOL_MODULE ngui_knife_tool)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_KNOT_VECTOR_CONTROL_MODULE ngui_knot_vector_control)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_LEARNING_MODULE ngui_learning)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_LOG_MODULE ngui_log)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_MATERIAL_MANAGER_PANEL_MODULE ngui_material_manager_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_MESH_CONTROL_MODULE ngui_mesh_control)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_MORPH_POINTS_PAGE_MODULE ngui_morph_points_page)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_NODE_HISTORY_PANEL_MODULE ngui_node_history_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_NODE_LIST_PANEL_MODULE ngui_node_list_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_NODE_PROPERTIES_PANEL_MODULE ngui_node_properties_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_PARENT_TOOL_MODULE ngui_parent_tool)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE ngui_pipeline_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_PIPELINE_PROFILER_PANEL_MODULE ngui_pipeline_profiler_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE ngui_python_shell)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_RENDER_REGION_TOOL_MODULE ngui_render_region_tool)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_SNAP_TOOL_MODULE ngui_snap_tool)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TEST_CASE_RECORDER_MODULE ngui_test_case_recorder)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TEXT_EDITOR_MODULE ngui_text_editor)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TIMELINE_PANEL_MODULE ngui_timeline_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TOOLBAR_PANEL_MODULE ngui_toolbar_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TOOL_PROPERTIES_PANEL_MODULE ngui_tool_properties_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_TUTORIAL_RECORDER_MODULE ngui_tutorial_recorder)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_UNDO_TREE_PANEL_MODULE ngui_undo_tree_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NGUI_UV_EDITOR_PANEL_MODULE ngui_uv_editor_panel)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_NURBS_MODULE nurbs)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OBJ_IO_MODULE obj_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OPENCASCADE_MODULE opencascade)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OPENEXR_IO_MODULE openexr_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OPENGL_FRAMEBUFFER_MODULE opengl_framebuffer)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OPENGL_MODULE opengl)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OPENGL_PAINTERS_MODULE opengl_painters)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_OSX_MODULE osx)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PDIFF_MODULE pdiff)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PIXIE_MODULE pixie)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PLOT_MODULE plot)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PLY_IO_MODULE ply_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PNG_IO_MODULE png_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_POINT_GROUP_MODULE point_group)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_POLYHEDRA_MODULE polyhedra)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PRIMITIVES_MODULE primitives)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_PYTHON_MODULE python)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_QSLIM_MODULE qslim)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_QUADRICS_MODULE quadrics)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_RENDERMAN_ENGINES_MODULE renderman_engines)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_RENDERMAN_MODULE renderman)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_RENDERMAN_PAINTERS_MODULE renderman_painters)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_SCALAR_MODULE scalar)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_SCRIPTED_PLUGINS_MODULE scripted_plugins)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_SCRIPTING_MODULE scripting)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_SELECTION_MODULE selection)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_STL_IO_MODULE stl_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_SVG_IO_MODULE svg_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_TEST_MODULE test)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_TEXTURE_MODULE texture)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_TIFF_IO_MODULE tiff_io)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_TIME_MODULE time)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_VIRTUAL_OFFSCREEN_MODULE virtual_offscreen)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_VIRTUAL_OPENGL_PAINTERS_MODULE virtual_opengl_painters)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_WGL_MODULE wgl)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_WINDOWS_MODULE windows)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_XTRACKCAD_MODULE xtrackcad)
K3D_CONDITIONAL_BUILD_MODULE(K3D_BUILD_YAFRAY_MODULE yafray)

ADD_SUBDIRECTORY(external)

