diff --git a/cmake/modules/CheckSubmodule.cmake b/cmake/modules/CheckSubmodule.cmake new file mode 100644 index 00000000000..569b3ab414d --- /dev/null +++ b/cmake/modules/CheckSubmodule.cmake @@ -0,0 +1,66 @@ +# Utility for validating and -- if needed -- cloning a git submodule +# This project depends on "CheckCommand", which is part of the LMMS project. +# +# Looks for a relative file inside source directory of current target +# - Attempts to clone with git if it's missing +# - Throws FATAL_ERROR by default unless OPTIONAL is specified +# - If submodule "foo" is located inside "src/3rdparty/foo", the RELATIVE_FILE +# should be foo/file.c, resolving to src/3rdparty/foo/foo/bar.c +# +# Usage: +# CHECK_SUBMODULE(foo/bar.c) +# CHECK_SUBMODULE(foo/bar.c OPTIONAL) +# +# Copyright (c) 2017, Tres Finocchiaro, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +INCLUDE(CheckCommand) + +MACRO(CHECK_SUBMODULE) + SET(ARG_LIST "${ARGN}") + LIST(LENGTH ARG_LIST ARG_LEN) + IF (ARG_LEN EQUAL 1) + LIST(GET ARG_LIST 0 RELATIVE_FILE) + ELSEIF(ARG_LEN EQUAL 2) + LIST(GET ARG_LIST 0 RELATIVE_FILE) + LIST(GET ARG_LIST 1 OPTIONAL) + ELSE() + MESSAGE(FATAL_ERROR "CHECK_SUBMODULE takes (1) or (2) arguments but (${ARG_LEN}) were provided") + ENDIF() + + # Guess submodule name from the path prefix + STRING(REPLACE "/" ";" PARTS ${RELATIVE_FILE}) + LIST(GET PARTS 0 SUBMODULE_NAME) + SET(ABSOLUTE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${RELATIVE_FILE}") + SET(SUBMODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${SUBMODULE_NAME}") + + # Attempt to do lazy clone + IF(NOT EXISTS "${ABSOLUTE_FILE}") + MESSAGE("-- Submodule '${SUBMODULE_NAME}' missing") + MESSAGE("-- Cloning '${SUBMODULE_NAME}' using git") + CHECK_COMMAND(git) + EXECUTE_PROCESS( + COMMAND git submodule update --init --recursive + WORKING_DIRECTORY "${SUBMODULE_PATH}" + ERROR_VARIABLE GIT_STDERR + ) + IF(NOT GIT_STDERR EQUAL "") + MESSAGE("${GIT_STDERR}") + ENDIF() + ENDIF() + + IF(EXISTS "${ABSOLUTE_FILE}") + MESSAGE("-- Found submodule '${SUBMODULE_NAME}': ${CMAKE_CURRENT_SOURCE_DIR}/${SUBMODULE_NAME}") + ELSE() + # Handle optional/warning mode + IF(OPTIONAL STREQUAL "OPTIONAL") + SET(MESSAGE_STATUS WARNING) + ELSE() + SET(MESSAGE_STATUS FATAL_ERROR) + ENDIF() + MESSAGE(${MESSAGE_STATUS} "Submodule '${SUBMODULE_NAME}' missing or incomplete (${RELATIVE_FILE} file not found)\n" + "Did you forget to specify '--recurse' when it was cloned?\n\n") + + ENDIF() +ENDMACRO() diff --git a/plugins/LadspaEffect/swh/CMakeLists.txt b/plugins/LadspaEffect/swh/CMakeLists.txt index cc4b6851983..3ebaa8eabc7 100644 --- a/plugins/LadspaEffect/swh/CMakeLists.txt +++ b/plugins/LadspaEffect/swh/CMakeLists.txt @@ -1,22 +1,21 @@ +INCLUDE(CheckCommand) +INCLUDE(CheckSubmodule) + +CHECK_SUBMODULE(swh/configure.ac) +CHECK_COMMAND(perl) +CHECK_COMMAND(patch) + MESSAGE("\nPreparing SWH LADSPA submodule\n--------------------------") +# FIXME: Fixes should be moved upstream to github.com/swh/ladspa SET(PLUGIN_BLACKLIST ${CMAKE_CURRENT_SOURCE_DIR}/swh/lookahead_limiter_1435.xml ${CMAKE_CURRENT_SOURCE_DIR}/swh/lookahead_limiter_const_1906.xml ) -# Check for command line dependencies -INCLUDE(CheckCommand) -CHECK_COMMAND(perl) -CHECK_COMMAND(patch) - -# Check for submodule contents before writing content -IF(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/swh/configure.ac") - MESSAGE(FATAL_ERROR "SWH submodule does not appear to be cloned properly.") -ENDIF() - # Patch swh to compile with various enviroments -MESSAGE("* Patching SWH") +# FIXME: Fixes should be moved upstream to github.com/swh/ladspa +MESSAGE("* Patching source") EXECUTE_PROCESS( COMMAND patch -N makestub.pl ../makestub.pl.patch COMMAND patch -N util/blo.c ../blo.c.patch @@ -33,72 +32,69 @@ ENDIF() # Create blank config.h FILE(WRITE swh/config.h "") -# Convert xml source files to C source files -# TODO: Prevent this from running on every configure step +# Precompiler PIC Macro +IF(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "") +ELSE() + SET(PIC_FLAGS "-fPIC -DPIC") +ENDIF() + +# Additional link flags +IF(LMMS_BUILD_WIN32 AND MINGW_PREFIX) + SET(LINK_FLAGS "${LINK_FLAGS} -shared -Wl,-no-undefined -Wl,-Bsymbolic -lm") +ELSEIF(LMMS_BUILD_APPLE) + SET(LINK_FLAGS "${LINK_FLAGS} -Bsymbolic -lm") +ENDIF() + +# Additional compile flags +SET(COMPILE_FLAGS "${COMPILE_FLAGS} -O3 -Wall") +SET(COMPILE_FLAGS "${COMPILE_FLAGS} -fomit-frame-pointer -fstrength-reduce -funroll-loops -ffast-math -c -fno-strict-aliasing") +SET(COMPILE_FLAGS "${COMPILE_FLAGS} ${PIC_FLAGS}") + +# Loop over every XML file FILE(GLOB XML_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/swh/*.xml") LIST(LENGTH XML_SOURCES XML_COUNT) LIST(REMOVE_ITEM XML_SOURCES ${PLUGIN_BLACKLIST}) LIST(SORT XML_SOURCES) LIST(LENGTH XML_SOURCES XML_WHITELIST) LIST(LENGTH PLUGIN_BLACKLIST BLACKLIST_COUNT) -MESSAGE("* Convert ${XML_WHITELIST} of ${XML_COUNT} XML files to C files (${BLACKLIST_COUNT} blacklisted)") +MESSAGE("* ${XML_WHITELIST} of ${XML_COUNT} XML files (${BLACKLIST_COUNT} blacklisted)") FOREACH(_item ${XML_SOURCES}) + # Get library name and (soon to be) C file GET_FILENAME_COMPONENT(_plugin "${_item}" NAME_WE) - EXECUTE_PROCESS( - COMMAND ./makestub.pl ${_item} - OUTPUT_FILE ${_plugin}.c - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/swh - OUTPUT_FILE ${_plugin}.c - RESULT_VARIABLE XML_STATUS + SET(_out_file "${CMAKE_CURRENT_SOURCE_DIR}/swh/${_plugin}.c") + + # Coerce XML source file to C + ADD_CUSTOM_COMMAND( + OUTPUT "${_out_file}" + COMMAND ./makestub.pl "${_item}" > "${_out_file}" + DEPENDS "${_item}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/swh" + VERBATIM ) - IF(NOT XML_STATUS EQUAL 0) - MESSAGE(FATAL_ERROR "Could not convert ${_plugin}.xml to ${_plugin}.c\n" - "Please ensure all SWH perl dependencies are installed, e.g. libxml-perl") - ENDIF() -ENDFOREACH() -MESSAGE("* Finished preparing submodule\n") -ADD_DEFINITIONS(-DFFTW3) -INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include" - "${CMAKE_CURRENT_SOURCE_DIR}/swh" - ${FFTW3F_INCLUDE_DIRS} - "${CMAKE_BINARY_DIR}") -LINK_DIRECTORIES(${FFTW3F_LIBRARY_DIRS}) -FILE(GLOB PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/swh/*.c") -LIST(SORT PLUGIN_SOURCES) + # Add a library target for this C file, which depends on success of makestup.pl + ADD_LIBRARY("${_plugin}" MODULE "${_out_file}") -FOREACH(_item ${PLUGIN_SOURCES}) - GET_FILENAME_COMPONENT(_plugin "${_item}" NAME_WE) - - ADD_LIBRARY("${_plugin}" MODULE "${_item}") - # vocoder_1337 does not use fftw3f + # Vocoder does not use fftw IF(NOT ("${_plugin}" STREQUAL "vocoder_1337")) TARGET_LINK_LIBRARIES("${_plugin}" -lfftw3f) ENDIF() - INSTALL(TARGETS "${_plugin}" LIBRARY DESTINATION "${PLUGIN_DIR}/ladspa") - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES PREFIX "") - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES COMPILE_FLAGS "-O3 -Wall -fomit-frame-pointer -fstrength-reduce -funroll-loops -ffast-math -c -fno-strict-aliasing") - IF(LMMS_BUILD_WIN32) - ADD_CUSTOM_COMMAND(TARGET "${_plugin}" POST_BUILD COMMAND "${STRIP}" \"$\") - ELSE(LMMS_BUILD_WIN32) - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -fPIC -DPIC") - ENDIF(LMMS_BUILD_WIN32) - IF(LMMS_BUILD_APPLE) - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES LINK_FLAGS "${LINK_FLAGS} -Bsymbolic -lm") - ELSEIF(NOT LMMS_BUILD_APPLE AND NOT LMMS_BUILD_OPENBSD) - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES LINK_FLAGS "${LINK_FLAGS} -shared -Wl,-no-undefined -Wl,-Bsymbolic -lm") - ENDIF(LMMS_BUILD_APPLE) - IF(LMMS_BUILD_LINUX OR LMMS_BUILD_HAIKU) - SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES LINK_FLAGS "${LINK_FLAGS}") - ENDIF(LMMS_BUILD_LINUX OR LMMS_BUILD_HAIKU) -ENDFOREACH(_item ${PLUGIN_SOURCES}) + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES PREFIX "") + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS}") + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES LINK_FLAGS "${LINK_FLAGS}") + INSTALL(TARGETS "${_plugin}" LIBRARY DESTINATION "${PLUGIN_DIR}/ladspa") +ENDFOREACH() -IF(LMMS_BUILD_WIN32) - SET(PIC_FLAGS "") -ELSE(LMMS_BUILD_WIN32) - SET(PIC_FLAGS "-fPIC") -ENDIF(LMMS_BUILD_WIN32) +ADD_DEFINITIONS(-DFFTW3) +INCLUDE_DIRECTORIES( + "${CMAKE_SOURCE_DIR}/include" + "${CMAKE_CURRENT_SOURCE_DIR}/swh" + ${FFTW3F_INCLUDE_DIRS} + "${CMAKE_BINARY_DIR}" +) +LINK_DIRECTORIES(${FFTW3F_LIBRARY_DIRS}) ADD_LIBRARY(iir STATIC swh/util/iir.c) SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}")