Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake based build for playrec.mex #4

Open
wants to merge 21 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
cmake_minimum_required(VERSION 2.8)
project(PLAYREC)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)

#CMake 'debug' build does an optimized build?
#TODO: Q&D now -check for compiler, and move to a separate file
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g")

IF(CMAKE_BUILD_TYPE MATCHES Debug)
message(STATUS "configuring DEBUG build...")
SET(CMAKE_BUILD_TYPE DEBUG)
ELSE(CMAKE_BUILD_TYPE MATCHES Debug)
message(STATUS "configuring RELEASE build...")
SET(CMAKE_BUILD_TYPE RELEASE)
ENDIF(CMAKE_BUILD_TYPE MATCHES Debug)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")

if(PLAYREC_TARGET MATCHES Octave)
find_package(Octave REQUIRED)
else(PLAYREC_TARGET MATCHES Octave)
find_package(Matlab REQUIRED)
endif(PLAYREC_TARGET MATCHES Octave)
find_package(Portaudio REQUIRED)

IF((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND))
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR})
message(STATUS "All found, Playrec will be compiled.")
#FILE(GLOB matlab_stuff "*.m")
#INSTALL(FILES ${matlab_stuff} DESTINATION .)
add_subdirectory(src)
ELSE((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND))
MESSAGE("Nothing will be built.")
ENDIF((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND))

112 changes: 111 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,114 @@ the need for reconfiguration.
By using PortAudio to access the soundcard, Playrec should function on all
platforms and with all host APIs that PortAudio supports.

To use this utility it must first be downloaded and compiled.
### Download and compilation with cmake
cmake based build will install playrec.mex to the top level of
playrec source directory. It can be moved from there to desired location.

Clone the playrec repository from github
```
% git clone [email protected]:hbe72/playrec.git
```
####Compilation with system's installation of portaudio

#####Ubuntu:
```
% sudo apt-get install cmake
% sudo apt-get install portaudio19-dev
% export MATLAB_ROOT=/opt/MATLAB/R2015b
```

#####Mac:
Install homebrew install homebrew (see. brew.sh)
```
% brew install cmake
% brew install portaudio
% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app
```

#####Compile:
```

% cd playrec
% mkdir build; cd build
% cmake ..
% make
% make install
```
#### Compilation from scratch from portaudio sources:
##### Ubuntu, Mac & MinGW
```
% mkdir portaudio; cd portaudio
% ../playrec/compile_portaudio.sh [installation directory]
```

See further instructions from the end of compile_portaudio.sh for setting the
environment variables
```
% export PKG_CONFIG_PATH=<absolute path to portaudio installation directory>/lib/pkgconfig:$PKG_CONFIG_PATH
% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app
% cd ../playrec
% mkdir build; cd build
% cmake ..
% make
% make install
```
##### Windows with Visual Studio
Suggested directory structure for FindPortaudio.cmake
```
--- portaudio --- portaudio
| |
| -- ASIOSDK2.3
| |
| -- build
| -- lib
| -- bin
| -- include
-- playrec
```
Thus download and uncompress portaudio and asiosdk accordingly from
http://www.portaudio.com/archives/pa_snapshot.tgz and http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip

Open "VS<version> x64 Cross Tools Command Prompt" and browse to
portaudio subdirectory
###### Build portaudio
```
> mkdir build
> cd build
> cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=<portaudio_install_dir> -DCMAKE_BUILD_TYPE=Release ../portaudio
> nmake /f Makefile
> nmake /f Makefile install
```
Thus installation is done to lib, bin and include subdirectories of
portaudio_install_dir. portaudio_install_dir has to be absolute path
to the portaudio subdirectory beside playrec subdirectory for
FindPortaudio.cmake to find it.

###### Build playrec
Have MATLAB_ROOT environment variable point to Matlab installation directory
```
> cd ../../playrec
> mkdir build
> cd build
> cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
> nmake /f Makefile
> nmake /f Makefile install
```

#### Test the installation

On Matlab command prompt at playrec directory:
```
>> playrec('about')
```

Clone playrec-examples from
```
% git clone [email protected]:PlayrecForMatlab/playrec-examples.git
```

