11include ("${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 #######################
452function (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
0 commit comments