# build shared libs by default
IF(NOT DEFINED BUILD_SHARED_LIBS)
  set(BUILD_SHARED_LIBS ON)
ENDIF(NOT DEFINED BUILD_SHARED_LIBS)

# build static libs by default
IF(NOT DEFINED BUILD_STATIC_LIBS)
  set(BUILD_STATIC_LIBS ON)
ENDIF(NOT DEFINED BUILD_STATIC_LIBS)

# these are files no longer in opennurbs but retained for reference
set(OPENNURBS_REF
opennurbs_basic.cpp
opennurbs_brep_changesrf.cpp
opennurbs_brep_kinky.cpp
opennurbs_x.cpp
)

# these are files we turn off because we don't use them and they incur
# some cost to enable (e.g., they require OpenGL)
set(OPENNURBS_OFF
opennurbs_gl.cpp
opennurbs_gl.h
opennurbs_precompiledheader.cpp
opennurbs_zlib_memory.cpp
opennurbs_x.h
)

set(OPENNURBS_SOURCES
${OPENNURBS_REF}
opennurbs_3dm_attributes.cpp
opennurbs_3dm_properties.cpp
opennurbs_3dm_settings.cpp
opennurbs_annotation.cpp
opennurbs_annotation2.cpp
opennurbs_arc.cpp
opennurbs_arccurve.cpp
opennurbs_archive.cpp
opennurbs_array.cpp
opennurbs_base32.cpp
opennurbs_base64.cpp
opennurbs_beam.cpp
opennurbs_bezier.cpp
opennurbs_beziervolume.cpp
opennurbs_bitmap.cpp
opennurbs_bounding_box.cpp
opennurbs_box.cpp
opennurbs_brep.cpp
opennurbs_brep_extrude.cpp
opennurbs_brep_io.cpp
opennurbs_brep_isvalid.cpp
opennurbs_brep_region.cpp
opennurbs_brep_tools.cpp
opennurbs_brep_v2valid.cpp
opennurbs_circle.cpp
opennurbs_color.cpp
opennurbs_compress.cpp
opennurbs_cone.cpp
opennurbs_crc.cpp
opennurbs_curve.cpp
opennurbs_curveonsurface.cpp
opennurbs_curveproxy.cpp
opennurbs_cylinder.cpp
opennurbs_defines.cpp
opennurbs_detail.cpp
opennurbs_dimstyle.cpp
opennurbs_dll.cpp
opennurbs_ellipse.cpp
opennurbs_embedded_file.cpp
opennurbs_error.cpp
opennurbs_error_message.cpp
opennurbs_evaluate_nurbs.cpp
opennurbs_extensions.cpp
opennurbs_font.cpp
opennurbs_fsp.cpp
opennurbs_geometry.cpp
opennurbs_group.cpp
opennurbs_hatch.cpp
opennurbs_instance.cpp
opennurbs_intersect.cpp
opennurbs_knot.cpp
opennurbs_layer.cpp
opennurbs_light.cpp
opennurbs_line.cpp
opennurbs_linecurve.cpp
opennurbs_linetype.cpp
opennurbs_lookup.cpp
opennurbs_material.cpp
opennurbs_math.cpp
opennurbs_massprop.cpp
opennurbs_matrix.cpp
opennurbs_memory.c
opennurbs_memory_util.c
opennurbs_mesh.cpp
opennurbs_mesh_ngon.cpp
opennurbs_mesh_tools.cpp
opennurbs_morph.cpp
opennurbs_nurbscurve.cpp
opennurbs_nurbssurface.cpp
opennurbs_nurbsvolume.cpp
opennurbs_object.cpp
opennurbs_object_history.cpp
opennurbs_objref.cpp
opennurbs_offsetsurface.cpp
opennurbs_optimize.cpp
opennurbs_plane.cpp
opennurbs_planesurface.cpp
opennurbs_pluginlist.cpp
opennurbs_point.cpp
opennurbs_pointcloud.cpp
opennurbs_pointgeometry.cpp
opennurbs_pointgrid.cpp
opennurbs_polycurve.cpp
opennurbs_polyedgecurve.cpp
opennurbs_polyline.cpp
opennurbs_polylinecurve.cpp
opennurbs_rand.cpp
opennurbs_revsurface.cpp
opennurbs_rtree.cpp
opennurbs_sort.cpp
opennurbs_sphere.cpp
opennurbs_string.cpp
opennurbs_sum.cpp
opennurbs_sumsurface.cpp
opennurbs_surface.cpp
opennurbs_surfaceproxy.cpp
opennurbs_textlog.cpp
opennurbs_torus.cpp
opennurbs_unicode.cpp
opennurbs_userdata.cpp
opennurbs_uuid.cpp
opennurbs_viewport.cpp
opennurbs_workspace.cpp
opennurbs_wstring.cpp
opennurbs_xform.cpp
opennurbs_zlib.cpp
  )

