Skip to content

Commit 367e160

Browse files
committed
reinstate cmake Public module to allow cross compilation
1 parent 5133fcf commit 367e160

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ if (MATERIALX_BUILD_IOS)
7272
set(CMAKE_SYSTEM_NAME iOS)
7373
endif()
7474

75+
list(APPEND CMAKE_MODULE_PATH
76+
${PROJECT_SOURCE_DIR}/cmake/macros)
77+
include(Public)
78+
7579
# Apple ecosystem cross-compilation
7680
# https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-ios-tvos-visionos-or-watchos
7781
set(MATERIALX_BUILD_APPLE_EMBEDDED OFF)

cmake/macros/Public.cmake

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
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

Comments
 (0)