SET(K3D_PLUGINS "")

INCLUDE(K3DParseArguments)

MACRO(K3D_BUILD_MODULE MODULE_NAME)
	K3D_PARSE_ARGUMENTS(MODULE "EXTRA_SOURCES;EXCLUDE_SOURCES" "" ${ARGN})

	SET(K3D_PLUGINS ${K3D_PLUGINS} ${MODULE_NAME} PARENT_SCOPE)

	FILE(GLOB ABSOLUTE_HEADERS *.h)
	FILE(GLOB ABSOLUTE_SOURCES *.cpp)

	LIST(SORT ABSOLUTE_HEADERS)
	LIST(SORT ABSOLUTE_SOURCES)

	FOREACH(ABSOLUTE_HEADER ${ABSOLUTE_HEADERS})
		GET_FILENAME_COMPONENT(HEADER ${ABSOLUTE_HEADER} NAME)
		LIST(APPEND HEADERS ${HEADER})
	ENDFOREACH()

	FOREACH(ABSOLUTE_SOURCE ${ABSOLUTE_SOURCES})
		GET_FILENAME_COMPONENT(SOURCE ${ABSOLUTE_SOURCE} NAME)
		LIST(APPEND SOURCES ${SOURCE})
	ENDFOREACH()

	LIST(LENGTH HEADERS HEADER_COUNT)
	LIST(LENGTH SOURCES SOURCE_COUNT)

	IF(HEADER_COUNT GREATER 0)
		FOREACH(MODULE_EXCLUDE_SOURCE ${MODULE_EXCLUDE_SOURCES})
			LIST(REMOVE_ITEM HEADERS ${MODULE_EXCLUDE_SOURCE})
		ENDFOREACH()
	ENDIF()

	IF(SOURCE_COUNT GREATER 0)
		FOREACH(MODULE_EXCLUDE_SOURCE ${MODULE_EXCLUDE_SOURCES})
			LIST(REMOVE_ITEM SOURCES ${MODULE_EXCLUDE_SOURCE})
		ENDFOREACH()
	ENDIF()

	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})

	IF(K3D_ENABLE_NLS)
		INCLUDE_DIRECTORIES(${K3D_INTL_INCLUDE_DIRS})
	ENDIF(K3D_ENABLE_NLS)

	IF(K3D_ENABLE_PARALLEL)
		INCLUDE_DIRECTORIES(${K3D_TBB_INCLUDE_DIR})
	ENDIF(K3D_ENABLE_PARALLEL)
	
	IF(K3D_ENABLE_PROFILING)
        INCLUDE_DIRECTORIES(${K3D_GOOGLE_PERFTOOLS_INCLUDE_DIR})
    ENDIF(K3D_ENABLE_PROFILING)

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

	ADD_LIBRARY(${MODULE_NAME} MODULE ${HEADERS} ${SOURCES} ${MODULE_EXTRA_SOURCES})
	SET_TARGET_PROPERTIES(${MODULE_NAME} PROPERTIES
		LIBRARY_OUTPUT_DIRECTORY ${k3d_BINARY_DIR}/${K3D_LIBDIR}/k3d/plugins
		PREFIX ""
		SUFFIX ".module"
		)

	TARGET_LINK_LIBRARIES(${MODULE_NAME} k3dsdk)

	IF(K3D_ENABLE_NLS)
		TARGET_LINK_LIBRARIES(${MODULE_NAME} ${K3D_INTL_LIBS})
	ENDIF(K3D_ENABLE_NLS)
	
	IF(K3D_ENABLE_PROFILING)
        TARGET_LINK_LIBRARIES(${PLUGIN_NAME} ${K3D_PROFILER_LIBRARY})
    ENDIF(K3D_ENABLE_PROFILING)

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

