Skip to content

Commit

Permalink
FindOctave: Add module to find GNU octave
Browse files Browse the repository at this point in the history
  • Loading branch information
scivision authored and bradking committed Dec 6, 2018
1 parent 81bea69 commit 170bcb6
Show file tree
Hide file tree
Showing 10 changed files with 228 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Copyright.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ The following individuals and institutions are among the Contributors:
* Ilya Lavrenov <ilya.lavrenov@itseez.com>
* Insight Software Consortium <insightsoftwareconsortium.org>
* Jan Woetzel
* Julien Schueller
* Kelly Thompson <kgt@lanl.gov>
* Laurent Montel <montel@kde.org>
* Konstantin Podsvirov <konstantin@podsvirov.pro>
Expand All @@ -72,6 +73,7 @@ The following individuals and institutions are among the Contributors:
* Matthaeus G. Chajdas
* Matthias Kretz <kretz@kde.org>
* Matthias Maennich <matthias@maennich.net>
* Michael Hirsch, Ph.D. <www.scivision.co>
* Michael Stürmer
* Miguel A. Figueroa-Villanueva
* Mike Jackson
Expand Down
1 change: 1 addition & 0 deletions Help/manual/cmake-modules.7.rst
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ They are normally called through the :command:`find_package` command.
/module/FindMPEG2
/module/FindMPEG
/module/FindMPI
/module/FindOctave
/module/FindODBC
/module/FindOpenACC
/module/FindOpenAL
Expand Down
1 change: 1 addition & 0 deletions Help/module/FindOctave.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.. cmake-module:: ../../Modules/FindOctave.cmake
4 changes: 4 additions & 0 deletions Help/release/dev/FindOctave.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FindOctave
----------

* A :module:`FindOctave` module was added to find GNU octave.
167 changes: 167 additions & 0 deletions Modules/FindOctave.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindOctave
----------
Finds GNU Octave interpreter, libraries and compilers.
Imported targets
^^^^^^^^^^^^^^^^
This module defines the following :prop_tgt:`IMPORTED` targets:
``Octave::Interpreter``
Octave interpreter (the main program)
``Octave::Octave``
include directories and libraries
If no ``COMPONENTS`` are specified, ``Interpreter`` is assumed.
Result Variables
^^^^^^^^^^^^^^^^
``Octave_FOUND``
Octave interpreter and/or libraries were found
``Octave_<component>_FOUND``
Octave <component> specified was found
``Octave_EXECUTABLE``
Octave interpreter
``Octave_INCLUDE_DIRS``
include path for mex.h
``Octave_LIBRARIES``
octinterp, octave libraries
Cache variables
^^^^^^^^^^^^^^^
The following cache variables may also be set:
``Octave_INTERP_LIBRARY``
path to the library octinterp
``Octave_OCTAVE_LIBRARY``
path to the liboctave library
#]=======================================================================]

cmake_policy(VERSION 3.3)

unset(Octave_REQUIRED_VARS)
unset(Octave_Development_FOUND)
unset(Octave_Interpreter_FOUND)
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME Interpreter)

if(Development IN_LIST Octave_FIND_COMPONENTS)
find_program(Octave_CONFIG_EXECUTABLE
NAMES octave-config)

if(Octave_CONFIG_EXECUTABLE)

execute_process(COMMAND ${Octave_CONFIG_EXECUTABLE} -p BINDIR
OUTPUT_VARIABLE Octave_BINARY_DIR
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)

execute_process(COMMAND ${Octave_CONFIG_EXECUTABLE} -p OCTINCLUDEDIR
OUTPUT_VARIABLE Octave_INCLUDE_DIR
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
list(APPEND Octave_REQUIRED_VARS ${Octave_INCLUDE_DIR})

execute_process(COMMAND ${Octave_CONFIG_EXECUTABLE} -p OCTLIBDIR
OUTPUT_VARIABLE Octave_LIB1
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)

execute_process(COMMAND ${Octave_CONFIG_EXECUTABLE} -p LIBDIR
OUTPUT_VARIABLE Octave_LIB2
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)

find_library(Octave_INTERP_LIBRARY
NAMES octinterp
PATHS ${Octave_LIB1} ${Octave_LIB2}
NO_DEFAULT_PATH
)
find_library(Octave_OCTAVE_LIBRARY
NAMES octave
PATHS ${Octave_LIB1} ${Octave_LIB2}
NO_DEFAULT_PATH
)
list(APPEND Octave_REQUIRED_VARS ${Octave_OCTAVE_LIBRARY} ${Octave_INTERP_LIBRARY})

if(Octave_REQUIRED_VARS)
set(Octave_Development_FOUND true)
endif()
endif(Octave_CONFIG_EXECUTABLE)
endif()

if(Interpreter IN_LIST Octave_FIND_COMPONENTS)

find_program(Octave_EXECUTABLE
NAMES octave)

list(APPEND Octave_REQUIRED_VARS ${Octave_EXECUTABLE})

endif()

if(Octave_EXECUTABLE)
execute_process(COMMAND ${Octave_EXECUTABLE} -v
OUTPUT_VARIABLE Octave_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)


string(REGEX REPLACE "GNU Octave, version ([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" Octave_VERSION_MAJOR ${Octave_VERSION})
string(REGEX REPLACE "GNU Octave, version [0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" Octave_VERSION_MINOR ${Octave_VERSION})
string(REGEX REPLACE "GNU Octave, version [0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" Octave_VERSION_PATCH ${Octave_VERSION})

set(Octave_VERSION ${Octave_VERSION_MAJOR}.${Octave_VERSION_MINOR}.${Octave_VERSION_PATCH})

set(Octave_Interpreter_FOUND true)

endif(Octave_EXECUTABLE)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Octave
REQUIRED_VARS Octave_REQUIRED_VARS
VERSION_VAR Octave_VERSION
HANDLE_COMPONENTS)