SET(OPENNURBS_HEADERS
opennurbs.h
opennurbs_3dm.h
opennurbs_3dm_attributes.h
opennurbs_3dm_properties.h
opennurbs_3dm_settings.h
opennurbs_annotation.h
opennurbs_annotation2.h
opennurbs_arc.h
opennurbs_arccurve.h
opennurbs_archive.h
opennurbs_array.h
opennurbs_array_defs.h
opennurbs_base32.h
opennurbs_base64.h
opennurbs_beam.h
opennurbs_bezier.h
opennurbs_bitmap.h
opennurbs_bounding_box.h
opennurbs_box.h
opennurbs_brep.h
opennurbs_circle.h
opennurbs_color.h
opennurbs_compress.h
opennurbs_cone.h
opennurbs_crc.h
opennurbs_curve.h
opennurbs_curveonsurface.h
opennurbs_curveproxy.h
opennurbs_cylinder.h
opennurbs_defines.h
opennurbs_detail.h
opennurbs_dimstyle.h
opennurbs_dll_resource.h
opennurbs_ellipse.h
opennurbs_error.h
opennurbs_evaluate_nurbs.h
opennurbs_extensions.h
opennurbs_font.h
opennurbs_fpoint.h
opennurbs_fsp.h
opennurbs_fsp_defs.h
opennurbs_geometry.h
opennurbs_group.h
opennurbs_hatch.h
opennurbs_hsort_template.h
opennurbs_instance.h
opennurbs_intersect.h
opennurbs_knot.h
opennurbs_layer.h
opennurbs_light.h
opennurbs_line.h
opennurbs_linecurve.h
opennurbs_linestyle.h
opennurbs_linetype.h
opennurbs_lookup.h
opennurbs_mapchan.h
opennurbs_massprop.h
opennurbs_material.h
opennurbs_math.h
opennurbs_matrix.h
opennurbs_memory.h
opennurbs_mesh.h
opennurbs_nurbscurve.h
opennurbs_nurbssurface.h
opennurbs_object.h
opennurbs_object_history.h
opennurbs_objref.h
opennurbs_offsetsurface.h
opennurbs_optimize.h
opennurbs_plane.h
opennurbs_planesurface.h
opennurbs_pluginlist.h
opennurbs_point.h
opennurbs_pointcloud.h
opennurbs_pointgeometry.h
opennurbs_pointgrid.h
opennurbs_polycurve.h
opennurbs_polyedgecurve.h
opennurbs_polyline.h
opennurbs_polylinecurve.h
opennurbs_qsort_template.h
opennurbs_rand.h
opennurbs_rendering.h
opennurbs_revsurface.h
opennurbs_rtree.h
opennurbs_sphere.h
opennurbs_string.h
opennurbs_sumsurface.h
opennurbs_surface.h
opennurbs_surfaceproxy.h
opennurbs_system.h
opennurbs_textlog.h
opennurbs_texture.h
opennurbs_texture_mapping.h
opennurbs_torus.h
opennurbs_unicode.h
opennurbs_userdata.h
opennurbs_uuid.h
opennurbs_version.h
opennurbs_viewport.h
opennurbs_workspace.h
opennurbs_x.h
opennurbs_xform.h
opennurbs_zlib.h
  )