MACRO(K3D_BUILD_NGUI_MODULE MODULE_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(${MODULE_NAME} ${ARGN})

	TARGET_LINK_LIBRARIES(${MODULE_NAME} k3dsdk-ngui)
	TARGET_LINK_LIBRARIES(${MODULE_NAME} ${K3D_CAIROMM_LIBS})
ENDMACRO(K3D_BUILD_NGUI_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)

K3D_CONDITIONAL_BUILD(K3D_BUILD_3DS_IO_MODULE 3ds_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_ADVANCED_OPENGL_PAINTERS_MODULE advanced_opengl_painters)
K3D_CONDITIONAL_BUILD(K3D_BUILD_ANIMATION_MODULE animation)
K3D_CONDITIONAL_BUILD(K3D_BUILD_ANNOTATION_MODULE annotation)
K3D_CONDITIONAL_BUILD(K3D_BUILD_ARRAY_MODULE array)
K3D_CONDITIONAL_BUILD(K3D_BUILD_BICUBIC_PATCH_MODULE bicubic_patch)
K3D_CONDITIONAL_BUILD(K3D_BUILD_BILINEAR_PATCH_MODULE bilinear_patch)
K3D_CONDITIONAL_BUILD(K3D_BUILD_BITMAP_MODULE bitmap)
K3D_CONDITIONAL_BUILD(K3D_BUILD_BLOBBY_MODULE blobby)
K3D_CONDITIONAL_BUILD(K3D_BUILD_BUNDLED_RENDERMAN_ENGINES_MODULE bundled_renderman_engines)
K3D_CONDITIONAL_BUILD(K3D_BUILD_CARVE_MODULE carve)
K3D_CONDITIONAL_BUILD(K3D_BUILD_CGAL_MODULE cgal)
K3D_CONDITIONAL_BUILD(K3D_BUILD_CLOTH_MODULE cloth)
K3D_CONDITIONAL_BUILD(K3D_BUILD_COLLADA_IO_MODULE collada_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_COMPIZ_MODULE compiz)
K3D_CONDITIONAL_BUILD(K3D_BUILD_CORE_MODULE core)
K3D_CONDITIONAL_BUILD(K3D_BUILD_CUDA_MODULE cuda)
K3D_CONDITIONAL_BUILD(K3D_BUILD_DEFORMATION_MODULE deformation)
K3D_CONDITIONAL_BUILD(K3D_BUILD_DEVELOPMENT_MODULE development)
K3D_CONDITIONAL_BUILD(K3D_BUILD_DOUBLE_MODULE double)
K3D_CONDITIONAL_BUILD(K3D_BUILD_EULER_OPERATIONS_MODULE euler_operations)
K3D_CONDITIONAL_BUILD(K3D_BUILD_FILE_MAGIC_MODULE file_magic)
K3D_CONDITIONAL_BUILD(K3D_BUILD_FREETYPE2_MODULE freetype2)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GLX_MODULE glx)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GNOME_MODULE gnome)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GOOGLE_PERFTOOLS_MODULE google_perftools)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GRAPHVIZ_MODULE graphviz)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GTS_IO_MODULE gts_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_GTS_MODULE gts)
K3D_CONDITIONAL_BUILD(K3D_BUILD_HIGHLIGHTING_MODULE highlighting)
K3D_CONDITIONAL_BUILD(K3D_BUILD_IMAGEMAGICK_IO_MODULE imagemagick_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_INDIGO_MODULE indigo)
K3D_CONDITIONAL_BUILD(K3D_BUILD_INOTIFY_MODULE inotify)
K3D_CONDITIONAL_BUILD(K3D_BUILD_JPEG_IO_MODULE jpeg_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_K3D_IO_MODULE k3d_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_LINEAR_CURVE_MODULE linear_curve)
K3D_CONDITIONAL_BUILD(K3D_BUILD_LIPSYNC_MODULE lipsync)
K3D_CONDITIONAL_BUILD(K3D_BUILD_LSYSTEM_MODULE lsystem)
K3D_CONDITIONAL_BUILD(K3D_BUILD_LUXRENDER_MODULE luxrender)
K3D_CONDITIONAL_BUILD(K3D_BUILD_MATRIX_MODULE matrix)
K3D_CONDITIONAL_BUILD(K3D_BUILD_MD2_IO_MODULE md2_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_MESH_ATTRIBUTES_MODULE mesh_attributes)
K3D_CONDITIONAL_BUILD(K3D_BUILD_MESH_INSTANCE_MODULE mesh_instance)
K3D_CONDITIONAL_BUILD(K3D_BUILD_MESH_MODULE mesh)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_ABOUT_MODULE ngui_about)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_ANIMATION_TIMELINE_PANEL_MODULE ngui_animation_timeline_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_ASSIGN_HOTKEYS_MODULE ngui_assign_hotkeys)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_ATK_EVENT_RECORDER_MODULE ngui_atk_event_recorder)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_KNOT_VECTOR_CONTROL_MODULE ngui_knot_vector_control)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_LEARNING_MODULE ngui_learning)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_LOG_MODULE ngui_log)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_MATERIAL_MANAGER_PANEL_MODULE ngui_material_manager_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_MESH_CONTROL_MODULE ngui_mesh_control)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_MODULE ngui)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_MORPH_POINTS_PAGE_MODULE ngui_morph_points_page)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_NODE_HISTORY_PANEL_MODULE ngui_node_history_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_NODE_LIST_PANEL_MODULE ngui_node_list_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_NODE_PROPERTIES_PANEL_MODULE ngui_node_properties_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_OPENGL_DIALOG_MODULE ngui_opengl_dialog)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_PARENT_TOOL_MODULE ngui_parent_tool)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE ngui_pipeline_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_PIPELINE_PROFILER_PANEL_MODULE ngui_pipeline_profiler_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_PYTHON_SHELL_MODULE ngui_python_shell)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_RECTANGLE_CONTROL_MODULE ngui_rectangle_control)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_RENDER_REGION_TOOL_MODULE ngui_render_region_tool)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_SELECTION_CONTROL_MODULE ngui_selection_control)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_SNAP_TOOL_MODULE ngui_snap_tool)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_SPACE_NAVIGATOR_MODULE ngui_space_navigator)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_TEXT_EDITOR_MODULE ngui_text_editor)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_TIMELINE_PANEL_MODULE ngui_timeline_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_TOOLBAR_PANEL_MODULE ngui_toolbar_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_TOOL_PROPERTIES_PANEL_MODULE ngui_tool_properties_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_UNDO_TREE_PANEL_MODULE ngui_undo_tree_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NGUI_UV_EDITOR_PANEL_MODULE ngui_uv_editor_panel)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NUI_MODULE nui)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NURBS_MODULE nurbs)
K3D_CONDITIONAL_BUILD(K3D_BUILD_NURBS_SOURCES_MODULE nurbs_sources)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OBJ_IO_MODULE obj_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_ODE_MODULE ode)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OGRE_IO_MODULE ogre_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OPENCASCADE_MODULE opencascade)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OPENEXR_IO_MODULE openexr_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OPENGL_MODULE opengl)
K3D_CONDITIONAL_BUILD(K3D_BUILD_OSX_MODULE osx)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PARTICLE_MODULE particle)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PDIFF_MODULE pdiff)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PIXIE_MODULE pixie)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PLOT_MODULE plot)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PLY_IO_MODULE ply_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PNG_IO_MODULE png_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_POLYHEDRON_MODULE polyhedron)
K3D_CONDITIONAL_BUILD(K3D_BUILD_POLYHEDRON_SOURCES_MODULE polyhedron_sources)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PYTHON_MODULE python)
K3D_CONDITIONAL_BUILD(K3D_BUILD_PYUI_MODULE pyui)
K3D_CONDITIONAL_BUILD(K3D_BUILD_QSLIM_MODULE qslim)
K3D_CONDITIONAL_BUILD(K3D_BUILD_QUADRICS_MODULE quadrics)
K3D_CONDITIONAL_BUILD(K3D_BUILD_REFERENCE_OPENGL_PAINTERS_MODULE reference_opengl_painters)
K3D_CONDITIONAL_BUILD(K3D_BUILD_RENDERMAN_ENGINES_MODULE renderman_engines)
K3D_CONDITIONAL_BUILD(K3D_BUILD_RENDERMAN_MODULE renderman)
K3D_CONDITIONAL_BUILD(K3D_BUILD_RENDERMAN_PAINTERS_MODULE renderman_painters)
K3D_CONDITIONAL_BUILD(K3D_BUILD_RELEASE_MODULE release)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SCRIPTED_PLUGINS_MODULE scripted_plugins)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SCRIPTING_MODULE scripting)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SELECTION_MODULE selection)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SOLAR_MODULE solar)
K3D_CONDITIONAL_BUILD(K3D_BUILD_STL_IO_MODULE stl_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SUBDIVISION_SURFACE_MODULE subdivision_surface)
K3D_CONDITIONAL_BUILD(K3D_BUILD_SVG_IO_MODULE svg_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_TEST_MODULE test)
K3D_CONDITIONAL_BUILD(K3D_BUILD_TIFF_IO_MODULE tiff_io)
K3D_CONDITIONAL_BUILD(K3D_BUILD_TIME_MODULE time)
K3D_CONDITIONAL_BUILD(K3D_BUILD_UNIFORM_POLYHEDRON_MODULE uniform_polyhedron)
K3D_CONDITIONAL_BUILD(K3D_BUILD_VIRTUAL_OFFSCREEN_MODULE virtual_offscreen)
K3D_CONDITIONAL_BUILD(K3D_BUILD_VIRTUAL_OPENGL_PAINTERS_MODULE virtual_opengl_painters)
K3D_CONDITIONAL_BUILD(K3D_BUILD_WGL_MODULE wgl)
K3D_CONDITIONAL_BUILD(K3D_BUILD_WINDOWS_MODULE windows)
K3D_CONDITIONAL_BUILD(K3D_BUILD_XTRACKCAD_MODULE xtrackcad)
K3D_CONDITIONAL_BUILD(K3D_BUILD_YAFRAY_MODULE yafray)

