diff options
| author | Richard Knight <q@1bpm.net> | 2021-08-16 03:36:51 +0100 | 
|---|---|---|
| committer | Richard Knight <q@1bpm.net> | 2021-08-16 03:36:51 +0100 | 
| commit | effac40bd1d004d93555324bc1cab137a49304d2 (patch) | |
| tree | 1a077cf25706e30a1d9402dc5e9a7e9ddabe0351 | |
| parent | 5bfa77b1317657aaf718bf4d72ee902f1b768cea (diff) | |
| download | csound-jstick-master.tar.gz csound-jstick-master.tar.bz2 csound-jstick-master.zip | |
| -rw-r--r-- | CMakeLists.txt | 268 | ||||
| -rw-r--r-- | Plugin.cmake | 13 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | cmake/CompilerOptimizations.cmake | 53 | ||||
| -rw-r--r-- | cmake/Modules/FindCsound.cmake | 56 | 
5 files changed, 275 insertions, 117 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index 040b4e2..612d056 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,139 +1,203 @@ -project("csound_jstick") +# from https://github.com/csound/plugins : common CMake operations +cmake_minimum_required(VERSION 2.8.12) +project(Csound-plugins) -cmake_minimum_required(VERSION 3.8) - -set(APIVERSION "6.0") +if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") +    set(CMAKE_COMPILER_IS_CLANG 1) +endif() -# Release or Debug -set(CMAKE_BUILD_TYPE "Release") +# C++11 needed +if(NOT MSVC) +  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +endif() -# force make to print the command lines -set(CMAKE_VERBOSE_MAKEFILE on) +set(APIVERSION "6.0") -# path to Csound cmake module +set(CMAKE_MACOSX_RPATH 1) +set(CMAKE_VERBOSE_MAKEFILE ON)  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -# set compilation flags -set(CMAKE_CXX_FLAGS  ${CMAKE_CXX_FLAGS}  "-std=c++11 -fpermissive -fPIC -w -DUSE_DOUBLE -DB64BIT") - -# options -option(USE_LIB64 "Set to on to set installation dir for libs to lib64" OFF) -option(USE_DOUBLE "Use doubles for audio calculations" ON) -option(CPP11 "c++11" ON) - -set(BUILDING_CSOUND_PLUGINS ON) - -# ---------------------------------------------- - -include(FindCsound) - +include(TestBigEndian) +include(CheckFunctionExists)  include(CheckCCompilerFlag)  include(CheckCXXCompilerFlag) -# ----------------------------------------------- - -function(addflag flag flagname) -  check_c_compiler_flag(${flag} ${flagname}) -  if (${flagname}) -    # message(STATUS "Setting C flag ${flag}")     -    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) -  endif() -  check_cxx_compiler_flag(${flag} CXX_${flagname}) -  if (CXX_${flagname}) -    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) -  endif() -endfunction(addflag) - +### COMPILER OPTIMIZATION FLAGS +option(USE_COMPILER_OPTIMIZATIONS "Use the default Csound compiler optimization flags" ON) +if(USE_COMPILER_OPTIMIZATIONS) +    include(${CMAKE_SOURCE_DIR}/cmake/CompilerOptimizations.cmake) +endif() -# set optimization flags -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) -  add_definitions(-fvisibility=hidden) -  if(NATIVE) -	add_definitions(-march=native) -  endif() -   -  include(CheckCCompilerFlag) -  include(CheckCXXCompilerFlag) +if(APPLE) +    set(OSX_VERSION " ") +endif() -  addflag(-msse HAS_SSE) -  addflag(-msse2 HAS_SSE2) -  addflag(-mfgpath=sse HAS_FPMATH_SSE) -   +## USER OPTIONS ## +# Optional targets, they should all default to ON (check_deps will disable them if not possible to build) +option(USE_DOUBLE "Set to use double-precision floating point for audio samples." ON) +option(USE_LRINT "Use lrint/lrintf for converting floating point values to integers." ON) +option(BUILD_RELEASE "Build for release" ON) +option(USE_GIT_COMMIT "Show the git commit in version information" ON) + +# in Release configuration, set NDEBUG +if(${CMAKE_BUILD_TYPE} MATCHES "Release") +message("-----> Release mode") +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG") +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNDEBUG") +elseif(${CMAKE_BUILD_TYPE} MATCHES "Debug") +message("-----> Debug mode") +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBETA") +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBETA")  endif() -if(MINGW) -  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") -  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mstackrealign") +# set -Werror if in Debug configuration +if(NOT MSVC AND NOT WASM) +    set(CMAKE_CXX_FLAGS_RELEASE "-O3 ") +    set(CMAKE_C_FLAGS_RELEASE "-O3 ") +    if(${CMAKE_BUILD_TYPE} MATCHES "Debug") +        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wall -Werror -Wno-missing-field-initializers") +        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -Wno-missing-field-initializers") +    endif()  endif() -addflag(-ftree-vectorize HAS_TREE_VECTORIZE) -addflag(-ffast-math HAS_FAST_MATH) -addflag(-fomit-frame-pointer HAS_OMIT_FRAME_POINTER) +if(CMAKE_SYSTEM_NAME MATCHES "Linux") +    set(LINUX YES) +else() +    set(LINUX NO) +endif() + +set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) -# ------------------------------------------------------------------- +check_c_compiler_flag(-fvisibility=hidden HAS_VISIBILITY_HIDDEN) +check_cxx_compiler_flag(-fvisibility=hidden HAS_CXX_VISIBILITY_HIDDEN) +if (HAS_VISIBILITY_HIDDEN) +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") +endif() +if (HAS_CXX_VISIBILITY_HIDDEN) +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") +endif() -set(CS_FRAMEWORK_DEST "~/Library/Frameworks") +check_c_compiler_flag(-std=gnu99 HAS_GNU99) +if (HAS_GNU99) +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +endif() +if (HAS_CXX_VISIBILITY_HIDDEN) +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") +endif() +find_package(Csound) +option(USE_LIB64 "Set to on to set installation directory for libraries to lib64" OFF)  if(USE_LIB64) -  set(LIBRARY_INSTALL_DIR "lib64") -  add_definitions("-DLIB64") +    set(LIBRARY_INSTALL_DIR "lib64") +    add_definitions("-DLIB64")  else() -  set(LIBRARY_INSTALL_DIR "lib") +    set(LIBRARY_INSTALL_DIR "lib")  endif() -  message(STATUS "LIBRARY INSTALL DIR: ${LIBRARY_INSTALL_DIR}") -# ------------------------------------------------------------------- - -  if(USE_DOUBLE) -  message(STATUS ">>> using doubles") -   -  if(APPLE) -    set(CSOUNDLIB "CsoundLib64") -    set(PLUGIN_INSTALL_DIR "${CS_FRAMEWORK_DEST}/${CSOUNDLIB}.framework/Versions/${APIVERSION}/Resources/Opcodes64") -  else() -    set(CSOUNDLIB "csound64") +    message(STATUS "Building with 64-bit floats")      set(PLUGIN_INSTALL_DIR "${LIBRARY_INSTALL_DIR}/csound/plugins64-${APIVERSION}") -  endif() +    if(APPLE) +        set(PLUGIN_INSTALL_DIR "${CS_FRAMEWORK_DEST}/${CSOUNDLIB}.framework/Versions/${APIVERSION}/Resources/Opcodes64") +    endif()  else() -  message(STATUS ">>> not using doubles") -  if(APPLE) -    set(CSOUNDLIB "CsoundLib") -    set(PLUGIN_INSTALL_DIR "${CS_FRAMEWORK_DEST}/${CSOUNDLIB}.framework/Versions/${APIVERSION}/Resources/Opcodes") -  else() -    set(CSOUNDLIB "csound") +    message(STATUS "Building with 32-bit floats")      set(PLUGIN_INSTALL_DIR "${LIBRARY_INSTALL_DIR}/csound/plugins-${APIVERSION}") -  endif() +    if(APPLE) +        set(PLUGIN_INSTALL_DIR "${CS_FRAMEWORK_DEST}/${CSOUNDLIB}.framework/Versions/${APIVERSION}/Resources/Opcodes") +    endif()  endif() -# ------------------------------------------------------------------- -   -# Csound opcode build -find_package(Csound) +# Checks if dependencies for an enabled target are fulfilled. +# If FAIL_MISSING is true and the dependencies are not fulfilled, +# it will abort the cmake run. +# If FAIL_MISSING is false, it will set the option to OFF. +# If the target is not enabled, it will do nothing. +# example: check_deps(BUILD_NEW_PARSER FLEX_EXECUTABLE BISON_EXECUTABLE) +function(check_deps option) +    if(${option}) +        set(i 1) +        while( ${i} LESS ${ARGC} ) +            set(dep ${ARGV${i}}) +            if(NOT ${dep}) +                if(FAIL_MISSING) +                    message(FATAL_ERROR +                        "${option} is enabled, but ${dep}=\"${${dep}}\"") +                else() +                    message(STATUS "${dep}=\"${${dep}}\", so disabling ${option}") +                    set(${option} OFF PARENT_SCOPE) +                    # Set it in the local scope too +                    set(${option} OFF) +                endif() +            endif() +            math(EXPR i "${i}+1") +        endwhile() +    endif() +    if(${option}) +        message(STATUS "${option} is enabled.") +    else() +        message(STATUS "${option} is disabled.") +    endif() +endfunction(check_deps) + +# Utility function to make plugins. All plugin targets should use this as it +# sets up output directory set in top-level CmakeLists.txt +# and adds the appropriate install target +# +# libname - name of library to produce +# srcs - list of src files (must be quoted if a list) +# extralibs (OPTIONAL) - extra libraries to link the plugin to +# +# NB - this was moved here as it needs some VARS defined above +# for setting up the framework +function(make_plugin libname srcs) +    if(APPLE) +        add_library(${libname} SHARED ${srcs}) +    else() +        add_library(${libname} MODULE ${srcs}) +    endif() + +    set(i 2) +    while( ${i} LESS ${ARGC} ) +        target_link_libraries(${libname} ${ARGV${i}}) +        math(EXPR i "${i}+1") +    endwhile() + +    set_target_properties(${libname} PROPERTIES +        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +        ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + +    install(TARGETS ${libname} +        LIBRARY DESTINATION "${PLUGIN_INSTALL_DIR}"  +        ARCHIVE DESTINATION "${PLUGIN_INSTALL_DIR}" ) +endfunction(make_plugin) + +# Linux does not have a separate libintl, it is part of libc +set(LIBINTL_AVAIL (LIBINTL_LIBRARY OR LINUX)) + +if(LINUX) +    message(STATUS "Building on Linux.") +    add_definitions(-DLINUX -DPIPES -D_GNU_SOURCE -DHAVE_SOCKETS) +    list(APPEND libcsound_LIBS ${MATH_LIBRARY} dl) - -set(BUILD_PLUGINS_DIR ${CMAKE_CURRENT_BINARY_DIR}) - -if(NOT CSOUND_FOUND) -  message(FATAL_ERROR "Csound installation not found")  endif() +if(APPLE AND NOT IOS) +    message(STATUS "Building on OSX") +    add_definitions(-DMACOSX -DPIPES -DNO_FLTK_THREADS -DHAVE_SOCKETS) +    find_library(ACCELERATE_LIBRARY Accelerate) +    find_path(VECLIB_PATH "Accelerate/Accelerate.h") +    include_directories(${VECLIB_PATH}) +    list(APPEND libcsound_LIBS ${MATH_LIBRARY} dl ${ACCELERATE_LIBRARY}) +endif() -set(CPPFILES src/opcodes.cpp src/joystick.cpp) - - -add_library(jstick SHARED ${CPPFILES}) -include_directories(${CSOUND_INCLUDE_DIRS}) -include_directories(include) - - -set_target_properties(jstick PROPERTIES -  RUNTIME_OUTPUT_DIRECTORY ${BUILD_PLUGINS_DIR} -  LIBRARY_OUTPUT_DIRECTORY ${BUILD_PLUGINS_DIR}) -  -install(TARGETS jstick LIBRARY DESTINATION "${PLUGIN_INSTALL_DIR}" ) +if(WIN32) +    add_definitions(-DWIN32) +endif() +include(Plugin.cmake) diff --git a/Plugin.cmake b/Plugin.cmake new file mode 100644 index 0000000..bf08996 --- /dev/null +++ b/Plugin.cmake @@ -0,0 +1,13 @@ +if(NOT LINUX) +    message(FATAL_ERROR "Only Linux is supported as evdev is required for this plugin") +endif() + +set(PLUGIN_NAME jstick) + +# Dependencies +    # None + +# Source files +set(CPPFILES src/opcodes.cpp src/joystick.cpp) +make_plugin(${PLUGIN_NAME} "${CPPFILES}") +target_include_directories(${PLUGIN_NAME} PRIVATE ${CSOUND_INCLUDE_DIRS}) @@ -5,7 +5,7 @@ The opcode uses evdev so only works on Linux.  ## Requirements   - Csound development libraries - - Cmake 3.8 or later + - Cmake 2.8.12 or later  ## Building diff --git a/cmake/CompilerOptimizations.cmake b/cmake/CompilerOptimizations.cmake new file mode 100644 index 0000000..543daf8 --- /dev/null +++ b/cmake/CompilerOptimizations.cmake @@ -0,0 +1,53 @@ +
 +check_c_compiler_flag(-ftree-vectorize HAS_TREE_VECTORIZE)
 +check_cxx_compiler_flag(-ftree-vectorize HAS_CXX_TREE_VECTORIZE)
 +if (HAS_TREE_VECTORISE)
 +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftree-vectorize")
 +endif()
 +if (HAS_CXX_TREE_VECTORISE)
 +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftree-vectorize")
 +endif()
 +
 +
 +check_c_compiler_flag(-ffast-math HAS_FAST_MATH)
 +check_cxx_compiler_flag(-ffast-math HAS_CXX_FAST_MATH)
 +if (HAS_FAST_MATH AND NOT MINGW)
 +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffast-math")
 +endif()
 +if (HAS_CXX_FAST_MATH AND NOT MINGW)
 +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
 +endif()
 +
 +
 +
 +if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
 +check_c_compiler_flag(-mfpmath=sse HAS_FPMATH_SSE)
 +check_cxx_compiler_flag(-mfpmath=sse HAS_CXX_FPMATH_SSE)
 +  if (HAS_FPMATH_SSE)
 +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse")
 +endif()
 +if (HAS_CXX_FPMATH_SSE)
 +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse")
 +endif()
 +
 +endif()
 +
 +
 +check_c_compiler_flag(-msse2 HAS_SSE2)
 +check_cxx_compiler_flag(-msse2 HAS_CXX_SSE2)
 +  if (HAS_SSE2 AND NOT IOS AND NOT WASM)
 +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
 +endif()
 +if (HAS_CXX_SSE2 AND NOT IOS AND NOT WASM)
 +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
 +endif()
 +
 +
 +check_c_compiler_flag(-fomit-frame-pointer HAS_OMIT_FRAME_POINTER)
 +check_cxx_compiler_flag(-fomit-frame-pointer HAS_CXX_OMIT_FRAME_POINTER)
 +if (HAS_OMIT_FRAME_POINTER)
 +    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer")
 +endif()
 +if (HAS_CXX_OMIT_FRAME_POINTER)
 +    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer")
 +endif()
 diff --git a/cmake/Modules/FindCsound.cmake b/cmake/Modules/FindCsound.cmake index b5631c9..24c90d9 100644 --- a/cmake/Modules/FindCsound.cmake +++ b/cmake/Modules/FindCsound.cmake @@ -4,25 +4,53 @@  #  CSOUND_INCLUDE_DIRS - The Csound include directories.  #  CSOUND_LIBRARIES - The libraries needed to use the Csound library. -if(APPLE) -  find_path(CSOUND_INCLUDE_DIR csound.h HINTS /Library/Frameworks/CsoundLib64.framework/Headers -  "$ENV{HOME}/Library/Frameworks/CsoundLib64.framework/Headers") -elseif(WIN32) -  find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound  +# RKnight 2021-07-21 : quick copy paste hack to deal with 32 bit if not using double + +if(USE_DOUBLE) +  # 64 bit +  if(APPLE) +    find_path(CSOUND_INCLUDE_DIR csound.h HINTS /Library/Frameworks/CsoundLib64.framework/Headers +    "$ENV{HOME}/Library/Frameworks/CsoundLib64.framework/Headers") +  elseif(WIN32) +    find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound               HINTS "c:\\Program Files\\Csound6_x64\\include") -else() -  find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound) -endif() +  else() +    find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound) +  endif() + +  if(APPLE) +    find_library(CSOUND_LIBRARY NAMES CsoundLib64 HINTS /Library/Frameworks/CsoundLib64.framework/ +    "$ENV{HOME}/Library/Frameworks/CsoundLib64.framework") +  elseif(WIN32) +    find_library(CSOUND_LIBRARY NAMES csound64 HINTS "c:\\Program Files\\Csound6_x64\\lib") +  else() +    find_library(CSOUND_LIBRARY NAMES csound64 csound) +  endif() -if(APPLE) -  find_library(CSOUND_LIBRARY NAMES CsoundLib64 HINTS /Library/Frameworks/CsoundLib64.framework/ -  "$ENV{HOME}/Library/Frameworks/CsoundLib64.framework") -elseif(WIN32) -  find_library(CSOUND_LIBRARY NAMES csound64 HINTS "c:\\Program Files\\Csound6_x64\\lib")  else() -  find_library(CSOUND_LIBRARY NAMES csound64 csound) +  # 32 bit +  if(APPLE) +    find_path(CSOUND_INCLUDE_DIR csound.h HINTS /Library/Frameworks/CsoundLib.framework/Headers +    "$ENV{HOME}/Library/Frameworks/CsoundLib.framework/Headers") +  elseif(WIN32) +    find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound  +            HINTS "c:\\Program Files (x86)\\Csound6\\include") +  else() +    find_path(CSOUND_INCLUDE_DIR csound.h PATH_SUFFIXES csound) +  endif() + +  if(APPLE) +    find_library(CSOUND_LIBRARY NAMES CsoundLib HINTS /Library/Frameworks/CsoundLib.framework/ +    "$ENV{HOME}/Library/Frameworks/CsoundLib.framework") +  elseif(WIN32) +    find_library(CSOUND_LIBRARY NAMES csound HINTS "c:\\Program Files (x86)\\Csound6\\lib") +  else() +    find_library(CSOUND_LIBRARY NAMES csound csound) +  endif() +  endif() +  include(FindPackageHandleStandardArgs)  # handle the QUIETLY and REQUIRED arguments and set CSOUND_FOUND to TRUE  # if all listed variables are TRUE |