Skip to content

Commit

Permalink
Add option (PD_BUILD_STATIC_OBJECTS) to build static objects (for plu…
Browse files Browse the repository at this point in the history
…gdata|libpd|pd4web and others).

When set PD_BUILD_STATIC_OBJECTS=ON, pd.cmake compiles static libraries
for the objects. It can be useful when using libpd for standalone apps
like plugdata, Emscripten (like pd4web), and others.

The list for all the objects compiled for project can be acessed using
``` cmake
get_property(all_static_targets GLOBAL PROPERTY
"${PROJECT_NAME}_STATIC_LIBRARIES")
target_link_libraries(MyApp PRIVATE all_static_targets)
```
  • Loading branch information
charlesneimog committed Jun 21, 2024
1 parent 8cd3048 commit f576ddb
Showing 1 changed file with 46 additions and 24 deletions.
70 changes: 46 additions & 24 deletions pd.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# check if cmake version is higher than 3.19, we need cmake_language
if(${CMAKE_VERSION} VERSION_LESS "3.19")
message(FATAL_ERROR "CMake version must be at least 3.19")
message(FATAL_ERROR "pd.cmake requires Cmake Version 3.19 or newer")
endif()

# ╭──────────────────────────────────────╮
Expand All @@ -26,6 +26,13 @@ set(PD_INSTALL_LIBS
ON
CACHE BOOL "Install Pd Externals on PDLIBDIR")

set(PD_BUILD_STATIC_OBJECTS
OFF
CACHE
BOOL
"Enable building static objects. Useful when using self-contained objects with libpd, such as in embedded systems or standalone applications."
)

# ╭──────────────────────────────────────╮
# │ Get default PDLIBDIR │
# ╰──────────────────────────────────────╯
Expand Down Expand Up @@ -95,7 +102,8 @@ if(NOT PD_SOURCES_PATH)
HINTS ${PDBINDIR})
find_path(PD_HEADER_PATH m_pd.h PATHS ${PD_SOURCES_PATH})
if(NOT PD_HEADER_PATH)
message(FATAL_ERROR "<m_pd.h> not found in C:\\Program Files\\Pd\\src, is Pd installed?")
message(
FATAL_ERROR "<m_pd.h> not found in C:\\Program Files\\Pd\\src, is Pd installed?")
endif()

elseif(APPLE)
Expand All @@ -105,12 +113,18 @@ if(NOT PD_SOURCES_PATH)
get_filename_component(PD_SOURCES_PATH "${app}/Contents/Resources/src/" ABSOLUTE)
endforeach()
else()
message(FATAL_ERROR "PD_SOURCES_PATH not set and no Pd.app found in /Applications, is Pd installed?")
message(
FATAL_ERROR
"PD_SOURCES_PATH not set and no Pd.app found in /Applications, is Pd installed?"
)
endif()

find_path(PD_HEADER_PATH m_pd.h PATHS ${PD_SOURCES_PATH})
if(NOT PD_HEADER_PATH)
message(FATAL_ERROR "<m_pd.h> not found in /Applications/Pd.app/Contents/Resources/src/, is Pd installed?")
message(
FATAL_ERROR
"<m_pd.h> not found in /Applications/Pd.app/Contents/Resources/src/, is Pd installed?"
)
endif()
message(STATUS "PD_SOURCES_PATH not set, using ${PD_SOURCES_PATH}")

Expand Down Expand Up @@ -138,7 +152,8 @@ endif()
macro(set_pd_external_path EXTERNAL_PATH)
message(
DEPRECATION
"set_pd_external_path was removed, you can set PDLIBDIR and run cmake with '-DPD_INSTALL_LIBS=ON' instead")
"set_pd_external_path was removed, you can set PDLIBDIR and run cmake with '-DPD_INSTALL_LIBS=ON' instead"
)
endmacro(set_pd_external_path)

# ──────────────────────────────────────
Expand All @@ -157,13 +172,19 @@ function(pd_add_datafile OBJ_TARGET DATA_FILE)
if(${OBJ_TARGET} MATCHES "~$")
string(REGEX REPLACE "~$" "_tilde" OBJ_TARGET ${OBJ_TARGET})
endif()

if(OBJ_TARGET STREQUAL PROJECT_NAME)

endif()

foreach(DATA_FILE ${DATA_FILE})
if(IS_DIRECTORY ${DATA_FILE})
install(DIRECTORY ${DATA_FILE} DESTINATION ${PDLIBDIR}/${PROJECT_NAME})
else()
install(FILES ${DATA_FILE} DESTINATION ${PDLIBDIR}/${PROJECT_NAME})
endif()
endforeach()

endfunction(pd_add_datafile)