Add playrec to Matlab path and execute test_playrec.m from
playrec-examples directory
```
>> test_playrec
```
126 changes: 126 additions & 0 deletions cmake/FindMatlab.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# Try to find Matlab
# This will define
#
# MATLAB_INCLUDE_DIRS: include path for mex.h
# MATLAB_LIBRARY_DIRS: include path for mex.h
# MATLAB_LIBRARIES: required libraries: libmex, libmx
# MATLAB_MEX_SUFFIX: mexw32, mexw64, mexmaci64, mexglx or mexa64
if (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX)
# in cache already
set(MATLAB_FOUND TRUE)
else (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX)
if( "$ENV{MATLAB_ROOT}" STREQUAL "" )
MESSAGE(STATUS "MATLAB_ROOT environment variable not set." )
MESSAGE(STATUS "In Linux: export MATLAB_ROOT=/usr/local/MATLAB/R2014b" )
MESSAGE(STATUS "In Mac OS X: export MATLAB_ROOT=/Applications/MATLAB_R2014b.app" )
MESSAGE(STATUS "Windows: add system variable, e.g:" )
MESSAGE(STATUS "MATLAB_ROOT=C:\\Program Files\\MATLAB\\R2014b" )
else("$ENV{MATLAB_ROOT}" STREQUAL "" )
message(STATUS "You say that matlab is in: $ENV{MATLAB_ROOT} ... let's see")

find_path(MATLAB_INCLUDE_DIR
NAMES mex.h
PATHS
$ENV{MATLAB_ROOT}/extern/include
NO_DEFAULT_PATH)
set(MATLAB_INCLUDE_DIRS ${MATLAB_INCLUDE_DIR})


if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library
find_path(MATLAB_LIBRARY_DIR
NAMES
libmex.lib
PATHS
$ENV{MATLAB_ROOT}/extern/lib/win64/microsoft
$ENV{MATLAB_ROOT}/extern/lib/win32/microsoft)

set(MATLAB_LIBRARIES
libmx
libmex
libmat)
set(MATLAB_COMP_FLAGS_RELEASE "/O2 /Oy- /DNDEBUG /MD /DMX_COMPAT_32 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE")
set(MATLAB_COMP_FLAGS_DEBUG "/Z7 /MD /DMX_COMPAT_32 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE")
set(MATLAB_LINK_FLAGS_RELEASE "/nologo /manifest /EXPORT:mexFunction")
set(MATLAB_LINK_FLAGS_DEBUG "/debug /nologo /manifest /EXPORT:mexFunction")
else (WIN32 AND (NOT MINGW))
find_path(MATLAB_LIBRARY_DIR
NAMES
libmex.lib libmex.dylib libmex.so libmex.dll
PATHS
$ENV{MATLAB_ROOT}/bin/glnxa64
$ENV{MATLAB_ROOT}/bin/glnx86
$ENV{MATLAB_ROOT}/bin/maci64
$ENV{MATLAB_ROOT}/bin/win64
$ENV{MATLAB_ROOT}/bin/win32)
set(MATLAB_LIBRARIES
mx
mex
mat)
set(MATLAB_COMP_FLAGS_RELEASE "-O3 -DMATLAB_MEX_FILE")
set(MATLAB_COMP_FLAGS_DEBUG "-O0 -g -DMATLAB_MEX_FILE")
set(MATLAB_LINK_FLAGS_DEBUG "-g")
endif (WIN32 AND (NOT MINGW))
set(MATLAB_LIBRARY_DIRS ${MATLAB_LIBRARY_DIR})

if (CMAKE_BUILD_TYPE MATCHES RELEASE)
set(MATLAB_COMP_FLAGS ${MATLAB_COMP_FLAGS_RELEASE})
set(MATLAB_LINK_FLAGS ${MATLAB_LINK_FLAGS_RELEASE})
else (CMAKE_BUILD_TYPE MATCHES RELEASE)
set(MATLAB_COMP_FLAGS ${MATLAB_COMP_FLAGS_DEBUG})
set(MATLAB_LINK_FLAGS ${MATLAB_LINK_FLAGS_DEBUG})
endif (CMAKE_BUILD_TYPE MATCHES RELEASE)

