Skip to content

Commit 89feb6d

Browse files
committed
support for addons with frameworks and functions.
1 parent 9fcd95c commit 89feb6d

File tree

5 files changed

+360
-50
lines changed

5 files changed

+360
-50
lines changed

CMakeLists.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
#https://github.com/peterkolski/ofxCMake/blob/master/modules/configApple.cmake
1+
# References
2+
# https://cliutils.gitlab.io/modern-cmake/chapters/basics.html
3+
# https://www.studyplan.dev/cmake/cpp-build-process
4+
# https://github.com/HerrNamenlos123/openFrameworks/blob/master/cmake/utils.cmake
5+
# https://github.com/peterkolski/ofxCMake/blob/master/modules/configApple.cmake
26

37
# OPENFRAMEWORKS CMAKE
4-
cmake_minimum_required(VERSION 3.16...4.0)
8+
cmake_minimum_required(VERSION 3.18...4.0)
59

610
set(OF_VERSION "12.1")
711

@@ -432,6 +436,7 @@ if( APPLE ) # Apple is a Unix, too. So dont ask only first UNIX
432436
endif()
433437

434438
file(GLOB OF_LIBS_DIRECTORIES CONFIGURE_DEPENDS "${OF_LIBS_DIRECTORY}/*")
439+
# loop through each of the libs / folders and try to extract static libs
435440
foreach(lib_dir ${OF_LIBS_DIRECTORIES})
436441
of_add_library_from_directory(${lib_dir} OUT_LIBS_ADDED)
437442
list(APPEND OF_CORE_LIBS ${OUT_LIBS_ADDED} )

cmake/ofAddons.cmake

Lines changed: 161 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,53 @@
11
include("${OF_CMAKE_DIRECTORY}/ofUtils.cmake")
22

3+
# extract_F_dirs_from_flag_lines(<out_var> <line> [<line>...])
4+
# - Takes lines like "-F/path ... -framework Foo" and returns the -F dirs.
5+
function(of_extract_F_dirs_from_flag_lines OUT_VAR)
6+
set(_dirs "")
7+
foreach(line IN LISTS ARGN)
8+
separate_arguments(tokens NATIVE_COMMAND "${line}")
9+
foreach(tok IN LISTS tokens)
10+
if(tok MATCHES "^-F(.+)$")
11+
list(APPEND _dirs "${CMAKE_MATCH_1}")
12+
endif()
13+
endforeach()
14+
endforeach()
15+
list(REMOVE_DUPLICATES _dirs)
16+
17+
set(F_DIRS_NORM "")
18+
foreach(d IN LISTS _dirs)
19+
string(REGEX REPLACE "/+$" "" d "${d}")
20+
list(APPEND F_DIRS_NORM "${d}")
21+
endforeach()
22+
23+
set(${OUT_VAR} "${F_DIRS_NORM}" PARENT_SCOPE)
24+
endfunction()
25+
26+
# collect_framework_bundles_from_F_dirs(<out_var> <F_dir> [<F_dir>...])
27+
# - Recurses under each F_dir and returns ONLY top-level *.framework directories.
28+
function(of_collect_framework_bundles_from_F_dirs OUT_VAR)
29+
set(_found "")
30+
foreach(root IN LISTS ARGN)
31+
if(NOT IS_DIRECTORY "${root}")
32+
continue()
33+
endif()
34+
# Recurse for paths ending in *.framework; include directories
35+
file(GLOB_RECURSE _cands
36+
LIST_DIRECTORIES true
37+
CONFIGURE_DEPENDS
38+
"${root}/*.framework")
39+
foreach(p IN LISTS _cands)
40+
if(IS_DIRECTORY "${p}" AND p MATCHES "\\.framework$")
41+
list(APPEND _found "${p}")
42+
endif()
43+
endforeach()
44+
endforeach()
45+
list(REMOVE_DUPLICATES _found)
46+
set(${OUT_VAR} "${_found}" PARENT_SCOPE)
47+
endfunction()
48+
49+
50+
351
######## ADDONS #######################
452
function(of_addon ADDON_NAME)
553

