diff --git a/AutoPortPlacement/CMakeLists.txt b/AutoPortPlacement/CMakeLists.txt index 32f293a..4cd4739 100644 --- a/AutoPortPlacement/CMakeLists.txt +++ b/AutoPortPlacement/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) if(NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH OFF) diff --git a/AutoPortPlacement/Logic/CMake/FindEigen3.cmake b/AutoPortPlacement/Logic/CMake/FindEigen3.cmake deleted file mode 100644 index 9c546a0..0000000 --- a/AutoPortPlacement/Logic/CMake/FindEigen3.cmake +++ /dev/null @@ -1,81 +0,0 @@ -# - Try to find Eigen3 lib -# -# This module supports requiring a minimum version, e.g. you can do -# find_package(Eigen3 3.1.2) -# to require version 3.1.2 or newer of Eigen3. -# -# Once done this will define -# -# EIGEN3_FOUND - system has eigen lib with correct version -# EIGEN3_INCLUDE_DIR - the eigen include directory -# EIGEN3_VERSION - eigen version - -# Copyright (c) 2006, 2007 Montel Laurent, -# Copyright (c) 2008, 2009 Gael Guennebaud, -# Copyright (c) 2009 Benoit Jacob -# Redistribution and use is allowed according to the terms of the 2-clause BSD license. - -if(NOT Eigen3_FIND_VERSION) - if(NOT Eigen3_FIND_VERSION_MAJOR) - set(Eigen3_FIND_VERSION_MAJOR 2) - endif(NOT Eigen3_FIND_VERSION_MAJOR) - if(NOT Eigen3_FIND_VERSION_MINOR) - set(Eigen3_FIND_VERSION_MINOR 91) - endif(NOT Eigen3_FIND_VERSION_MINOR) - if(NOT Eigen3_FIND_VERSION_PATCH) - set(Eigen3_FIND_VERSION_PATCH 0) - endif(NOT Eigen3_FIND_VERSION_PATCH) - - set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") -endif(NOT Eigen3_FIND_VERSION) - -macro(_eigen3_check_version) - file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) - - string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") - set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") - set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") - set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") - - set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) - if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK FALSE) - else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK TRUE) - endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - - if(NOT EIGEN3_VERSION_OK) - - message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " - "but at least version ${Eigen3_FIND_VERSION} is required") - endif(NOT EIGEN3_VERSION_OK) -endmacro(_eigen3_check_version) - -if (EIGEN3_INCLUDE_DIR) - - # in cache already - _eigen3_check_version() - set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) - -else (EIGEN3_INCLUDE_DIR) - - find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library - PATHS - ${CMAKE_INSTALL_PREFIX}/include - ${KDE4_INCLUDE_DIR} - PATH_SUFFIXES eigen3 eigen - ) - - if(EIGEN3_INCLUDE_DIR) - _eigen3_check_version() - endif(EIGEN3_INCLUDE_DIR) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) - - mark_as_advanced(EIGEN3_INCLUDE_DIR) - -endif(EIGEN3_INCLUDE_DIR) - diff --git a/AutoPortPlacement/Logic/CMake/FindNLopt.cmake b/AutoPortPlacement/Logic/CMake/FindNLopt.cmake deleted file mode 100644 index 6c6b352..0000000 --- a/AutoPortPlacement/Logic/CMake/FindNLopt.cmake +++ /dev/null @@ -1,33 +0,0 @@ -find_package(PkgConfig QUIET) -PKG_CHECK_MODULES(PC_NLopt QUIET nlopt) - -find_path(NLopt_INCLUDE_DIR - NAMES nlopt.h - HINTS - ${NLopt_DIR} - ${PC_NLopt_INCLUDEDIR} - ${PC_NLopt_INCLUDE_DIRS} - PATH_SUFFIXES include - ) - -find_library(NLopt_LIBRARY - NAMES - nlopt - nlopt-0 - libnlopt - libnlopt-0 - HINTS - ${NLopt_DIR} - ${PC_NLopt_LIBDIR} - ${PC_NLopt_LIBRARY_DIRS} - PATH_SUFFIXES - lib - lib64 - ) - -set(NLopt_INCLUDE_DIRS ${NLopt_INCLUDE_DIR}) -set(NLopt_LIBRARIES ${NLopt_LIBRARY}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(NLopt DEFAULT_MSG NLopt_INCLUDE_DIRS NLopt_LIBRARIES) -mark_as_advanced(NLopt_INCLUDE_DIR NLopt_LIBRARY) diff --git a/AutoPortPlacement/Logic/CMakeLists.txt b/AutoPortPlacement/Logic/CMakeLists.txt index dd3c108..0d9156d 100644 --- a/AutoPortPlacement/Logic/CMakeLists.txt +++ b/AutoPortPlacement/Logic/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) if(NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH OFF) @@ -7,22 +7,14 @@ endif() #----------------------------------------------------------------------------- project(vtkSlicer${MODULE_NAME}ModuleLogic) -set(CMAKE_MODULE_PATH - ${CMAKE_CURRENT_SOURCE_DIR}/CMake - ${CMAKE_MODULE_PATH}) - -find_package(Eigen3 REQUIRED) -find_package(NLopt REQUIRED) +find_package(Eigen3 REQUIRED CONFIG) set(KIT ${PROJECT_NAME}) set(${KIT}_EXPORT_DIRECTIVE "VTK_SLICER_${MODULE_NAME_UPPER}_MODULE_LOGIC_EXPORT") set(${KIT}_INCLUDE_DIRECTORIES - ${EIGEN3_INCLUDE_DIR} - ${NLopt_INCLUDE_DIRS} ) -include_directories(${${KIT}_INCLUDE_DIRECTORIES}) set(${KIT}_SRCS vtkSlicer${MODULE_NAME}Logic.cxx @@ -33,7 +25,7 @@ set(${KIT}_TARGET_LIBRARIES collisions davinci ${ITK_LIBRARIES} - ${NLopt_LIBRARIES} + Eigen3::Eigen optim vtkSlicerAnnotationsModuleMRML vtkSlicerMarkupsModuleMRML diff --git a/AutoPortPlacement/Logic/collisions/CMakeLists.txt b/AutoPortPlacement/Logic/collisions/CMakeLists.txt index 24c5e7c..6ba8a79 100644 --- a/AutoPortPlacement/Logic/collisions/CMakeLists.txt +++ b/AutoPortPlacement/Logic/collisions/CMakeLists.txt @@ -2,4 +2,8 @@ add_library(collisions STATIC collisions.cxx collisions.h ) +target_link_libraries(collisions PUBLIC Eigen3::Eigen) + set_property(TARGET collisions PROPERTY POSITION_INDEPENDENT_CODE ON) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS collisions) diff --git a/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt b/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt index af86bdf..38caaf3 100644 --- a/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt +++ b/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt @@ -11,3 +11,5 @@ target_link_libraries(davinci ${ITK_LIBRARIES} ${VTK_LIBRARIES} ) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS davinci) diff --git a/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx b/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx index 5b94f6c..c3cdb69 100644 --- a/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx +++ b/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx @@ -721,26 +721,6 @@ void DavinciKinematics::unscentedIK(const Eigen::Matrix4d& portFrame, covariance_qOut->swap(covariance_q); } -namespace -{ - double fromPoseToExtraClearance(const DavinciKinematics& kin, - const Eigen::Matrix4d& portFrameL, - const Eigen::Matrix4d& portFrameR, - const Eigen::Matrix4d& targetPose) - { - std::vector qL(6); - std::vector qR(6); - std::vector cylL, cylR; - std::vector sL, sR; - - kin.intraIK(portFrameL, targetPose, &qL); - kin.intraIK(portFrameR, targetPose, &qR); - kin.getExtraCylispheres(portFrameL, qL, &cylL); - kin.getExtraCylispheres(portFrameR, qR, &cylR); - return Collisions::distance(cylL, sL, cylR, sR); - } -} - double DavinciKinematics::fullClearances(const Eigen::Matrix4d& baseFrameL, const Eigen::Matrix4d& baseFrameR, const std::vector& qL, diff --git a/AutoPortPlacement/Logic/optim/CMakeLists.txt b/AutoPortPlacement/Logic/optim/CMakeLists.txt index 638f3e1..919a41d 100644 --- a/AutoPortPlacement/Logic/optim/CMakeLists.txt +++ b/AutoPortPlacement/Logic/optim/CMakeLists.txt @@ -1,3 +1,6 @@ + +find_package(NLopt REQUIRED CONFIG) + add_library(optim STATIC optim.cxx optim.h @@ -5,6 +8,12 @@ add_library(optim STATIC set_property(TARGET optim PROPERTY POSITION_INDEPENDENT_CODE ON) target_link_libraries(optim davinci - ${NLopt_LIBRARIES} + ${NLOPT_LIBRARIES} ${VTK_LIBRARIES} ) + +target_include_directories(optim PUBLIC + ${NLOPT_INCLUDE_DIRS} + ) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS optim) diff --git a/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx b/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx index b4b608f..748b33f 100644 --- a/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx +++ b/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx @@ -1,7 +1,7 @@ #include #include -int main(int argc, char** argv) +int main(int, char* []) { DavinciKinematics kinematics; diff --git a/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx b/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx index 23fffe4..b6b24bb 100644 --- a/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx +++ b/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx @@ -3,7 +3,7 @@ #include -int main(int argc, char* argv[]) +int main(int, char* []) { DavinciKinematics kinematics; diff --git a/AutoPortPlacement/Logic/tests/jacobian-test.cxx b/AutoPortPlacement/Logic/tests/jacobian-test.cxx index 4762251..3d8104f 100644 --- a/AutoPortPlacement/Logic/tests/jacobian-test.cxx +++ b/AutoPortPlacement/Logic/tests/jacobian-test.cxx @@ -1,7 +1,7 @@ #include #include -int main(int argc, char** argv) +int main(int, char* []) { std::vector q(6, 0.0); q[0] = 0.5; diff --git a/AutoPortPlacement/Logic/tests/min-distance-test.cxx b/AutoPortPlacement/Logic/tests/min-distance-test.cxx index fdc94da..fc016e5 100644 --- a/AutoPortPlacement/Logic/tests/min-distance-test.cxx +++ b/AutoPortPlacement/Logic/tests/min-distance-test.cxx @@ -2,7 +2,7 @@ #include -int main(int argc, char* argv[]) +int main(int, char* []) { std::vector c1, c2; std::vector s1, s2; diff --git a/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx b/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx index 2e1c5c0..799c9e8 100644 --- a/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx +++ b/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx @@ -158,6 +158,11 @@ void vtkSlicerAutoPortPlacementLogic::RenderRobot() // Initializes the models and transforms for visualizing the Davinci robot. void vtkSlicerAutoPortPlacementLogic::InitRobot() { + if (!this->GetMRMLScene()) + { + return; + } + std::vector cylispheres; std::vector spheres(2); diff --git a/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx b/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx index 730ac71..1adb2a3 100644 --- a/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx +++ b/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx @@ -26,7 +26,10 @@ #include "qSlicerAutoPortPlacementModuleWidget.h" //----------------------------------------------------------------------------- +#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) +#include Q_EXPORT_PLUGIN2(qSlicerAutoPortPlacementModule, qSlicerAutoPortPlacementModule); +#endif //----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate diff --git a/AutoPortPlacement/qSlicerAutoPortPlacementModule.h b/AutoPortPlacement/qSlicerAutoPortPlacementModule.h index 1b92a4d..399daa1 100644 --- a/AutoPortPlacement/qSlicerAutoPortPlacementModule.h +++ b/AutoPortPlacement/qSlicerAutoPortPlacementModule.h @@ -31,6 +31,9 @@ qSlicerAutoPortPlacementModule : public qSlicerLoadableModule { Q_OBJECT +#ifdef Slicer_HAVE_QT5 + Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0"); +#endif Q_INTERFACES(qSlicerLoadableModule); public: diff --git a/CMakeLists.txt b/CMakeLists.txt index f62e81d..38347ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) project(PortPlacement) @@ -9,6 +9,10 @@ set(EXTENSION_CONTRIBUTORS "Luis G. Torres (UNC)") set(EXTENSION_DESCRIPTION "Assists in the planning of surgical port placement in a laparoscopic procedure.") set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/PortPlacement/PortPlacement.png?revision=21747&view=co") set(EXTENSION_SCREENSHOTURLS "http://wiki.slicer.org/slicerWiki/images/e/e2/Slicer-r19441-PortPlacement-screenshot.png") +set(EXTENSION_DEPENDS "Eigen3") +set(EXTENSION_BUILD_SUBDIRECTORY inner-build) + +set(SUPERBUILD_TOPLEVEL_PROJECT inner) # # Implementation agnostic fPIC @@ -16,12 +20,30 @@ set(EXTENSION_SCREENSHOTURLS "http://wiki.slicer.org/slicerWiki/images/e/e2/Slic set( CMAKE_POSITION_INDEPENDENT_CODE ON ) #----------------------------------------------------------------------------- +# Extension dependencies find_package(Slicer REQUIRED) include(${Slicer_USE_FILE}) +mark_as_superbuild(Slicer_DIR) + +find_package(Git REQUIRED) +mark_as_superbuild(GIT_EXECUTABLE) + +find_package(Eigen3 REQUIRED CONFIG) +mark_as_superbuild(Eigen3_DIR) + +#----------------------------------------------------------------------------- +# SuperBuild setup +option(${EXTENSION_NAME}_SUPERBUILD "Build ${EXTENSION_NAME} and the projects it depends on." ON) +mark_as_advanced(${EXTENSION_NAME}_SUPERBUILD) +if(${EXTENSION_NAME}_SUPERBUILD) + include("${CMAKE_CURRENT_SOURCE_DIR}/SuperBuild.cmake") + return() +endif() #----------------------------------------------------------------------------- add_subdirectory(PortPlacement) add_subdirectory(AutoPortPlacement) #----------------------------------------------------------------------------- +include(${Slicer_EXTENSION_GENERATE_CONFIG}) include(${Slicer_EXTENSION_CPACK}) diff --git a/PortPlacement/PortPlacement.py b/PortPlacement/PortPlacement.py index 23a77ed..c6a5b82 100644 --- a/PortPlacement/PortPlacement.py +++ b/PortPlacement/PortPlacement.py @@ -235,7 +235,7 @@ def onRemovePortButton(self): # Problem: currentIndex() can be valid even when there is no # visible selection. This will have to do for now while I figure # out how to making Python bindings to QList (ugh) - index = self.portsTable.selectionModel().currentIndex() + index = self.portsTable.selectionModel().currentIndex self.logic.markupsNode.RemoveMarkup(index.row()) self.updateTable() @@ -718,7 +718,7 @@ def test_PortPlacement1(self): target_p = [0,0,0] targetNode.GetNthFiducialPosition(0, target_p) - targetWorld = target_p + [1] + targetWorld = target_p # check retargeting by verifying that tools' positions are # unchanged and that their y-axes are oriented toward point @@ -731,7 +731,7 @@ def test_PortPlacement1(self): diff = numpy.array(p) - numpy.array(tool_pos) self.assertTrue(numpy.dot(diff,diff) < 1e-10) - targetLocal = [0,0,0,1] + targetLocal = [0,0,0] logic.toolList[i].modelNode.TransformPointFromWorld(targetWorld, targetLocal) targetLocal = numpy.array(targetLocal)[0:3] diff --git a/SuperBuild.cmake b/SuperBuild.cmake new file mode 100644 index 0000000..b95fc33 --- /dev/null +++ b/SuperBuild.cmake @@ -0,0 +1,65 @@ + +#----------------------------------------------------------------------------- +# Git protocol option +#----------------------------------------------------------------------------- +option(Slicer_USE_GIT_PROTOCOL "If behind a firewall turn this off to use http instead." ON) + +set(git_protocol "git") +if(NOT Slicer_USE_GIT_PROTOCOL) + set(git_protocol "http") +endif() + +#----------------------------------------------------------------------------- +# Enable and setup External project global properties +#----------------------------------------------------------------------------- + +set(ep_common_c_flags "${CMAKE_C_FLAGS_INIT} ${ADDITIONAL_C_FLAGS}") +set(ep_common_cxx_flags "${CMAKE_CXX_FLAGS_INIT} ${ADDITIONAL_CXX_FLAGS}") + +#----------------------------------------------------------------------------- +# Project dependencies +#----------------------------------------------------------------------------- + +include(ExternalProject) + +foreach(dep ${EXTENSION_DEPENDS}) + mark_as_superbuild(${dep}_DIR) +endforeach() + +set(proj ${SUPERBUILD_TOPLEVEL_PROJECT}) +set(${proj}_DEPENDS NLopt) + +ExternalProject_Include_Dependencies(${proj} + PROJECT_VAR proj + SUPERBUILD_VAR ${EXTENSION_NAME}_SUPERBUILD + ) + +ExternalProject_Add(${proj} + ${${proj}_EP_ARGS} + DOWNLOAD_COMMAND "" + INSTALL_COMMAND "" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + BINARY_DIR ${EXTENSION_BUILD_SUBDIRECTORY} + BUILD_ALWAYS 1 + CMAKE_CACHE_ARGS + -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} + -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} + -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} + -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=${CMAKE_CXX_STANDARD_REQUIRED} + -DCMAKE_CXX_EXTENSIONS:BOOL=${CMAKE_CXX_EXTENSIONS} + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + -DSubversion_SVN_EXECUTABLE:FILEPATH=${Subversion_SVN_EXECUTABLE} + -DGIT_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} + -DMIDAS_PACKAGE_EMAIL:STRING=${MIDAS_PACKAGE_EMAIL} + -DMIDAS_PACKAGE_API_KEY:STRING=${MIDAS_PACKAGE_API_KEY} + -D${EXTENSION_NAME}_SUPERBUILD:BOOL=OFF + -DEXTENSION_SUPERBUILD_BINARY_DIR:PATH=${${EXTENSION_NAME}_BINARY_DIR} + DEPENDS + ${${proj}_DEPENDS} + ) + diff --git a/SuperBuild/External_NLopt.cmake b/SuperBuild/External_NLopt.cmake new file mode 100644 index 0000000..221a83f --- /dev/null +++ b/SuperBuild/External_NLopt.cmake @@ -0,0 +1,62 @@ + +set(proj NLopt) + +# Set dependency list +set(${proj}_DEPENDS "") + +# Include dependent projects if any +ExternalProject_Include_Dependencies(${proj} PROJECT_VAR proj) + +if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) + message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !") +endif() + +# Sanity checks +if(DEFINED NLopt_DIR AND NOT EXISTS ${NLopt_DIR}) + message(FATAL_ERROR "NLopt_DIR variable is defined but corresponds to nonexistent directory") +endif() + +if(NOT DEFINED ${proj}_DIR AND NOT ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) + + if(NOT DEFINED git_protocol) + set(git_protocol "git") + endif() + + ExternalProject_Add(${proj} + ${${proj}_EP_ARGS} + GIT_REPOSITORY "${git_protocol}://github.com/stevengj/nlopt.git" + GIT_TAG "014208e6bd03531aab8c45cf1902bec8b720df99" # master 2017-08-05 + SOURCE_DIR ${CMAKE_BINARY_DIR}/${proj} + BINARY_DIR ${proj}-build + INSTALL_DIR ${proj}-install + CMAKE_CACHE_ARGS + -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} + -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} + -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} + -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=${CMAKE_CXX_STANDARD_REQUIRED} + -DCMAKE_CXX_EXTENSIONS:BOOL=${CMAKE_CXX_EXTENSIONS} + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DBUILD_TESTING:BOOL=OFF + -DCMAKE_MACOSX_RPATH:BOOL=0 + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/${Slicer_THIRDPARTY_BIN_DIR} + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/${Slicer_THIRDPARTY_LIB_DIR} + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + # The following two variables should be udpated to match the + # requirements of a real CMake based external project. + -DNLopt_INSTALL_RUNTIME_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} + -DNLopt_INSTALL_LIBRARY_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} + -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS:BOOL=OFF + DEPENDS + ${${proj}_DEPENDS} + ) + set(${proj}_DIR ${CMAKE_BINARY_DIR}/${proj}-install/lib/cmake/nlopt/) + +else() + ExternalProject_Add_Empty(${proj} DEPENDS ${${proj}_DEPENDS}) +endif() + +mark_as_superbuild(${proj}_DIR:PATH) +