if(Octave_Development_FOUND)
set(Octave_LIBRARIES ${Octave_INTERP_LIBRARY} ${Octave_OCTAVE_LIBRARY})
set(Octave_INCLUDE_DIRS ${Octave_INCLUDE_DIR})

if(NOT TARGET Octave::Octave)
add_library(Octave::Octave UNKNOWN IMPORTED)
set_target_properties(Octave::Octave PROPERTIES
IMPORTED_LOCATION ${Octave_OCTAVE_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${Octave_INCLUDE_DIR}
)
endif()

endif()


if(Octave_Interpreter_FOUND)
if(NOT TARGET Octave::Interpreter)
add_executable(Octave::Interpreter IMPORTED)
set_target_properties(Octave::Interpreter PROPERTIES
IMPORTED_LOCATION ${Octave_EXECUTABLE}
VERSION ${Octave_VERSION})
endif()
endif()

mark_as_advanced(
Octave_CONFIG_EXECUTABLE
Octave_INTERP_LIBRARY
Octave_OCTAVE_LIBRARY
Octave_INCLUDE_DIR
Octave_VERSION_MAJOR
Octave_VERSION_MINOR
Octave_VERSION_PATCH
)
4 changes: 4 additions & 0 deletions Tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1441,6 +1441,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
add_subdirectory(FindODBC)
endif()

if(CMake_TEST_FindOctave)
add_subdirectory(FindOctave)
endif()

if(CMake_TEST_FindOpenCL)
add_subdirectory(FindOpenCL)
endif()
Expand Down
10 changes: 10 additions & 0 deletions Tests/FindOctave/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
add_test(NAME FindOctave.Test COMMAND
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
--build-and-test
"${CMake_SOURCE_DIR}/Tests/FindOctave/Test"
"${CMake_BINARY_DIR}/Tests/FindOctave/Test"
${build_generator_args}
--build-project TestFindOctave
--build-options ${build_options}
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
)
20 changes: 20 additions & 0 deletions Tests/FindOctave/Test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
cmake_minimum_required(VERSION 3.3)
project(TestFindOctave CXX)
enable_testing()

find_package(Octave REQUIRED COMPONENTS Development Interpreter)

add_definitions(-DCMAKE_EXPECTED_Octave_VERSION=${Octave_VERSION})

add_executable(test_tgt main.cpp)
target_link_libraries(test_tgt Octave::Octave)
add_test(NAME test_tgt COMMAND test_tgt)

add_test(NAME test_tgt_exe
COMMAND Octave::Interpreter -q --eval "runtests('.')"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

add_executable(test_var main.cpp)
target_include_directories(test_var PRIVATE ${Octave_INCLUDE_DIRS})
target_link_libraries(test_var PRIVATE ${Octave_LIBRARIES})
add_test(NAME test_var COMMAND test_var)
18 changes: 18 additions & 0 deletions Tests/FindOctave/Test/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#include <iostream>
#include <oct.h>

// http://www.dm.unibo.it/~achilles/calc/octave.html/Standalone-Programs.html
int main(void)
{
int n = 2;
Matrix a_matrix = Matrix(n, n);
for (octave_idx_type i = 0; i < n; i++) {
for (octave_idx_type j = 0; j < n; j++) {
a_matrix(i, j) = (i + 1) * 10 + (j + 1);
}
}

std::cout << a_matrix << std::endl;

return EXIT_SUCCESS;
}
1 change: 1 addition & 0 deletions Tests/FindOctave/Test/testtrue.m
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
%!assert(true)

0 comments on commit 170bcb6

Please sign in to comment.