@@ -60,7 +108,10 @@ function(of_addon ADDON_NAME)
60108
message(VERBOSE "of_addon ${ADDON_NAME}: Going to parse addon includes via directories")
61109
# of_get_all_source_files(${ADDON_ROOT}, PARSED_ADDON_SRC_FILES )
62110
# of_get_all_source_files("${ADDON_ROOT}/src", PARSED_ADDON_SRC_FILES)
63-
of_get_all_source_files(${ADDON_ROOT} PARSED_ADDON_SRC_FILES_ABS)
111+
# of_get_all_source_files(${ADDON_ROOT} PARSED_ADDON_SRC_FILES_ABS)
112+
of_get_all_source_files("${ADDON_ROOT}/libs" PARSED_ADDON_LIBS_SRC_FILES_ABS)
113+
of_get_all_source_files("${ADDON_ROOT}/src" PARSED_ADDON_SRC_FILES_ABS)
114+
list(APPEND PARSED_ADDON_SRC_FILES_ABS ${PARSED_ADDON_LIBS_SRC_FILES_ABS})
64115
# file(GLOB_RECURSE PARSED_ADDON_SRC_FILES "${ADDON_ROOT}/*.cpp")
65116

66117
message(VERBOSE "--------------------------------------------")
@@ -79,6 +130,7 @@ function(of_addon ADDON_NAME)
79130
# of_get_subdirs_recursive("${ADDON_ROOT}/libs" OUT_DIRS)
80131

81132
set(PARSED_ADDON_LIBS_ABS "" )
133+
# set(PARSED_ADDON_FRAMEWORKS_ABS "")
82134
#parse based on the directory structure
83135
file(GLOB PARSED_ADDON_LIBS_DIRECTORIES CONFIGURE_DEPENDS "${ADDON_ROOT}/libs/*")
84136
foreach(lib_dir ${PARSED_ADDON_LIBS_DIRECTORIES})
@@ -116,6 +168,14 @@ function(of_addon ADDON_NAME)
116168
# message(VERBOSE "of_addon ${ADDON_NAME}: Reading lib dir: ${lib_dir}")
117169
of_get_static_libs_from_directory(${lib_dir} TMP_PARSED_ADDON_LIBS )
118170
list(APPEND PARSED_ADDON_LIBS_ABS ${TMP_PARSED_ADDON_LIBS} )
171+
172+
# try to grab a framework //
173+
# message(STATUS "Trying to grab frameworks from ${lib_dir}")
174+
# file(GLOB_RECURSE PARSED_ADDON_FRAMEWORKS_ABS
175+
# LIST_DIRECTORIES true
176+
# "${lib_dir}/*.framework")
177+
# list(TRANSFORM PARSED_ADDON_FRAMEWORKS_ABS REPLACE "\\\\" "/") # CMake 3.16 OK
178+
119179
# message(VERBOSE "of_addon ${ADDON_NAME}: TMP_PARSED_ADDON_LIBS: ${TMP_PARSED_ADDON_LIBS}")
120180
# #of_add_library_from_directory(${lib_dir} OUT_LIBS_ADDED)
121181
# #list(APPEND PARSED_ADDON_LIBS ${OUT_LIBS_ADDED} )
@@ -128,16 +188,23 @@ function(of_addon ADDON_NAME)
128188
of_make_filespaths_relative("${ADDON_ROOT}" "${PARSED_INCLUDES_ABS}" PARSED_INCLUDES )
129189

130190
of_make_filespaths_relative("${ADDON_ROOT}" "${PARSED_ADDON_SRC_FILES_ABS}" PARSED_ADDON_SRC_FILES )
191+
192+
# of_make_filespaths_relative("${ADDON_ROOT}" "${PARSED_ADDON_FRAMEWORKS_ABS}" PARSED_ADDON_FRAMEWORKS)
131193

132194
# message(VERBOSE "of_addon ${ADDON_NAME}: PARSED_INCLUDES: ${PARSED_INCLUDES}")
133195
# of_print_list(PARSED_INCLUDES PREFIX " • Include: " LEVEL VERBOSE)
134196