# ──────────────────────────────────────
Expand Down Expand Up @@ -206,14 +227,18 @@ macro(pd_set_lib_ext OBJ_TARGET_NAME)
endif()

if(NOT PD_EXTENSION)
message(FATAL_ERROR "Not possible to determine the extension of the library, please set PD_EXTENSION")
message(
FATAL_ERROR
"Not possible to determine the extension of the library, please set PD_EXTENSION"
)
endif()
set_target_properties(${OBJ_TARGET_NAME} PROPERTIES SUFFIX ${PD_EXTENSION})
endif()
endmacro(pd_set_lib_ext)

# ──────────────────────────────────────
function(pd_add_external PD_EXTERNAL_NAME EXTERNAL_SOURCES)

set(BOOLEAN_ARGS) # No args for now
set(ONE_ARGS TARGET) # Define optional arg for TARGET
set(MULTI_ARGS CXX_FLAGS C_FLAGS LINK_LIBRARIES) # Define multi args, CXX_FLAGS C_FLAGS
Expand All @@ -233,14 +258,20 @@ function(pd_add_external PD_EXTERNAL_NAME EXTERNAL_SOURCES)
set(OBJ_TARGET_NAME ${PD_EXTERNAL_NAME})
endif()

if(EMSCRIPTEN)
if(EMSCRIPTEN OR PD_BUILD_STATIC_OBJECTS)
add_library(${OBJ_TARGET_NAME} STATIC ${EXTERNAL_SOURCES})
set_target_properties(${OBJ_TARGET_NAME} PROPERTIES OUTPUT_NAME ${PD_EXTERNAL_NAME}) # External name output
set_target_properties(${OBJ_TARGET_NAME} PROPERTIES OUTPUT_NAME ${PD_EXTERNAL_NAME}
)
set_property(GLOBAL APPEND PROPERTY ${PROJECT_NAME}_STATIC_LIBRARIES ${OBJ_TARGET_NAME})
else()
add_library(${OBJ_TARGET_NAME} SHARED ${EXTERNAL_SOURCES})
set_target_properties(${OBJ_TARGET_NAME} PROPERTIES PREFIX "")
# remove lib prefix
set_target_properties(${OBJ_TARGET_NAME} PROPERTIES OUTPUT_NAME ${PD_EXTERNAL_NAME})
pd_set_lib_ext(${OBJ_TARGET_NAME})
get_property(
PD_EXTENSION
TARGET ${OBJ_TARGET_NAME}
PROPERTY SUFFIX)
endif()

# Check if CXX_FLAGS is defined, if true set the flags
Expand All @@ -257,9 +288,7 @@ function(pd_add_external PD_EXTERNAL_NAME EXTERNAL_SOURCES)
if(DEFINED PD_EXTERNAL_LINK_LIBRARIES)
target_link_libraries(${OBJ_TARGET_NAME} PRIVATE ${PD_EXTERNAL_LINK_LIBRARIES})
endif()

target_include_directories(${OBJ_TARGET_NAME} PRIVATE ${PD_SOURCES_PATH}) # Add Pd Includes

if(WIN32)
if(PD_FLOATSIZE EQUAL 64)
target_link_libraries(${OBJ_TARGET_NAME} PRIVATE "${PDBINDIR}/pd64.lib")
Expand All @@ -284,12 +313,6 @@ function(pd_add_external PD_EXTERNAL_NAME EXTERNAL_SOURCES)
target_compile_definitions(${OBJ_TARGET_NAME} PRIVATE PD_FLOATSIZE=64)
endif()

pd_set_lib_ext(${OBJ_TARGET_NAME})
get_property(
PD_EXTENSION
TARGET ${OBJ_TARGET_NAME}
PROPERTY SUFFIX)

pd_add_datafile(${PROJECT_NAME} ${CMAKE_BINARY_DIR}/${PD_EXTERNAL_NAME}${PD_EXTENSION})

endfunction(pd_add_external)
Expand All @@ -315,9 +338,12 @@ function(add_pd_external PROJECT_NAME EXTERNAL_NAME EXTERNAL_SOURCES)

foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR})
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR})
set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR})
set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
${CMAKE_BINARY_DIR})
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
${CMAKE_BINARY_DIR})
set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG}
${CMAKE_BINARY_DIR})
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)

if(WIN32)
Expand All @@ -342,8 +368,4 @@ function(add_pd_external PROJECT_NAME EXTERNAL_NAME EXTERNAL_SOURCES)
pd_set_lib_ext(${PROJECT_NAME})
pd_add_datafile(${PROJECT_NAME} "${CMAKE_CURRENT_BINARY_DIR}/${PD_EXTERNAL_NAME}${PD_EXTENSION}")

if(PD_INSTALL_LIBS)

endif()

endfunction(add_pd_external)

0 comments on commit f576ddb

Please sign in to comment.