|
| 1 | +# Shared functions need to be extracted to allow them to be shared with the subproject |
| 2 | +# in source/MaterialXBuildTools |
| 3 | + |
| 4 | +function(assign_source_group prefix) |
| 5 | + foreach(_source IN ITEMS ${ARGN}) |
| 6 | + if(IS_ABSOLUTE "${_source}") |
| 7 | + file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}") |
| 8 | + else() |
| 9 | + set(_source_rel "${_source}") |
| 10 | + endif() |
| 11 | + get_filename_component(_source_path "${_source_rel}" PATH) |
| 12 | + string(REPLACE "/" "\\" _source_path_msvc "${_source_path}") |
| 13 | + source_group("${prefix}\\${_source_path_msvc}" FILES "${_source}") |
| 14 | + endforeach() |
| 15 | +endfunction(assign_source_group) |
| 16 | + |
| 17 | +function(mx_add_library MATERIALX_MODULE_NAME) |
| 18 | + set(options ADD_OBJECTIVE_C_CODE) |
| 19 | + set(oneValueArgs EXPORT_DEFINE) |
| 20 | + set(multiValueArgs |
| 21 | + SOURCE_FILES |
| 22 | + HEADER_FILES |
| 23 | + INLINED_FILES |
| 24 | + MTLX_MODULES) |
| 25 | + cmake_parse_arguments(args |
| 26 | + "${options}" |
| 27 | + "${oneValueArgs}" |
| 28 | + "${multiValueArgs}" |
| 29 | + ${ARGN}) |
| 30 | + |
| 31 | + if (APPLE AND args_ADD_OBJECTIVE_C_CODE) |
| 32 | + file(GLOB_RECURSE materialx_source_oc "${CMAKE_CURRENT_SOURCE_DIR}/*.m*") |
| 33 | + set_source_files_properties(${materialx_source_oc} PROPERTIES |
| 34 | + COMPILE_FLAGS "-x objective-c++") |
| 35 | + set(args_SOURCE_FILES ${args_SOURCE_FILES} ${materialx_source_oc}) |
| 36 | + endif() |
| 37 | + |
| 38 | + assign_source_group("Source Files" ${args_SOURCE_FILES}) |
| 39 | + assign_source_group("Source Files" ${args_INLINED_FILES}) |
| 40 | + assign_source_group("Header Files" ${args_HEADER_FILES}) |
| 41 | + |
| 42 | + if (NOT MATERIALX_BUILD_MONOLITHIC) |
| 43 | + set(TARGET_NAME ${MATERIALX_MODULE_NAME}) |
| 44 | + add_library(${TARGET_NAME}) |
| 45 | + |
| 46 | + # Create version resource |
| 47 | + if(MATERIALX_BUILD_SHARED_LIBS AND MSVC) |
| 48 | + configure_file(${PROJECT_SOURCE_DIR}/cmake/modules/MaterialXVersion.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc) |
| 49 | + target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/version.rc) |
| 50 | + endif() |
| 51 | + |
| 52 | + target_link_libraries(${TARGET_NAME} |
| 53 | + PUBLIC |
| 54 | + ${args_MTLX_MODULES} |
| 55 | + ${CMAKE_DL_LIBS}) |
| 56 | + |
| 57 | + target_include_directories(${TARGET_NAME} |
| 58 | + PUBLIC |
| 59 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../> |
| 60 | + $<INSTALL_INTERFACE:${MATERIALX_INSTALL_INCLUDE_PATH}> |
| 61 | + PRIVATE |
| 62 | + ${EXTERNAL_INCLUDE_DIRS}) |
| 63 | + |
| 64 | + set_target_properties( |
| 65 | + ${TARGET_NAME} PROPERTIES |
| 66 | + OUTPUT_NAME ${MATERIALX_MODULE_NAME}${MATERIALX_LIBNAME_SUFFIX} |
| 67 | + COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS}" |
| 68 | + LINK_FLAGS "${EXTERNAL_LINK_FLAGS}" |
| 69 | + INSTALL_RPATH "${MATERIALX_SAME_DIR_RPATH}" |
| 70 | + VERSION "${MATERIALX_LIBRARY_VERSION}" |
| 71 | + SOVERSION "${MATERIALX_MAJOR_VERSION}") |
| 72 | + else() |
| 73 | + set(TARGET_NAME ${MATERIALX_MONOLITHIC_TARGET}) |
| 74 | + add_library(${MATERIALX_MODULE_NAME} ALIAS ${MATERIALX_MONOLITHIC_TARGET}) |
| 75 | + |
| 76 | + # Store the aliased MaterialX modules name to create CMake export aliases later. |
| 77 | + set_property(GLOBAL APPEND PROPERTY MATERIALX_MODULES ${MATERIALX_MODULE_NAME}) |
| 78 | + endif() |
| 79 | + |
| 80 | + set_target_properties(${TARGET_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden) |
| 81 | + set_target_properties(${TARGET_NAME} PROPERTIES CMAKE_VISIBILITY_INLINES_HIDDEN 1) |
| 82 | + |
| 83 | + target_sources(${TARGET_NAME} |
| 84 | + PRIVATE |
| 85 | + ${args_SOURCE_FILES} |
| 86 | + PUBLIC |
| 87 | + FILE_SET |
| 88 | + mxHeaders |
| 89 | + TYPE |
| 90 | + HEADERS |
| 91 | + BASE_DIRS |
| 92 | + ${CMAKE_CURRENT_SOURCE_DIR}/.. |
| 93 | + ${CMAKE_CURRENT_BINARY_DIR}/.. |
| 94 | + FILES |
| 95 | + ${args_HEADER_FILES} |
| 96 | + ${args_INLINED_FILES}) |
| 97 | + |
| 98 | + target_include_directories(${TARGET_NAME} PUBLIC |
| 99 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>) |
| 100 | + |
| 101 | + target_compile_definitions(${TARGET_NAME} PRIVATE "-D${args_EXPORT_DEFINE}") |
| 102 | + |
| 103 | + if(NOT SKBUILD) |
| 104 | + if(NOT MATERIALX_BUILD_MONOLITHIC) |
| 105 | + install(TARGETS ${MATERIALX_MODULE_NAME} |
| 106 | + EXPORT MaterialX |
| 107 | + ARCHIVE DESTINATION ${MATERIALX_INSTALL_LIB_PATH} |
| 108 | + LIBRARY DESTINATION ${MATERIALX_INSTALL_LIB_PATH} |
| 109 | + RUNTIME DESTINATION ${MATERIALX_INSTALL_BIN_PATH} |
| 110 | + FILE_SET mxHeaders DESTINATION ${MATERIALX_INSTALL_INCLUDE_PATH}) |
| 111 | + endif() |
| 112 | + |
| 113 | + if(MSVC) |
| 114 | + if(MATERIALX_BUILD_SHARED_LIBS) |
| 115 | + install(FILES $<TARGET_PDB_FILE:${MATERIALX_MODULE_NAME}> |
| 116 | + DESTINATION ${MATERIALX_INSTALL_BIN_PATH} OPTIONAL) |
| 117 | + else() |
| 118 | + install(FILES "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/$<CONFIG>/$<TARGET_FILE_BASE_NAME:${MATERIALX_MODULE_NAME}>.pdb" |
| 119 | + DESTINATION ${MATERIALX_INSTALL_LIB_PATH} OPTIONAL) |
| 120 | + endif() |
| 121 | + endif() |
| 122 | + endif() |
| 123 | + |
| 124 | + # Pass TARGET_NAME back to call site, so the caller can modify the build target. |
| 125 | + set(TARGET_NAME ${TARGET_NAME} PARENT_SCOPE) |
| 126 | +endfunction() |
| 127 | + |
0 commit comments