197+
# message(VERBOSE "of_addon ${ADDON_NAME}: PARSED_ADDON_FRAMEWORKS_ABS: ${PARSED_ADDON_FRAMEWORKS_ABS}")
198+
# of_print_list(PARSED_ADDON_FRAMEWORKS_ABS PREFIX " • PARSED_ADDON_FRAMEWORKS_ABS: " LEVEL VERBOSE)
199+
135200
# message(STATUS "--------------------------------------------")
136201
of_make_filespaths_relative("${ADDON_ROOT}" "${PARSED_ADDON_LIBS_ABS}" PARSED_ADDON_LIBS )
137202
# of_print_list(PARSED_ADDON_LIBS PREFIX " • Libs: " LEVEL VERBOSE)
138203

139204
# message(FATAL_ERROR "TRYING ADDONS")
140205

206+
# TODO: ADDON_DEFINES
207+
141208
set(ADDON_PKG_CONFIG_LIBRARIES "")
142209
set(ADDON_LIBS "${PARSED_ADDON_LIBS}")
143210
set(ADDON_INCLUDES "${PARSED_INCLUDES}")
@@ -167,6 +234,7 @@ function(of_addon ADDON_NAME)
167234
ADDON_LDFLAGS
168235
ADDON_FRAMEWORKS
169236
ADDON_INCLUDES
237+
ADDON_CFLAGS
170238
)
171239

172240
message(VERBOSE "of_addon ${ADDON_NAME}: PARSING: ${ADDON_ROOT}/addon_config.mk for '${TMP_OS_TAG}'")
@@ -179,6 +247,7 @@ function(of_addon ADDON_NAME)
179247
ADDON_LDFLAGS
180248
ADDON_FRAMEWORKS
181249
ADDON_INCLUDES
250+
ADDON_CFLAGS
182251
)
183252

184253
if(OF_OS_MACOS)
@@ -192,12 +261,15 @@ function(of_addon ADDON_NAME)
192261
ADDON_LDFLAGS
193262
ADDON_FRAMEWORKS
194263
ADDON_INCLUDES
264+
ADDON_CFLAGS
195265
)
196266
endif()
197267
endif()
198268

199269
# message(VERBOSE "--------------------------------------------")
200270
# of_print_list(ADDON_PKG_CONFIG_LIBRARIES PREFIX " • PKG_CONFIG_LIBRARIES: " LEVEL VERBOSE)
271+
# message(VERBOSE "--------------------------------------------")
272+
# of_print_list(ADDON_LDFLAGS PREFIX " • ADDON_LDFLAGS: " LEVEL VERBOSE)
201273
message(VERBOSE "--------------------------------------------")
202274
of_print_list(ADDON_SOURCES_EXCLUDE PREFIX " • ADDON_SOURCES_EXCLUDE: " LEVEL VERBOSE)
203275

@@ -261,6 +333,7 @@ function(of_addon ADDON_NAME)
261333
message(VERBOSE "--------------------------------------------")
262334
of_make_absolute("${ADDON_ROOT}" "${ADDON_INCLUDES}" ADDON_INCLUDES )
263335
of_make_absolute("${ADDON_ROOT}" "${ADDON_LIBS}" ADDON_LIBS )
336+
# of_make_absolute("${ADDON_ROOT}" "${ADDON_FRAMEWORKS}" ADDON_FRAMEWORKS)
264337

265338

266339
message(VERBOSE "--------------------------------------------")
@@ -287,21 +360,105 @@ function(of_addon ADDON_NAME)
287360
message(VERBOSE "--------------------------------------------")
288361
of_print_list(ADDON_LIBS PREFIX " 📚 ADDON_LIBS: " LEVEL VERBOSE)
289362

363+
# message(VERBOSE "--------------------------------------------")
364+
# of_print_list(ADDON_FRAMEWORKS PREFIX " 📚 ADDON_FRAMEWORKS: " LEVEL VERBOSE)
365+
290366
# message(VERBOSE "--------------------------------------------")
291367
# of_print_list(ADDON_LIBS PREFIX " • ADDON_INCLUDES: " LEVEL VERBOSE)
292368

