Skip to content

Commit

Permalink
Cache coerced C files, simplify build logic
Browse files Browse the repository at this point in the history
  • Loading branch information
tresf committed Nov 3, 2017
1 parent 2235a82 commit 38d0e37
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 61 deletions.
66 changes: 66 additions & 0 deletions cmake/modules/CheckSubmodule.cmake
Original file line number Diff line number Diff line change
@@ -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, <tres.finocchiaro@gmail.com>
#
# 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()
118 changes: 57 additions & 61 deletions plugins/LadspaEffect/swh/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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}" \"$<TARGET_FILE:${_plugin}>\")
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}")
Expand Down

0 comments on commit 38d0e37

Please sign in to comment.