Skip to content
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
68 changes: 68 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Copyright 2018 The Max-API Authors. All rights reserved.
# Use of this source code is governed by the MIT License found in the License.md file.

cmake_minimum_required(VERSION 3.19)

project(max-sdk-base)

# we need to access this directory in some places
set_property(GLOBAL PROPERTY C74_MAX_SDK_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
include(script/c74_add_max_target.cmake)


# Create interface lib for max-sdk-base headers
set(target max-sdk-base-headers)
add_library(${target} INTERFACE
"c74support/c74_jitter.h"
"c74support/c74_max.h"
"c74support/c74_msp.h"
"c74support/c74_ui.h"
"c74support/c74_ui_graphics.h"
)
set_target_properties(${target} PROPERTIES FOLDER "C74_Libraries")



target_include_directories(${target}
INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c74support>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c74support/jit-includes>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c74support/max-includes>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c74support/msp-includes>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/c74support>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/c74support/jit-includes>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/c74support/max-includes>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/c74support/msp-includes>"
)
set_target_properties(${target} PROPERTIES FOLDER "C74_Libraries")


set(target max-sdk-base)
add_library(${target} INTERFACE)
target_link_libraries(${target} INTERFACE max-sdk-base-headers)
set_target_properties(${target} PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(${target} PROPERTIES FOLDER "C74_Libraries")

# Link to precompiled libraries
set(C74_SUPPORT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/c74support")
set(MAX_SDK_INCLUDES "${C74_SUPPORT_DIR}/max-includes")
set(MAX_SDK_MSP_INCLUDES "${C74_SUPPORT_DIR}/msp-includes")
set(MAX_SDK_JIT_INCLUDES "${C74_SUPPORT_DIR}/jit-includes")
if (APPLE)
find_library(MSP_LIBRARY "MaxAudioAPI" REQUIRED
PATHS "${MAX_SDK_MSP_INCLUDES}"
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
# only use the specific path, don't look in system root this enables cross
# compilation to provide an alternative root but also find this specific pat
)
find_library(JITTER_LIBRARY "JitterAPI" REQUIRED
PATHS "${MAX_SDK_JIT_INCLUDES}"
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
)
target_link_libraries(${target} INTERFACE ${MSP_LIBRARY})
target_link_libraries(${target} INTERFACE ${JITTER_LIBRARY})
elseif (WIN32)
target_link_libraries(${target} INTERFACE "${MAX_SDK_INCLUDES}/x64/MaxAPI.lib")
target_link_libraries(${target} INTERFACE "${MAX_SDK_MSP_INCLUDES}/x64/MaxAudio.lib")
target_link_libraries(${target} INTERFACE "${MAX_SDK_JIT_INCLUDES}/x64/jitlib.lib")
endif ()
102 changes: 102 additions & 0 deletions script/c74_add_max_target.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Copyright 2018 The Max-API Authors. All rights reserved.
# Use of this source code is governed by the MIT License found in the License.md file.

include("${CMAKE_CURRENT_LIST_DIR}/macros.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/git-rev.cmake")

# This command creates a project as well as a libary target with the specified name.
# The list of sources which is passed will be added to the target.
#
# Call example:
# c74_add_max_target(mytarget SOURCES main.cpp asd.cpp)
#
function(c74_add_max_target target)
set(sources_arg SOURCES)
cmake_parse_arguments(PARSE_ARGV 0 PARAMS "${options}" "${oneValueArgs}" "${sources_arg}")

c74_max_pre_project_calls()

project(${target})

c74_max_post_project_calls()


# Create target
add_library(${target} MODULE "${PARAMS_SOURCES}")
target_link_libraries(${target} PRIVATE max-sdk-base)
set_target_properties(${target} PROPERTIES OUTPUT_NAME "${${target}_EXTERN_OUTPUT_NAME}")
set_target_properties(${target} PROPERTIES PREFIX "") # remove the 'lib' prefix for some generators


# Append link flags (are somehow not adopted from CMAKE_MODULE_LINKER_FLAGS)
if (APPLE)
file (STRINGS "${MAX_SDK_BASE_DIR}/script/max-linker-flags.txt" C74_SYM_MAX_LINKER_FLAGS)
set_property(TARGET ${target} APPEND PROPERTY LINK_FLAGS ${C74_SYM_MAX_LINKER_FLAGS})
endif ()


# C++ standard and compile flags
set(C74_CXX_STANDARD 0)
if (${C74_CXX_STANDARD} EQUAL 98) # From max-posttarget, seems redundant:
if (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98 -stdlib=libstdc++")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libstdc++")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -stdlib=libstdc++")
endif ()
else ()
set_target_properties(${target} PROPERTIES CXX_STANDARD 17)
set_target_properties(${target} PROPERTIES CXX_STANDARD_REQUIRED ON)
endif ()


# Configuration and link to precompiled libs (the latter not anymore, instead link against max-sdk-base library which links against these)
if (APPLE)
if ("${target}" MATCHES "jit.gl.*")
target_link_libraries(${target} PUBLIC "-framework OpenGL")
endif()
set_target_properties(${target} PROPERTIES BUNDLE True)
set_target_properties(${target} PROPERTIES BUNDLE_EXTENSION "mxo")
set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_WRAPPER_EXTENSION "mxo")
set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_BUNDLE_VERSION "${GIT_VERSION_TAG}")
set_target_properties(${target} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${MAX_SDK_BASE_DIR}/script/Info.plist.in")
set_target_properties(${target} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${AUTHOR_DOMAIN}.${BUNDLE_IDENTIFIER}")
elseif (WIN32)
if ("${target}" MATCHES "_test")
else ()
if ("${target}" MATCHES "jit.gl.*")
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
target_link_libraries(${target} PUBLIC ${OPENGL_LIBRARIES})
endif()
endif ()

set_target_properties(${target} PROPERTIES SUFFIX ".mxe64")

if (CMAKE_GENERATOR MATCHES "Visual Studio")
set_target_properties(${target} PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set_target_properties(${target} PROPERTIES COMPILE_FLAGS "/wd4814") # warning about constexpr not being const in c++14
set_target_properties(${target} PROPERTIES LINK_FLAGS "/INCREMENTAL:NO") # do not generate ILK files
set_target_properties(${target} PROPERTIES COMPILE_FLAGS "/MP") # allow parallel builds
endif ()

if (EXCLUDE_FROM_COLLECTIVES STREQUAL "yes")
target_compile_definitions(${target} PRIVATE "-DEXCLUDE_FROM_COLLECTIVES")
endif()

if (ADD_VERINFO)
target_sources(${target} PRIVATE "${MAX_SDK_BASE_DIR}/script/verinfo.rc")
endif()
endif ()


# Post Build
if (APPLE AND NOT "${target}" MATCHES "_test")
add_custom_command(
TARGET ${target}
POST_BUILD
COMMAND cp "${MAX_SDK_BASE_DIR}/script/PkgInfo" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${${target}_EXTERN_OUTPUT_NAME}.mxo/Contents/PkgInfo"
COMMENT "Copy PkgInfo"
)
endif ()

endfunction()
68 changes: 68 additions & 0 deletions script/macros.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@


macro(c74_max_pre_project_calls)
if (WIN32)
if (NOT CMAKE_GENERATOR MATCHES "Visual Studio")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
endif ()
endif ()

if (APPLE)
if (CMAKE_OSX_ARCHITECTURES STREQUAL "")
set(CMAKE_OSX_ARCHITECTURES x86_64)
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "Minimum OS X deployment version" FORCE)
endif ()
endmacro()


macro(c74_set_extern_output_name)
if ("${PROJECT_NAME}" MATCHES ".*_tilde")
string(REGEX REPLACE "_tilde" "~" EXTERN_OUTPUT_NAME_DEFAULT "${PROJECT_NAME}")
else ()
set(EXTERN_OUTPUT_NAME_DEFAULT "${PROJECT_NAME}")
endif ()
set("${PROJECT_NAME}_EXTERN_OUTPUT_NAME" "${EXTERN_OUTPUT_NAME_DEFAULT}" CACHE STRING "The name to give to the external output file/directory")
mark_as_advanced("${PROJECT_NAME}_EXTERN_OUTPUT_NAME")
endmacro()


macro(c74_set_include_paths)
get_property(MAX_SDK_BASE_DIR GLOBAL PROPERTY C74_MAX_SDK_BASE_DIR)
set(C74_SUPPORT_DIR "${MAX_SDK_BASE_DIR}/c74support")
set(MAX_SDK_INCLUDES "${C74_SUPPORT_DIR}/max-includes")
set(MAX_SDK_MSP_INCLUDES "${C74_SUPPORT_DIR}/msp-includes")
set(MAX_SDK_JIT_INCLUDES "${C74_SUPPORT_DIR}/jit-includes")

set(C74_INCLUDES "${C74_SUPPORT_DIR}" "${MAX_SDK_INCLUDES}" "${MAX_SDK_MSP_INCLUDES}" "${MAX_SDK_JIT_INCLUDES}")
set(C74_SCRIPTS "${MAX_SDK_BASE_DIR}/script")
endmacro()


macro(c74_max_post_project_calls)
c74_set_include_paths()
c74_set_extern_output_name()
if (WIN32)
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/pdb/$<CONFIG>")

set(MaxAPI_LIB "${MAX_SDK_INCLUDES}/x64/MaxAPI.lib")
set(MaxAudio_LIB "${MAX_SDK_MSP_INCLUDES}/x64/MaxAudio.lib")
set(Jitter_LIB "${MAX_SDK_JIT_INCLUDES}/x64/jitlib.lib")

mark_as_advanced(MaxAPI_LIB)
mark_as_advanced(MaxAudio_LIB)
mark_as_advanced(Jitter_LIB)

add_definitions(
-DMAXAPI_USE_MSCRT
-DWIN_VERSION
-D_USE_MATH_DEFINES
)
elseif (APPLE)
file (STRINGS "${MAX_SDK_BASE_DIR}/script/max-linker-flags.txt" C74_SYM_MAX_LINKER_FLAGS)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
endif ()
endmacro()
78 changes: 4 additions & 74 deletions script/max-pretarget.cmake
Original file line number Diff line number Diff line change
@@ -1,66 +1,20 @@
# Copyright 2018 The Max-API Authors. All rights reserved.
# Use of this source code is governed by the MIT License found in the License.md file.

string(REGEX REPLACE "(.*)/" "" THIS_FOLDER_NAME "${CMAKE_CURRENT_SOURCE_DIR}")
include("${CMAKE_CURRENT_LIST_DIR}/macros.cmake")

string(REGEX REPLACE "(.*)/" "" THIS_FOLDER_NAME "${CMAKE_CURRENT_SOURCE_DIR}")
string(REPLACE "~" "_tilde" THIS_FOLDER_NAME "${THIS_FOLDER_NAME}")

if (WIN32)
# These must be prior to the "project" command
# https://stackoverflow.com/questions/14172856/compile-with-mt-instead-of-md-using-cmake

if (CMAKE_GENERATOR MATCHES "Visual Studio")
set(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
set(CMAKE_C_FLAGS_MINSIZEREL "/MT /O1 /Ob1 /D NDEBUG")
set(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Ob2 /D NDEBUG")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")

set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
set(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O1 /Ob1 /D NDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /D NDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")

add_compile_options(
$<$<CONFIG:>:/MT>
$<$<CONFIG:Debug>:/MTd>
$<$<CONFIG:Release>:/MT>
$<$<CONFIG:MinSizeRel>:/MT>
$<$<CONFIG:RelWithDebInfo>:/MT>
)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
endif ()
endif ()
c74_max_pre_project_calls()

project(${THIS_FOLDER_NAME})

if ("${PROJECT_NAME}" MATCHES ".*_tilde")
string(REGEX REPLACE "_tilde" "~" EXTERN_OUTPUT_NAME_DEFAULT "${PROJECT_NAME}")
else ()
set(EXTERN_OUTPUT_NAME_DEFAULT "${PROJECT_NAME}")
endif ()
set("${PROJECT_NAME}_EXTERN_OUTPUT_NAME" "${EXTERN_OUTPUT_NAME_DEFAULT}" CACHE STRING "The name to give to the external output file/directory")
mark_as_advanced("${PROJECT_NAME}_EXTERN_OUTPUT_NAME")

if (NOT DEFINED C74_SUPPORT_DIR)
set(C74_SUPPORT_DIR ${CMAKE_CURRENT_LIST_DIR}/../c74support)
endif ()

set(MAX_SDK_INCLUDES "${C74_SUPPORT_DIR}/max-includes")
set(MAX_SDK_MSP_INCLUDES "${C74_SUPPORT_DIR}/msp-includes")
set(MAX_SDK_JIT_INCLUDES "${C74_SUPPORT_DIR}/jit-includes")
c74_max_post_project_calls()

set(C74_INCLUDES "${C74_SUPPORT_DIR}" "${MAX_SDK_INCLUDES}" "${MAX_SDK_MSP_INCLUDES}" "${MAX_SDK_JIT_INCLUDES}")
set(C74_SCRIPTS "${CMAKE_CURRENT_LIST_DIR}")

set(C74_CXX_STANDARD 0)

if (APPLE)
if (CMAKE_OSX_ARCHITECTURES STREQUAL "")
set(CMAKE_OSX_ARCHITECTURES x86_64)
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE STRING "Minimum OS X deployment version" FORCE)
endif ()

if (DEFINED C74_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${C74_LIBRARY_OUTPUT_DIRECTORY}")
Expand All @@ -73,27 +27,3 @@ else ()
endif()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")

if (WIN32)
set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/pdb/$<CONFIG>")

SET(MaxAPI_LIB ${MAX_SDK_INCLUDES}/x64/MaxAPI.lib)
SET(MaxAudio_LIB ${MAX_SDK_MSP_INCLUDES}/x64/MaxAudio.lib)
SET(Jitter_LIB ${MAX_SDK_JIT_INCLUDES}/x64/jitlib.lib)

MARK_AS_ADVANCED (MaxAPI_LIB)
MARK_AS_ADVANCED (MaxAudio_LIB)
MARK_AS_ADVANCED (Jitter_LIB)

add_definitions(
-DMAXAPI_USE_MSCRT
-DWIN_VERSION
-D_USE_MATH_DEFINES
)
elseif (APPLE)
file (STRINGS "${CMAKE_CURRENT_LIST_DIR}/max-linker-flags.txt" C74_SYM_MAX_LINKER_FLAGS)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${C74_SYM_MAX_LINKER_FLAGS}")
endif ()