Skip to content

Commit 57c240d

Browse files
committed
Cmake Example
1 parent d97edd9 commit 57c240d

File tree

9 files changed

+1185
-0
lines changed

9 files changed

+1185
-0
lines changed
Lines changed: 388 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,388 @@
1+
# cmake_minimum_required(VERSION 3.16...4.0)
2+
3+
# References
4+
# https://cliutils.gitlab.io/modern-cmake/chapters/basics.html
5+
# https://github.com/HerrNamenlos123/openFrameworks/blob/master/cmake/utils.cmake
6+
7+
cmake_minimum_required(VERSION 3.16...4.0)
8+
9+
# cmake -S . -B build -G Xcode --log-level=VERBOSE
10+
# cmake --build build --parallel
11+
12+
# set the project name
13+
14+
set(OF_PROJECT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
15+
# get_filename_component(OF_PROJECT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" DIRECTORY )
16+
get_filename_component(OF_PROJECT_NAME "${CMAKE_CURRENT_SOURCE_DIR}" NAME_WE)
17+
18+
project(${OF_PROJECT_NAME})
19+
20+
# TODO: Ability to set the project name or directory independently of cmake
21+
22+
message(STATUS "OF PROJECT NAME: ${OF_PROJECT_NAME} PROJECT DIR: ${OF_PROJECT_DIRECTORY}")
23+
message(STATUS "${OF_PROJECT_NAME} Using ${CMAKE_GENERATOR}")
24+
message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
25+
26+
message("Debug: ${CMAKE_CXX_FLAGS_DEBUG}")
27+
message("Release: ${CMAKE_CXX_FLAGS_RELEASE}")
28+
message("RelWithDebInfo: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
29+
message("MinSizeRel: ${CMAKE_CXX_FLAGS_MINSIZEREL}")
30+
31+
### Require out-of-source builds
32+
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
33+
if(EXISTS "${LOC_PATH}")
34+
message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory.")
35+
endif()
36+
37+
38+
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
39+
message(FATAL_ERROR "In-source builds are a really bad idea. If you don't know what you're doing, please create a 'build' folder and call 'cmake ..' from within.")
40+
endif()
41+
42+
43+
# Only do these if this is the main project, and not if it is included through add_subdirectory
44+
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
45+
message(STATUS "SETTING SOME GLOBAL PARAMS")
46+
47+
# Optionally set things like CMAKE_CXX_STANDARD, CMAKE_POSITION_INDEPENDENT_CODE here
48+
# specify the C++ standard
49+
set(CMAKE_CXX_STANDARD 20)
50+
set(CMAKE_CXX_STANDARD_REQUIRED True)
51+
52+
# Let's ensure -std=c++xx instead of -std=g++xx
53+
set(CMAKE_CXX_EXTENSIONS OFF)
54+
55+
# Let's nicely support folders in IDEs
56+
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
57+
58+
endif()
59+
60+
61+
62+
63+
64+
65+
66+
if( NOT DEFINED OF_ROOT_DIRECTORY )
67+
# set( OF_ROOT_DIRECTORY "${PROJECT_SOURCE_DIR}/../../.." )
68+
get_filename_component(OF_ROOT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../.." REALPATH BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
69+
message(STATUS "OF_ROOT_DIRECTORY not set, setting to ${OF_ROOT_DIRECTORY}")
70+
endif()
71+
72+
message( STATUS "OF_ROOT_DIRECTORY: ${OF_ROOT_DIRECTORY} ")
73+
message( STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR} ")
74+
75+
include("${OF_ROOT_DIRECTORY}/cmake/ofConfig.cmake") # defines OF_CMAKE_DIRECTORY
76+
include("${OF_CMAKE_DIRECTORY}/ofUtils.cmake")
77+
include("${OF_CMAKE_DIRECTORY}/ofAddons.cmake")
78+
79+
80+
# OF_CMAKE_BUILD_DIRECTORY is set in ofConfig.cmake
81+
# add_subdirectory("${OF_ROOT_DIRECTORY}/libs/openFrameworksCompiled/project" "${OF_CMAKE_BUILD_DIRECTORY}" )
82+
add_subdirectory("${OF_ROOT_DIRECTORY}" "${OF_CMAKE_BUILD_DIRECTORY}" )
83+
84+
#OUT_OS OUT_ARCH OUT_TAG OUT_IS_CROSS
85+
# of_detect_target(OF_OS OF_ARCH OF_OS_TAG OF_IS_CROSS_COMPILE)
86+
of_set_global_os_vars()
87+
# string(TOLOWER ${OF_OS_TAG} OF_OS_TAG_LOWER )
88+
message(VERBOSE "OF OF_OS NAME: ${OF_OS}")
89+
message(VERBOSE "OF_ARCH: ${OF_ARCH}")
90+
message(VERBOSE "OF_OS_TAG: ${OF_OS_TAG}")
91+
message(VERBOSE "OF_IS_CROSS_COMPILE: ${OF_IS_CROSS_COMPILE}")
92+
93+
94+
95+
# if(CMAKE_SYSTEM_NAME STREQUAL "iOS")
96+
# message(STATUS "Building for iOS")
97+
# elseif(CMAKE_SYSTEM_NAME STREQUAL "tvOS")
98+
# message(STATUS "Building for tvOS")
99+
# elseif(CMAKE_SYSTEM_NAME STREQUAL "watchOS")
100+
# message(STATUS "Building for watchOS")
101+
# elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
102+
# message(STATUS "Building for macOS")
103+
# endif()
104+
105+
106+
107+
# now lets add some options
108+
# OF_BUNDLE_DATA_FOLDER
109+
###############################################################################
110+
### OPTIONS ###################################################################
111+
if(APPLE)
112+
option(
113+
OF_BUNDLE_DATA_FOLDER
114+
"Should the data folder be bundled inside the application."
115+
OFF
116+
)
117+
endif()
118+
###############################################################################
119+
120+
121+
122+
set(OF_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
123+
file(GLOB_RECURSE OF_PROJECT_HEADER_FILES CONFIGURE_DEPENDS
124+
"${OF_PROJECT_SOURCE_DIR}/*.h"
125+
"${OF_PROJECT_SOURCE_DIR}/*.hpp"
126+
"${OF_PROJECT_SOURCE_DIR}/*.inl"
127+
)
128+
129+
130+
file(GLOB_RECURSE OF_PROJECT_SOURCE_FILES "${OF_PROJECT_SOURCE_DIR}/*.cpp")
131+
# add in some objective-c files
132+
if( APPLE )
133+
file(GLOB_RECURSE OF_PROJECT_SOURCE_MM_FILES "${OF_PROJECT_SOURCE_DIR}/*.mm" "${OF_PROJECT_SOURCE_DIR}/*.m")
134+
foreach(entry ${OF_PROJECT_SOURCE_MM_FILES})
135+
list(APPEND OF_PROJECT_SOURCE_FILES "${entry}")
136+
endforeach()
137+
endif()
138+
139+
set( OF_PROJECT_HEADER_AND_SOURCE_FILES ${OF_PROJECT_SOURCE_FILES} ${OF_PROJECT_HEADER_FILES} )
140+
141+
# make_filespaths_relative("${CMAKE_SOURCE_DIR}" "${OF_SOURCE_FILES_ABS}" OF_SOURCE_FILES)
142+
# foreach(src_file ${OF_SOURCE_FILES_ABS})
143+
# message(STATUS "Found source fileXXXX: ${src_file}")
144+
# endforeach()
145+
# set(OF_PROJECT_SOURCE_FILES ${OF_PROJECT_SOURCE_FILES_ABS} )
146+
147+
of_get_all_subdirectories("${OF_PROJECT_SOURCE_DIR}" OF_PROJECT_INCLUDE_DIRECTORIES)
148+
list(APPEND OF_PROJECT_INCLUDE_DIRECTORIES "${OF_PROJECT_SOURCE_DIR}" )
149+
150+
# file(GLOB_RECURSE OF_PROJECT_HEADERS_FILES_ABS "${OF_PROJECT_SOURCE_DIR}/*.h" "${OF_PROJECT_SOURCE_DIR}/*.hpp")
151+
152+
153+
if(APPLE)
154+
add_executable(${OF_PROJECT_NAME} MACOSX_BUNDLE "${OF_PROJECT_SOURCE_FILES}")
155+
else()
156+
add_executable(${OF_PROJECT_NAME} "${OF_PROJECT_SOURCE_FILES}")
157+
endif()
158+
159+
# target_include_directories(${OF_PROJECT_NAME} PUBLIC "src")
160+
target_include_directories(${OF_PROJECT_NAME} PUBLIC ${OF_PROJECT_INCLUDE_DIRECTORIES})
161+
# link
162+
target_link_libraries(${OF_PROJECT_NAME} PRIVATE openFrameworks)
163+
# target_include_directories(3DPrimitivesExample PUBLIC OF_HEADER_FILES)
164+
target_include_directories(${OF_PROJECT_NAME} INTERFACE ${OF_INCLUDE_DIRECTORIES})
165+
166+
167+
168+
169+
# does not work....
170+
# set(OF_PROJECT_APP_NAME "$<IF:$<CONFIG:Debug>,${OF_PROJECT_NAME}Debug,${OF_PROJECT_NAME}>")
171+
# Put the .app here:
172+
173+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
174+
OUTPUT_NAME_DEBUG "${OF_PROJECT_NAME}Debug"
175+
OUTPUT_NAME_RELEASE "${OF_PROJECT_NAME}"
176+
OUTPUT_NAME_RELWITHDEBINFO "${OF_PROJECT_NAME}RelWithDebInfo"
177+
OUTPUT_NAME_MINSIZEREL "${OF_PROJECT_NAME}MinSizeRel"
178+
)
179+
180+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
181+
# RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin"
182+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin"
183+
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/bin"
184+
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/bin"
185+
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_SOURCE_DIR}/bin"
186+
RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_SOURCE_DIR}/bin"
187+
188+
# OUTPUT_NAME "$<IF:$<CONFIG:Debug>,${OF_PROJECT_NAME}Debug,${OF_PROJECT_NAME}>" # name per config
189+
)
190+
191+
# TODO: Copy any shared libs into the proper place
192+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
193+
# INSTALL_RPATH "$ORIGIN"
194+
# )
195+
196+
if( APPLE )
197+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
198+
# XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bin"
199+
# )
200+
201+
#Suppress ZERO_CHECK (auto-regeneration) target:
202+
set(CMAKE_SUPPRESS_REGENERATION ON)
203+
204+
set(OF_APP_ICON_PATH "${OF_ROOT_DIRECTORY}/libs/openFrameworksCompiled/project/${OF_LIB_DIR_NAME}/")
205+
set(APP_ICON_RELEASE "icon.icns")
206+
set(APP_ICON_DEBUG "icon-debug.icns")
207+
# set(OF_APP_ICON_NAME "icon$<IF:$<CONFIG:Debug>,-debug,>.icns")
208+
209+
set_source_files_properties("${OF_APP_ICON_PATH}${APP_ICON_RELEASE}" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
210+
set_source_files_properties("${OF_APP_ICON_PATH}${APP_ICON_DEBUG}" PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
211+
target_sources(${OF_PROJECT_NAME} PRIVATE "${OF_APP_ICON_PATH}${APP_ICON_RELEASE}" "${OF_APP_ICON_PATH}${APP_ICON_DEBUG}")
212+
213+
# set(OF_APP_ICON_PATH "${OF_ROOT_DIRECTORY}/libs/openFrameworksCompiled/project/${OF_LIB_DIR_NAME}/${OF_APP_ICON_NAME}")
214+
215+
# Put the file into MyApp.app/Contents/Resources
216+
# set_source_files_properties(${OF_APP_ICON_PATH} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
217+
218+
# Add it as a source of the bundle target
219+
# target_sources(${OF_PROJECT_NAME} PRIVATE ${OF_APP_ICON_PATH})
220+
221+
# Tell macOS which icon to use (CFBundleIconFile)
222+
# (Just the filename, not the path)
223+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE "icon.icns")
224+
225+
# TODO: Check to see if there is an info.plist file existing
226+
# TODO: Generate a plist if it is not present
227+
# this can be done in the ofConfigMacOS.cmake
228+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
229+
MACOSX_BUNDLE_GUI_IDENTIFIER com.openFrameworks.${OF_PROJECT_NAME}
230+
MACOSX_BUNDLE_BUNDLE_NAME "${OF_PROJECT_NAME}"
231+
MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0"
232+
MACOSX_BUNDLE_BUNDLE_VERSION "1.0"
233+
#MACOSX_BUNDLE_ICON_NAME "$<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>"
234+
# MACOSX_BUNDLE_ICON_NAME "$<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>"
235+
MACOSX_BUNDLE_INFO_PLIST "${OF_PROJECT_DIRECTORY}/openFrameworks-Info.plist"
236+
# XCODE_ATTRIBUTE_ICON_NAME "$<IF:$<CONFIG:Debug>,of-debug.icns,icon.icns>"
237+
# XCODE_ATTRIBUTE_GENERATE_INFOPLIST_FILE NO
238+
)
239+
240+
# set(CMAKE_XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "${CMAKE_BINARY_DIR}/build/$<CONFIG>")
241+
# set(CMAKE_XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bin")
242+
243+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
244+
# XCODE_ATTRIBUTE_INFOPLIST_KEY_CFBundleIconFile
245+
# "$<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>"
246+
# )
247+
248+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
249+
# MACOSX_BUNDLE_ICON_FILE "$<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>"
250+
# )
251+
252+
# message(VERBOSE "OF_CMAKE_MULTI_BUILD_CONFIG: ${OF_CMAKE_MULTI_BUILD_CONFIG}")
253+
254+
if(OF_CMAKE_MULTI_BUILD_CONFIG)
255+
message(VERBOSE "HAS MULTI OF_CMAKE_MULTI_BUILD_CONFIG: ${OF_CMAKE_MULTI_BUILD_CONFIG}")
256+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
257+
# MACOSX_BUNDLE_ICON_FILE $<$<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>>
258+
# )
259+
# per-config icon for Xcode
260+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
261+
MACOSX_BUNDLE_ICON_FILE "icon.icns"
262+
)
263+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
264+
XCODE_ATTRIBUTE_INFOPLIST_KEY_CFBundleIconFile "icon.icns"
265+
)
266+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
267+
# XCODE_ATTRIBUTE_INFOPLIST_KEY_CFBundleIconFile
268+
# $<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>
269+
# )
270+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
271+
# MACOSX_BUNDLE_ICON_FILE
272+
# $<IF:$<CONFIG:Debug>,icon-debug.icns,icon.icns>
273+
# )
274+
else()
275+
# set_target_properties(${OF_PROJECT_NAME} PROPERTIES
276+
# MACOSX_BUNDLE_INFO_PLIST "${OF_PROJECT_DIRECTORY}/openFrameworks-Info.plist"
277+
# )
278+
279+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
280+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
281+
MACOSX_BUNDLE_ICON_FILE "icon-debug.icns"
282+
)
283+
else()
284+
set_target_properties(${OF_PROJECT_NAME} PROPERTIES
285+
MACOSX_BUNDLE_ICON_FILE "icon.icns"
286+
)
287+
endif()
288+
endif()
289+
290+
# Strings substituted into the template
291+
# set(CAMERA_USAGE_DESC "This app uses the camera for live video input.")
292+
# set(MIC_USAGE_DESC "This app uses the microphone for audio capture.")
293+
# set( OF_HIGH_RESOLUTION_CAPABLE ON)
294+
# TODO: Copy over the icon.icns
295+
# set(ICON_NAME "${OF_ROOT_DIRECTORY}/libs/openFrameworksCompiled/project/${OF_LIB_DIR_NAME}/icon.icns")
296+
# set(ICON_NAME "icon.icns")
297+
# Path to your .icns
298+
299+
# get_target_property(_icon ${OF_PROJECT_NAME} MACOSX_BUNDLE_ICON_FILE)
300+
# message(STATUS "Icon file = ${_icon}") # should show icon-debug.icns or icon.icns
301+
302+
endif()
303+
304+
305+
306+
#---- IDE ---------------------
307+
target_sources(${OF_PROJECT_NAME} PRIVATE ${OF_PROJECT_HEADER_AND_SOURCE_FILES})
308+
source_group(TREE "${OF_PROJECT_DIRECTORY}" FILES ${OF_PROJECT_HEADER_AND_SOURCE_FILES})
309+
#---- !IDE! ---------------------
310+
311+
312+
313+
314+
## ADDONS ##############
315+
set(OF_ADDONS "OF_ADDONS")
316+
message(VERBOSE "Project - checking for addons.make file.")
317+
if(EXISTS "${OF_PROJECT_DIRECTORY}/addons.make")
318+
file(STRINGS "${OF_PROJECT_DIRECTORY}/addons.make" TMP_ADDON_NAMES)
319+
foreach(TMP_ADDON_TO_INCLUDE IN LISTS TMP_ADDON_NAMES)
320+
message(STATUS "ADDING addon ${TMP_ADDON_TO_INCLUDE}")
321+
of_addon("${TMP_ADDON_TO_INCLUDE}")
322+
endforeach()
323+
endif()
324+
# add_library(${OF_ADDONS} INTERFACE)
325+
# of_addon("ofxOpenCv")
326+
# of_addon("ofxAssimp")
327+
# target_link_libraries(${OF_PROJECT_NAME} ${OF_ADDONS})
328+
329+
330+
331+
332+
# Works on CMake 3.16+: applies to the current directory (and below)
333+
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_CLEAN_FILES
334+
"$<TARGET_BUNDLE_DIR:${OF_PROJECT_NAME}>"
335+
)
336+
337+
add_custom_command(TARGET ${OF_PROJECT_NAME} POST_BUILD
338+
COMMAND ${CMAKE_COMMAND} -E echo
339+
"POST_BUILD: ${OF_PROJECT_NAME} has been built successfully."
340+
)
341+
342+
343+
if(APPLE)
344+
if(OF_BUNDLE_DATA_FOLDER)
345+
# rsync -avz --delete --exclude='.DS_Store' "${SRCROOT}/bin/data/" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/data/"
346+
add_custom_command(TARGET ${OF_PROJECT_NAME} POST_BUILD
347+
COMMAND ${CMAKE_COMMAND} -E echo
348+
"--------------------------------------------------"
349+
COMMAND ${CMAKE_COMMAND} -E echo
350+
"Bundling resources to $<TARGET_BUNDLE_CONTENT_DIR:${OF_PROJECT_NAME}>/Resources"
351+
COMMAND ${CMAKE_COMMAND} -E make_directory
352+
"$<TARGET_BUNDLE_CONTENT_DIR:${OF_PROJECT_NAME}>/Resources/data"
353+
COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different
354+
"${OF_PROJECT_DIRECTORY}/bin/data/"
355+
"$<TARGET_BUNDLE_CONTENT_DIR:${OF_PROJECT_NAME}>/Resources/data"
356+
COMMAND ${CMAKE_COMMAND} -E echo
357+
"--------------------------------------------------"
358+
)
359+
endif()
360+
endif()
361+
# add_library(openFrameworks STATIC)
362+
# target_include_directories(openFrameworks PUBLIC "${PROJECT_SOURCE_DIR}/libs/openFrameworks/include")
363+
364+
365+
# find packages
366+
# target_compile_options(MyTarget PRIVATE "$<$<CONFIG:Debug>:--my-flag>")
367+
368+
369+
# # or use MATCHES to see if actual system name
370+
# # Darwin is Apple's system name
371+
# if(${CMAKE_SYSTEM_NAME} MATCHES Darwin)
372+
# message("This is a ${CMAKE_SYSTEM_NAME} system")
373+
# elseif(${CMAKE_SYSTEM_NAME} MATCHES Windows)
374+
# message("This is a Windows System")
375+
# endif()
376+
377+
# # cmake -DCMAKE_BUILD_TYPE=Debug -H. -Bbuild/Debug
378+
# if(${CMAKE_BUILD_TYPE} MATCHES Debug)
379+
# message("Debug Build")
380+
# elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
381+
# message("Release Build")
382+
# endif()
383+
384+
385+
386+
387+
388+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ofxOpenCv
2+
ofxAssimp
3+
ofxGui
4+
ofxKinect
5+
ofxNetwork
6+
ofxOsc
7+
ofxPoco

apps/devApps/CMakeExample/bin/data/.gitkeep

Whitespace-only changes.
28.6 KB
Loading
49.5 KB
Loading

0 commit comments

Comments
 (0)