Skip to content
Merged
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
103 changes: 55 additions & 48 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,25 @@
# under the European Union’s Horizon 2020 research and innovation programme
# (grant agreement No 725899).

cmake_minimum_required(VERSION 3.11)
cmake_minimum_required(VERSION 3.18)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/scripts")

set(PD_PATH "" CACHE PATH "The top level of a Pure Data installation")
if(NOT PD_PATH)
message(FATAL_ERROR "Pure Data source or application path is not set. Please pass with with -DPD_PATH=<path> or via ccmake / CMake gui. On Mac OS, you can use pd.app/Contents/Resources")
endif()

set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/release-packaging" CACHE PATH "")
set(PD_INSTALL_PREFIX "." CACHE PATH "Prefix for assembling PD packages")
set(FLUID_PACKAGE_NAME FluidCorpusManipulation CACHE STRING "Name for published package")
set(PD_PACKAGE_ROOT ${PD_INSTALL_PREFIX}/${FLUID_PACKAGE_NAME})

set(FLUID_PATH "" CACHE PATH "Optional top level of the flucoma-core repo; will download if absent")

option(DOCS "Generate HTML documentation" OFF)
Expand All @@ -33,21 +41,8 @@ project (flucoma-pd LANGUAGES CXX)

set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY ON)

MACRO(SUBDIRLIST result curdir)
FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO()

include(FetchContent)

set(FETCHCONTENT_QUIET FALSE)

FetchContent_Declare(
flucoma-core
GIT_REPOSITORY https://github.com/flucoma/flucoma-core.git
Expand All @@ -68,14 +63,10 @@ if(FLUID_PATH)
)
endif()

FetchContent_GetProperties(flucoma-core)
if(NOT flucoma-core_POPULATED)
FetchContent_Populate(flucoma-core)
add_subdirectory(${flucoma-core_SOURCE_DIR} ${flucoma-core_BINARY_DIR})
include(flucoma_version)
include(flucoma-buildtools)
include(flucoma-buildtype)
endif()
FetchContent_MakeAvailable(flucoma-core)
include(flucoma_version)
include(flucoma-buildtools)
include(flucoma-buildtype)

set_if_toplevel(VAR CMAKE_LIBRARY_OUTPUT_DIRECTORY
TOPLEVEL "${CMAKE_CURRENT_SOURCE_DIR}/pd_objects"
Expand All @@ -90,14 +81,10 @@ if(DOCS)
)
endif()