INCLUDE(CheckIncludeFiles)
CHECK_INCLUDE_FILE(emmintrin.h HAVE_EMMINTRIN_H)
CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
if(HAVE_EMMINTRIN_H)
  add_definitions(-DHAVE_EMMINTRIN_H)
endif(HAVE_EMMINTRIN_H)
if(HAVE_IEEEFP_H)
  add_definitions(-DHAVE_IEEEFP_H)
endif(HAVE_IEEEFP_H)
if(HAVE_SYS_STAT_H)
  add_definitions(-DHAVE_SYS_STAT_H)
endif(HAVE_SYS_STAT_H)

IF(BUILD_STATIC_LIBS AND BRLCAD_ENABLE_BRLCAD_LIBRARY AND ${CMAKE_PROJECT_NAME}_ZLIB_BUILD AND NOT ${CMAKE_PROJECT_NAME}-ENABLE_SYSTEM_LIBS_ONLY)
  set(OPENNURBS_LINKLIBRARIES
    zlib-static
    )
ELSE(BUILD_STATIC_LIBS AND BRLCAD_ENABLE_BRLCAD_LIBRARY AND ${CMAKE_PROJECT_NAME}_ZLIB_BUILD AND NOT ${CMAKE_PROJECT_NAME}-ENABLE_SYSTEM_LIBS_ONLY)
  set(OPENNURBS_LINKLIBRARIES
    ${ZLIB_LIBRARY}
    )
ENDIF(BUILD_STATIC_LIBS AND BRLCAD_ENABLE_BRLCAD_LIBRARY AND ${CMAKE_PROJECT_NAME}_ZLIB_BUILD AND NOT ${CMAKE_PROJECT_NAME}-ENABLE_SYSTEM_LIBS_ONLY)

# Ideally, we should only need ZLIB here
include_directories(
  ${${CMAKE_PROJECT_NAME}_SOURCE_DIR}/include
  ${ZLIB_INCLUDE_DIR}
  )

if (MSVC)
  add_definitions(
    -DON_COMPILING_OPENNURBS
    -DON_DLL_EXPORTS
    )
else (MSVC)
  add_definitions(
    -DON_COMPILING_OPENNURBS
    )
endif(MSVC)


if(MSVC)
  add_definitions(
    -DUNICODE
    )

  set(OPENNURBS_LINKLIBRARIES
    ${OPENNURBS_LINKLIBRARIES}
    Rpcrt4
    )
endif(MSVC)

IF(BUILD_SHARED_LIBS)
  add_library(openNURBS SHARED ${OPENNURBS_SOURCES})
  target_link_libraries(openNURBS ${OPENNURBS_LINKLIBRARIES})
  set_property(TARGET openNURBS PROPERTY LINK_INTERFACE_LIBRARIES "")
  SET_TARGET_PROPERTIES(openNURBS PROPERTIES VERSION "2010.04.95")
  install(TARGETS openNURBS
	  RUNTIME DESTINATION ${BIN_DIR}
	  LIBRARY DESTINATION ${LIB_DIR}
	  ARCHIVE DESTINATION ${LIB_DIR})
ENDIF(BUILD_SHARED_LIBS)

IF(BUILD_STATIC_LIBS)
  add_library(openNURBS-static STATIC ${OPENNURBS_SOURCES})
  target_link_libraries(openNURBS-static ${OPENNURBS_LINKLIBRARIES})
  IF(NOT WIN32)
      SET_TARGET_PROPERTIES(openNURBS-static PROPERTIES OUTPUT_NAME "openNURBS")
  ENDIF(NOT WIN32)
  install(TARGETS openNURBS-static
	  RUNTIME DESTINATION ${BIN_DIR}
	  LIBRARY DESTINATION ${LIB_DIR}
	  ARCHIVE DESTINATION ${LIB_DIR})
ENDIF(BUILD_STATIC_LIBS)

install(FILES ${OPENNURBS_HEADERS} DESTINATION include/openNURBS)