STRING(REGEX MATCH glnxa64
MATLAB_ARCH_GLNXA64 ${MATLAB_LIBRARY_DIR})
STRING(REGEX MATCH glnx86
MATLAB_ARCH_GLNX86 ${MATLAB_LIBRARY_DIR})
STRING(REGEX MATCH maci64
MATLAB_ARCH_MACI64 ${MATLAB_LIBRARY_DIR})
STRING(REGEX MATCH win64
MATLAB_ARCH_WIN64 ${MATLAB_LIBRARY_DIR})
STRING(REGEX MATCH win32
MATLAB_ARCH_WIN32 ${MATLAB_LIBRARY_DIR})
if (MATLAB_ARCH_GLNXA64)
set (MATLAB_MEX_SUFFIX ".mexa64")
endif (MATLAB_ARCH_GLNXA64)
if (MATLAB_ARCH_GLNX86)
set (MATLAB_MEX_SUFFIX ".mexglx")
endif (MATLAB_ARCH_GLNX86)
if (MATLAB_ARCH_MACI64)
set (MATLAB_MEX_SUFFIX ".mexmaci64")
endif (MATLAB_ARCH_MACI64)
if (MATLAB_ARCH_WIN64)
set (MATLAB_MEX_SUFFIX ".mexw64")
endif (MATLAB_ARCH_WIN64)
if (MATLAB_ARCH_WIN32)
set (MATLAB_MEX_SUFFIX ".mexw32")
endif (MATLAB_ARCH_WIN32)

if (MATLAB_INCLUDE_DIRS AND MATLAB_LIBRARY_DIRS)
set(MATLAB_FOUND TRUE)
endif (MATLAB_INCLUDE_DIRS AND MATLAB_LIBRARY_DIRS)

if (MATLAB_FOUND)
if (NOT Matlab_FIND_QUIETLY)
message(STATUS "Found Matlab libraries for building mex:")
message(STATUS " include dir: ${MATLAB_INCLUDE_DIRS}")
message(STATUS " library dir: ${MATLAB_LIBRARY_DIRS}")
message(STATUS " libraries: ${MATLAB_LIBRARIES}")
message(STATUS " mex suffix: ${MATLAB_MEX_SUFFIX}")
message(STATUS " comp flags: ${MATLAB_COMP_FLAGS}")
message(STATUS " link flags: ${MATLAB_LINK_FLAGS}")
endif (NOT Matlab_FIND_QUIETLY)
else (MATLAB_FOUND)
if (Matlab_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Matlab, bailing out")
endif (Matlab_FIND_REQUIRED)
endif (MATLAB_FOUND)
mark_as_advanced(
MATLAB_LIBRARIES
MATLAB_MEX_SUFFIX
MATLAB_INCLUDE_DIRS
MATLAB_LIBRARY_DIRS
MATLAB_COMP_FLAGS
MATLAB_LINK_FLAGS)
endif("$ENV{MATLAB_ROOT}" STREQUAL "" )
endif (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX)
100 changes: 100 additions & 0 deletions cmake/FindOctave.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Try to find Octave
# This will define
#
# OCTAVE_INCLUDE_DIRS: include path for mex.h
# OCTAVE_LIBRARY_DIRS: include path for mex.h
# OCTAVE_LIBRARIES: required libraries: libmex, libmx
# OCTAVE_MEX_SUFFIX: mexw32, mexw64, mexmaci64, mexglx or mexa64
if (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX)
# in cache already
set(OCTAVE_FOUND TRUE)
else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX)
if( "$ENV{OCTAVE_ROOT}" STREQUAL "" )
MESSAGE(STATUS "OCTAVE_ROOT environment variable not set" )
MESSAGE(STATUS "...Trying the usual paths" )
endif("$ENV{OCTAVE_ROOT}" STREQUAL "" )

FILE(GLOB system-oct1 "/usr/local/include/octave-*")
FILE(GLOB system-oct2 "/usr/include/octave-*")
FILE(GLOB system-oct3 "$ENV{OCTAVE_ROOT}/include/octave-*")
FILE(GLOB system-oct1-lib "/usr/local/lib/octave/*")
FILE(GLOB system-oct2-lib "$ENV{OCTAVE_ROOT}/lib/octave/*")