FetchContent_GetProperties(flucoma-docs)
if(NOT flucoma-docs_POPULATED)
FetchContent_Populate(flucoma-docs)
file(GLOB_RECURSE DOC_SOURCE RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${flucoma-docs_SOURCE_DIR}/**/*.cpp" )
source_group("\\HTMLs Doc Gen" FILES ${DOC_SOURCE})
add_subdirectory(${flucoma-docs_SOURCE_DIR} ${flucoma-docs_BINARY_DIR})
endif()

FetchContent_MakeAvailable(flucoma-docs)
include(FlucomaDocs)
set(PD_DOC_OUT "${CMAKE_BINARY_DIR}/pd_ref")
add_ref_target(pd "Making PD docs")
add_custom_target(PD_MAKE_DOCS ALL DEPENDS MAKE_PD_REF)
endif()

Expand Down Expand Up @@ -129,25 +116,45 @@ if(MSVC)
target_compile_options(FLUID_PD INTERFACE -D_USE_MATH_DEFINES)
endif()

SUBDIRLIST(PROJECT_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src)
foreach (project_dir ${PROJECT_DIRS})
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/${project_dir}/CMakeLists.txt")
message("Generating: ${project_dir}")
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/src/${project_dir}")
source_group("" FILES "${project_dir}.cpp")
endif ()
endforeach ()

#install
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/release-packaging")
set(PD_INSTALL_PREFIX "." CACHE PATH "Prefix for assembling PD packages")
set(FLUID_PACKAGE_NAME FluidCorpusManipulation CACHE STRING "Name for published package")
set(PD_PACKAGE_ROOT ${PD_INSTALL_PREFIX}/${FLUID_PACKAGE_NAME})
include(MakePDSources)

# generate targets for standalone clients
get_client_group(NONE client_list)
foreach(client ${client_list})
get_core_client_header(${client} header)
get_core_client_class(${client} class)
generate_pd_source(
CLIENTS ${client}
HEADERS ${header}
CLASSES ${class}
)
endforeach()

#generate target for MANIPULATION group
get_client_group(MANIPULATION client_list)
foreach(client ${client_list})
get_core_client_header(${client} header)
get_core_client_class(${client} class)
list(APPEND MANIPULATION_CLIENTS ${client})
list(APPEND MANIPULATION_HEADERS ${header})
list(APPEND MANIPULATION_CLASSES ${class})
endforeach()

generate_pd_source(
CLIENTS ${MANIPULATION_CLIENTS}
HEADERS ${MANIPULATION_HEADERS}
CLASSES ${MANIPULATION_CLASSES}
FILENAME fluid_libmanipulation
)

#slashes at the end of the directories copy just the files, rather than the hierarchy; so don't remove them
install(DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/
DESTINATION ${PD_PACKAGE_ROOT}
FILES_MATCHING REGEX "\\.(pd_darwin|pd_linux|dll)")
# make a working tree for devs

add_custom_target(MAKE_DEV_FOlDER
COMMAND ${CMAKE_COMMAND} -DROOT="${CMAKE_CURRENT_SOURCE_DIR}" -DCORE_SRC="${flucoma-core_SOURCE_DIR}" -P "${CMAKE_CURRENT_SOURCE_DIR}/scripts/MakeWorkingFolder.cmake"
COMMENT "synthesising working copy at ${CMAKE_CURRENT_SOURCE_DIR}/dev"
)

#install steps (externals have their own install target)
install(DIRECTORY help/
DESTINATION ${PD_PACKAGE_ROOT}
FILES_MATCHING PATTERN "*.pd")
Expand Down
185 changes: 185 additions & 0 deletions scripts/MakePDSources.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# Part of the Fluid Corpus Manipulation Project (http://www.flucoma.org/)
# Copyright 2017-2019 University of Huddersfield.
# Licensed under the BSD-3 License.
# See license.md file in the project root for full license information.
# This project has received funding from the European Research Council (ERC)
# under the European Union’s Horizon 2020 research and innovation programme
# (grant agreement No 725899).

cmake_minimum_required(VERSION 3.18)

include(FLuidClientStub)


# MSVC_RUNTIME_LIBRARY
# if(MSVC)
# foreach(flag_var
# CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
# CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
# if(${flag_var} MATCHES "/MD")
# string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
# endif()
# endforeach()
# endif()

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")

function(make_external_name client header var)
string(FIND ${header} "clients/rt" is_rtclient)
string(FIND ${client} "Buf" is_bufclient)
string(TOLOWER ${client} lc_client)
string(PREPEND lc_client "fluid.")
if(${is_rtclient} GREATER -1 AND ${is_bufclient} EQUAL -1)
string(APPEND lc_client "~")
endif()
set(${var} ${lc_client} PARENT_SCOPE)
endfunction()

function (add_pd_external external source)
string(REPLACE "~" "_tilde" safe_name ${external})

add_library(${safe_name} SHARED ${source})

target_link_libraries(${safe_name}
PRIVATE
FLUID_DECOMPOSITION FLUID_PD
)

target_include_directories(
${safe_name}
PRIVATE
"${FLUID_VERSION_PATH}"
)

if(APPLE)
file (STRINGS "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pd-linker-flags.txt" PD_SYM_LINKER_FLAGS)
target_link_options(${safe_name} PRIVATE ${PD_SYM_LINKER_FLAGS})
endif()

set_target_properties(${safe_name}
PROPERTIES
OUTPUT_NAME "${external}"
)

if(WIN32)
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
target_compile_definitions(${safe_name}
PRIVATE
PD_LONGINTTYPE=intptr_t
)
endif()
endif()

if(MSVC)
target_compile_options(${safe_name} PRIVATE /W3 /bigobj)
target_link_libraries(${safe_name} PRIVATE ${PD_LIB})
else()
target_compile_options(${safe_name} PRIVATE -Wall -Wextra -Wpedantic -Wreturn-type -Wconversion -Wno-c++11-narrowing)
endif()

#set AVX, or whatever
# if(DEFINED FLUID_ARCH)
# target_compile_options(${PROJECT_NAME} PRIVATE ${FLUID_ARCH})
# endif()

get_property(HEADERS TARGET FLUID_DECOMPOSITION PROPERTY INTERFACE_SOURCES)
source_group(TREE "${flucoma-core_SOURCE_DIR}/include" FILES ${HEADERS})

get_property(HEADERS TARGET FLUID_PD PROPERTY INTERFACE_SOURCES)
source_group("PD Wrapper" FILES ${HEADERS})
source_group("" FILES "${source}")

if(MSVC)
target_compile_definitions(${safe_name} PRIVATE USE_MATH_DEFINES)
endif(MSVC)

### Output ###

if (APPLE)

set_target_properties(${safe_name} PROPERTIES
SUFFIX ".pd_darwin"
PREFIX ""
XCODE_ATTRIBUTE_MACH_O_TYPE mh_dylib
XCODE_ATTRIBUTE_EXECUTABLE_PREFIX ""
XCODE_ATTRIBUTE_EXECUTABLE_EXTENSION "pd_darwin"
# OSX_DEPLOYMENT_TARGET "10.8"
)
#targeting <= 10.9, need to explicitly set libc++
target_compile_options(${safe_name} PRIVATE -stdlib=libc++)

elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")

set_target_properties(${safe_name} PROPERTIES
SUFFIX ".pd_linux"
PREFIX ""
POSITION_INDEPENDENT_CODE ON
)

elseif (MSVC)
set_target_properties(${safe_name} PROPERTIES
SUFFIX ".dll"
WINDOWS_EXPORT_ALL_SYMBOLS ON
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
RUNTIME_OUTPUT_DIRECTORY_RelWithDebInfo ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
)

# warning about constexpr not being const in c++14
set_target_properties(${safe_name}
PROPERTIES
COMPILE_FLAGS "/wd4814"
)
endif()

if(NOT ARG_NOINSTALL)
install(
TARGETS ${safe_name}
LIBRARY DESTINATION ${PD_PACKAGE_ROOT}/externals
RUNTIME DESTINATION ${PD_PACKAGE_ROOT}/externals
)
endif()

endfunction()

function(generate_pd_source)
# # Define the supported set of keywords
set(noValues "")
set(singleValues FILENAME EXTERNALS_OUT FILE_OUT)
set(multiValues CLIENTS HEADERS CLASSES)
# # Process the arguments passed in
include(CMakeParseArguments)
cmake_parse_arguments(ARG
"${noValues}"
"${singleValues}"
"${multiValues}"
${ARGN})

if(ARG_FILENAME)
set(external_name ${ARG_FILENAME})
else()
list(GET ARG_CLIENTS 0 client_name)
list(GET ARG_HEADERS 0 header)
make_external_name(${client_name} ${header} external_name)
endif()

string(REPLACE "~" "_tilde" safe_name ${external_name})
string(REPLACE "." "0x2e" munge_name ${safe_name})

#for reasons unclear to me, PD expects the string 'setup' to be glued to *different ends* of the external name depending on whether or not some characters have been replaced by hex strings (see s_loader.c)
if(${safe_name} STREQUAL ${munge_name}) #no replacement
set(ENTRY_POINT "extern \"C\" void ${munge_name}_setup(void)")
else()
set(ENTRY_POINT "extern \"C\" void setup_${munge_name}(void)")
endif()

set(WRAPPER_TEMPLATE [=[makePDWrapper<${class}>("${external}");]=])
set(CCE_WRAPPER "#include \"FluidPDWrapper.hpp\"")
generate_source(${ARGN} EXTERNALS_OUT external FILE_OUT outfile)

message(STATUS "Generating: ${external_name}")
add_pd_external(${external_name} ${outfile})
endfunction()
25 changes: 25 additions & 0 deletions scripts/MakeWorkingFolder.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Part of the Fluid Corpus Manipulation Project (http://www.flucoma.org/)
# Copyright 2017-2019 University of Huddersfield.
# Licensed under the BSD-3 License.
# See license.md file in the project root for full license information.
# This project has received funding from the European Research Council (ERC)
# under the European Union’s Horizon 2020 research and innovation programme
# (grant agreement No 725899).

cmake_minimum_required(VERSION 3.18)

file(GLOB helpfiles "${ROOT}/help/*")
file(GLOB abstractions "${ROOT}/abstractions/*")
file(GLOB externals "${ROOT}/pd_objects/*")

set(devfolder "${ROOT}/dev")
file(REMOVE_RECURSE ${devfolder})
file(MAKE_DIRECTORY ${devfolder})

foreach(item IN LISTS helpfiles abstractions externals)
get_filename_component(item_name "${item}" NAME)
file(CREATE_LINK "${item}" "${devfolder}/${item_name}" SYMBOLIC)
endforeach()

file(CREATE_LINK "${CORE_SRC}/Resources/AudioFiles/" "${devfolder}/media" SYMBOLIC)
file(CREATE_LINK "${CORE_SRC}/Resources/Data/" "${devfolder}/data" SYMBOLIC)
Loading