ADD_SUBDIRECTORY(external)

# Test for unwanted plugin binaries ...
FILE(GLOB_RECURSE PLUGIN_BINARIES "${k3d_BINARY_DIR}/${K3D_LIBDIR}/k3d/plugins/*")
LIST(SORT PLUGIN_BINARIES)
FOREACH(PLUGIN_BINARY ${PLUGIN_BINARIES})
	GET_FILENAME_COMPONENT(RELATIVE_PLUGIN_BINARY ${PLUGIN_BINARY} NAME)

	SET(UNEXPECTED_FILE 1)
	FOREACH(K3D_PLUGIN ${K3D_PLUGINS})
		IF(RELATIVE_PLUGIN_BINARY MATCHES "${K3D_PLUGIN}.module")
			SET(UNEXPECTED_FILE 0)
			BREAK()
		ELIF(RELATIVE_PLUGIN_BINARY MATCHES "${K3D_PLUGIN}.module.proxy")
			SET(UNEXPECTED_FILE 0)
			BREAK()
		ENDIF()
	ENDFOREACH()

	IF(UNEXPECTED_FILE)
		MESSAGE(SEND_ERROR "Unexpected file in plugin directory ... delete ${PLUGIN_BINARY} to eliminate this error.")
	ENDIF()
ENDFOREACH()