find_path(OCTAVE_INCLUDE_DIR
NAMES mex.h
PATHS
${system-oct1}/octave
${system-oct2}/octave
${system-oct3}/octave)
set(OCTAVE_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIR})

if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library
find_path(OCTAVE_LIBRARY_DIR
NAMES
liboctave.lib
PATHS
${system-oct1-lib}
${system-oct2-lib})

set(OCTAVE_LIBRARIES
liboctave
liboctinterp)
#set(OCTAVE_COMP_FLAGS_RELEASE "")
#set(OCTAVE_COMP_FLAGS_DEBUG "")
#set(OCTAVE_LINK_FLAGS_RELEASE "/EXPORT:mexFunction")
#set(OCTAVE_LINK_FLAGS_DEBUG "/debug /nologo /manifest /EXPORT:mexFunction")
else (WIN32 AND (NOT MINGW))
find_path(OCTAVE_LIBRARY_DIR
NAMES
liboctave.lib liboctave.dylib liboctave.so liboctave.dll
PATHS
${system-oct1-lib}
${system-oct2-lib}
/usr/lib/x86_64-linux-gnu)

set(OCTAVE_LIBRARIES
octave
octinterp)
set(OCTAVE_COMP_FLAGS_RELEASE "-O3 -D_THREAD_SAFE -pthread -D_REENTRANT -I.")
set(OCTAVE_COMP_FLAGS_DEBUG "-O0 -D_THREAD_SAFE -pthread -D_REENTRANT -I.")
set(OCTAVE_LINK_FLAGS_DEBUG "-g")
endif (WIN32 AND (NOT MINGW))
set(OCTAVE_LIBRARY_DIRS ${OCTAVE_LIBRARY_DIR})

if (CMAKE_BUILD_TYPE MATCHES RELEASE)
set(OCTAVE_COMP_FLAGS ${OCTAVE_COMP_FLAGS_RELEASE})
set(OCTAVE_LINK_FLAGS ${OCTAVE_LINK_FLAGS_RELEASE})
else (CMAKE_BUILD_TYPE MATCHES RELEASE)
set(OCTAVE_COMP_FLAGS ${OCTAVE_COMP_FLAGS_DEBUG})
set(OCTAVE_LINK_FLAGS ${OCTAVE_LINK_FLAGS_DEBUG})
endif (CMAKE_BUILD_TYPE MATCHES RELEASE)

set (OCTAVE_MEX_SUFFIX ".mex")

if (OCTAVE_INCLUDE_DIRS AND OCTAVE_LIBRARY_DIRS)
set(OCTAVE_FOUND TRUE)
endif (OCTAVE_INCLUDE_DIRS AND OCTAVE_LIBRARY_DIRS)

if (OCTAVE_FOUND)
if (NOT Octave_FIND_QUIETLY)
message(STATUS "Found Octave libraries for building mex:")
message(STATUS " include dir: ${OCTAVE_INCLUDE_DIRS}")
message(STATUS " library dir: ${OCTAVE_LIBRARY_DIRS}")
message(STATUS " libraries: ${OCTAVE_LIBRARIES}")
message(STATUS " mex suffix: ${OCTAVE_MEX_SUFFIX}")
message(STATUS " comp flags: ${OCTAVE_COMP_FLAGS}")
message(STATUS " link flags: ${OCTAVE_LINK_FLAGS}")
endif (NOT Octave_FIND_QUIETLY)
else (OCTAVE_FOUND)
if (Matlab_FIND_REQUIRED)
message(FATAL_ERROR "Could not find Octave, bailing out")
endif (Matlab_FIND_REQUIRED)
endif (OCTAVE_FOUND)
mark_as_advanced(
OCTAVE_LIBRARIES
OCTAVE_MEX_SUFFIX
OCTAVE_INCLUDE_DIRS
OCTAVE_LIBRARY_DIRS
OCTAVE_COMP_FLAGS
OCTAVE_LINK_FLAGS)
endif (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX)
Loading