369+
# message(VERBOSE "--------------------------------------------")
370+
# of_print_list(TMP_HEADER_AND_SOURCE_FILES PREFIX " • TMP_HEADER_AND_SOURCE_FILES: " LEVEL VERBOSE)
293371

372+
# we can't assume that all the source files and inclues are included in the addon directory
373+
# of_partition_paths_by_parent(${ADDON_ROOT} "${TMP_HEADER_AND_SOURCE_FILES}" TMP_IN_HEADER_AND_SOURCES TMP_OUT_HEADER_AND_SOURCES)
294374

295-
#working, but not great in ide
375+
# message(VERBOSE "--------------------------------------------")
376+
# of_print_list(TMP_IN_HEADER_AND_SOURCES PREFIX " • in - TMP_IN_HEADER_AND_SOURCES: " LEVEL VERBOSE)
377+
# message(VERBOSE "--------------------------------------------")
378+
# of_print_list(TMP_OUT_HEADER_AND_SOURCES PREFIX " • out - TMP_OUT_HEADER_AND_SOURCES: " LEVEL VERBOSE)
379+
380+
# example LDFLAGS: ADDON_LDFLAGS = -F$(OF_ROOT)/addons/ofxSyphon/libs/Syphon/lib/osx/ -framework Syphon
381+
string(REPLACE "$(OF_ROOT)" "${OF_ROOT_DIRECTORY}" FIXED_ADDON_LDFLAGS "${ADDON_LDFLAGS}")
382+
if(ADDON_LDFLAGS)
383+
message(VERBOSE "--------------------------------------------")
384+
of_print_list(FIXED_ADDON_LDFLAGS PREFIX " • ADDON_LDFLAGS: " LEVEL VERBOSE)
385+
# target_link_libraries(${OF_PROJECT_NAME} PRIVATE "${FIXED_ADDON_LDFLAGS}")
386+
foreach(flag IN LISTS FIXED_ADDON_LDFLAGS)
387+
target_link_options(${OF_PROJECT_NAME} PRIVATE ${flag})
388+
endforeach()
389+
endif()
390+
391+
# example CFLAGS: ADDON_CFLAGS = -F$(OF_ROOT)/addons/ofxSyphon/libs/Syphon/lib/osx/
392+
string(REPLACE "$(OF_ROOT)" "${OF_ROOT_DIRECTORY}" FIXED_ADDON_CFLAGS "${ADDON_CFLAGS}")
393+
if(ADDON_CFLAGS)
394+
message(VERBOSE "--------------------------------------------")
395+
of_print_list(FIXED_ADDON_CFLAGS PREFIX " • ADDON_CFLAGS: " LEVEL VERBOSE)
396+
# target_link_options(${OF_PROJECT_NAME} PRIVATE "${FIXED_ADDON_CFLAGS}")
397+
foreach(flag IN LISTS FIXED_ADDON_CFLAGS)
398+
target_compile_options(${OF_PROJECT_NAME} PRIVATE ${flag})
399+
endforeach()
400+
endif()
401+
402+
of_extract_F_dirs_from_flag_lines(F_DIRS
403+
"${FIXED_ADDON_CFLAGS}"
404+
"${FIXED_ADDON_LDFLAGS}"
405+
)
406+
# message(STATUS "Framework search dirs: ${F_DIRS}")
407+
# 2) Find *.framework bundles beneath those -F dirs
408+
of_collect_framework_bundles_from_F_dirs(F_FRAMEWORKS "${F_DIRS}")
409+
of_make_absolute("${ADDON_ROOT}" "${F_FRAMEWORKS}" F_FRAMEWORKS )
410+
# message(STATUS "Found frameworks: ${F_FRAMEWORKS}")
411+
list(APPEND ADDON_FRAMEWORKS ${F_FRAMEWORKS})
412+
413+
if(APPLE)
414+
if( ADDON_FRAMEWORKS )
415+
# set(APP_FRAMEWORKS_DIR "$<TARGET_FILE_DIR:${TARGET}>/../Frameworks")
416+
# set(OF_PROJECT_APP_BUNDLE_FRAMEWORKS_DIR "$<TARGET_BUNDLE_CONTENT_DIR:${OF_PROJECT_NAME}>/Frameworks")
417+
foreach(fw IN LISTS ADDON_FRAMEWORKS)
418+
of_embed_framework(${OF_PROJECT_NAME} "${fw}")
419+
# get_filename_component(fw_name "${fw}" NAME_WE) # e.g. Syphon
420+
# # # get_filename_component(fw_parent "${fw}" DIRECTORY) # .../lib/osx
421+
# message(STATUS "POST BUILD FRAMEWORK: ${fw_name}")
422+
# add_custom_command(TARGET ${OF_PROJECT_NAME} POST_BUILD
423+
# COMMAND ${CMAKE_COMMAND} -E make_directory "${OF_PROJECT_APP_BUNDLE_FRAMEWORKS_DIR}"
424+
# COMMAND ${CMAKE_COMMAND} -E copy_directory
425+
# "${fw}"
426+
# "${OF_PROJECT_APP_BUNDLE_FRAMEWORKS_DIR}/${fw_name}.framework"
427+
# COMMENT "Embedding ${fw_name}.framework")
428+
endforeach()
429+
endif()
430+
endif()
431+
432+
# list(APPEND OF_PROJECT_FRAMEWORKS_TO_BUNDLE ${ADDON_FRAMEWORKS})
433+
434+
message(VERBOSE "--------------------------------------------")
435+
of_print_list(ADDON_FRAMEWORKS PREFIX " 📚 ADDON_FRAMEWORKS: " LEVEL VERBOSE)
436+
437+
438+
# working, but not great in ide since it's under the project folder and not one level above
296439
target_include_directories(${OF_PROJECT_NAME} PRIVATE ${ADDON_INCLUDES})
297440
target_link_libraries(${OF_PROJECT_NAME} PRIVATE ${ADDON_LIBS} )
298441
#---- IDE ---------------------
299442
target_sources(${OF_PROJECT_NAME} PRIVATE ${TMP_HEADER_AND_SOURCE_FILES})
300443
source_group(
301-
TREE "${ADDON_ROOT}"
302-
PREFIX "addons/${ADDON_NAME}"
444+
TREE "${OF_ROOT_DIRECTORY}/addons"
445+
PREFIX "addons"
303446
FILES ${TMP_HEADER_AND_SOURCE_FILES}
304447
)
448+
449+
# source_group(
450+
# TREE "${ADDON_ROOT}"
451+
# PREFIX "addons/${ADDON_NAME}"
452+
# FILES ${TMP_IN_HEADER_AND_SOURCES}
453+
# )
454+
455+
# target_sources(${OF_PROJECT_NAME} PRIVATE ${TMP_OUT_HEADER_AND_SOURCES})
456+
# source_group(
457+
# TREE "${OF_ROOT_DIRECTORY}/addons"
458+
# #PREFIX "addons/${ADDON_NAME}"
459+
# PREFIX "addons"
460+
# FILES ${TMP_OUT_HEADER_AND_SOURCES}
461+
# )
305462
#---- !IDE! ---------------------
306463

307464

cmake/ofConfig.cmake

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,15 @@ macro(of_set_global_os_vars)
134134
set(OF_OS_MACOS ON)
135135
endif()
136136
endif()
137+
138+
if(APPLE)
139+
if(NOT DEFINED OF_IS_XCODE)
140+
set(OF_IS_XCODE OFF)
141+
if(CMAKE_GENERATOR STREQUAL "Xcode")
142+
set(OF_IS_XCODE ON)
143+
endif()
144+
endif()
145+
endif()
137146
endmacro()
138147

139148
# check if OS has been set

cmake/ofConfigMacOS.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# make sure to set OF_FRAMEWORKS
33
set(OF_CORE_FRAMEWORKS
44
"-framework Accelerate"
5-
"-framework AGL"
5+
# "-framework AGL"
66
"-framework AppKit"
77
"-framework ApplicationServices"
88
"-framework AudioToolbox"

0 commit comments

Comments
 (0)