Skip to content

Commit e9efe52

Browse files
committed
CMake: Refactor DDR support
Introduced a number of changes - Headers can now be directly associated with a ddr set - A DDR set no longer needs to be specified when enabling DDR for a target. - Added a new command `ddr_set_add_targets` which adds a target to a DDR set. Combined with the above, this allows for a delayed definition of a DDR set. In addition targets can be in multiple DDR sets. - DDR sets can now be composed via `ddr_set_add_targets`. This means we can get rid of the awkward `OMR_DDR_SET` mechanics. Instead we just define our own DDR set, and consumers simply add our DDR set to theirs - omr_ prefix removed from ddr related target names. - Added GLOB_HEADERS and GLOB_HEADERS_RECURSIVE options to target_enable_ddr, which glob the target source directory for headers Signed-off-by: Devin Nakamura <[email protected]>
1 parent a143843 commit e9efe52

18 files changed

+177
-73
lines changed

CMakeLists.txt

+1-5
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ configure_file(./omrversionstrings.CMakeTemplate.h omrversionstrings.h)
114114
###
115115
include(OmrDDRSupport)
116116

117-
if(NOT DEFINED OMR_DDR_SET)
118-
set(OMR_DDR_SET "omr")
119-
make_ddr_set(${OMR_DDR_SET})
120-
endif()
121-
117+
make_ddr_set(omrddr)
122118

123119
###
124120
### Native Tooling

cmake/modules/OmrDDRSupport.cmake

+69-14
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,17 @@ include(OmrUtility)
2929
include(ExternalProject)
3030

3131
set(OMR_MODULES_DIR ${CMAKE_CURRENT_LIST_DIR})
32+
set(DDR_INFO_DIR "${CMAKE_BINARY_DIR}/ddr_info")
33+
3234

3335
function(make_ddr_set set_name)
3436
# if DDR is not enabled, just skip
3537
# Also skip if we are on windows since it is unsupported at the moment
3638
if((OMR_HOST_OS STREQUAL "win") OR (NOT OMR_DDR))
3739
return()
3840
endif()
39-
set(DDR_TARGET_NAME "${set_name}_ddr")
41+
set(DDR_TARGET_NAME "${set_name}")
4042
set(DDR_BIN_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DDR_TARGET_NAME}")
41-
set(DDR_TARGETS_LIST "${DDR_BIN_DIR}/targets.list")
4243
set(DDR_MACRO_INPUTS_FILE "${DDR_BIN_DIR}/macros.list")
4344
set(DDR_TOOLS_EXPORT "${omr_BINARY_DIR}/ddr/tools/DDRTools.cmake")
4445
set(DDR_CONFIG_STAMP "${DDR_BIN_DIR}/config.stamp")
@@ -54,35 +55,67 @@ function(make_ddr_set set_name)
5455
COMMAND ${CMAKE_COMMAND} --build "${DDR_BIN_DIR}"
5556
)
5657
set_property(TARGET "${DDR_TARGET_NAME}" PROPERTY DDR_BIN_DIR "${DDR_BIN_DIR}")
58+
set_property(TARGET "${DDR_TARGET_NAME}" PROPERTY DDR_SET TRUE)
5759

5860
file(READ ${OMR_MODULES_DIR}/ddr/DDRSetStub.cmake.in cmakelist_template)
5961
string(CONFIGURE "${cmakelist_template}" cmakelist_template @ONLY)
6062
file(GENERATE OUTPUT ${DDR_BIN_DIR}/CMakeLists.txt CONTENT "${cmakelist_template}")
63+
64+
# Note: DDR sets have themselves as targets to process
65+
# This is so that you can process misc headers which don't logically belong to any other target
66+
target_enable_ddr(${DDR_TARGET_NAME})
67+
set_property(TARGET "${DDR_TARGET_NAME}" APPEND PROPERTY DDR_TARGETS "${DDR_TARGET_NAME}")
6168
endfunction(make_ddr_set)
6269

70+
function(ddr_set_add_targets ddr_set)
71+
if((OMR_HOST_OS STREQUAL "win") OR (NOT OMR_DDR))
72+
return()
73+
endif()
6374

64-
function(target_enable_ddr tgt ddr_set)
75+
omr_assert(FATAL_ERROR TEST TARGET "${ddr_set}" MESSAGE "ddrset_add_targets called on non-existent ddr-set ${ddr_set}")
76+
get_target_property(is_ddrset "${ddr_set}" DDR_SET)
77+
omr_assert(FATAL_ERROR TEST is_ddrset MESSAGE "ddrset_add_targets called on ddr-set ${ddr_set}, which is not a ddr set")
78+
foreach(tgt IN LISTS ARGN)
79+
# Check if the target we are adding is itself a DDR set
80+
get_target_property(tgt_is_ddr_set ${tgt} DDR_SET)
81+
if(tgt_is_ddr_set)
82+
set_property(TARGET ${ddr_set} APPEND PROPERTY DDR_SUBSETS ${tgt})
83+
else()
84+
set_property(TARGET ${ddr_set} APPEND PROPERTY DDR_TARGETS ${tgt})
85+
endif()
86+
add_dependencies(${ddr_set} ${tgt})
87+
endforeach()
88+
endfunction(ddr_set_add_targets)
89+
90+
function(target_enable_ddr tgt)
6591
if((OMR_HOST_OS STREQUAL "win") OR (NOT OMR_DDR))
6692
return()
6793
endif()
6894

69-
set(opt_EARLY_SOURCE_EVAL )
70-
set(opt_UNPARSED_ARGUMENTS )
71-
cmake_parse_arguments(opt "EARLY_SOURCE_EVAL" "" "" ${ARGN})
72-
omr_assert(FATAL_ERROR TEST NOT opt_UNPARSED_ARGUMENTS MESSAGE "target_enable_ddr: unrecognized options ${opt_UNPARSED_ARGUMENTS}")
95+
omr_assert(FATAL_ERROR TEST TARGET ${tgt} MESSAGE "target_enable_ddr called on non-existent target ${tgt}")
96+
97+
set(options
98+
EARLY_SOURCE_EVAL
99+
GLOB_HEADERS
100+
GLOB_HEADERS_RECURSIVE
101+
)
102+
set(oneValueArgs "")
103+
set(multiValueArgs "")
73104

105+
# Clear variables
106+
foreach(opt_name IN LISTS options oneValueArgs multiValueArgs)
107+
set(opt_${opt_name} )
108+
endforeach()
74109

75-
set(DDR_SET_TARGET "${ddr_set}_ddr")
76-
omr_assert(FATAL_ERROR TEST TARGET ${tgt} MESSAGE "target_enable_ddr called on non-existant target ${tgt}")
77-
omr_assert(FATAL_ERROR TEST TARGET "${DDR_SET_TARGET}" MESSAGE "target_enable_ddr called on non-existant ddr_set ${ddr_set}")
110+
111+
cmake_parse_arguments(opt "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
112+
omr_assert(FATAL_ERROR TEST NOT opt_UNPARSED_ARGUMENTS MESSAGE "target_enable_ddr: unrecognized options ${opt_UNPARSED_ARGUMENTS}")
78113

79114
get_target_property(target_type "${tgt}" TYPE)
80115
if(target_type MATCHES "INTERFACE_LIBRARY")
81116
message(FATAL_ERROR "Cannot call enable_ddr on interface libraries")
82117
endif()
83118

84-
get_property(DDR_BIN_DIR TARGET "${DDR_SET_TARGET}" PROPERTY DDR_BIN_DIR)
85-
86119
if(opt_EARLY_SOURCE_EVAL)
87120
set(source_property "DDR_EVAL_SOURCE")
88121
get_target_property(sources "${tgt}" "SOURCES")
@@ -109,6 +142,28 @@ function(target_enable_ddr tgt ddr_set)
109142
set(MAGIC_TEMPLATE "OUTPUT_FILE\n$<TARGET_FILE:${tgt}>\n${MAGIC_TEMPLATE}")
110143
endif()
111144

112-
file(GENERATE OUTPUT "${DDR_BIN_DIR}/${tgt}.txt" CONTENT "${MAGIC_TEMPLATE}\n")
113-
set_property(TARGET ${DDR_SET_TARGET} APPEND PROPERTY INPUT_TARGETS ${tgt})
145+
file(GENERATE OUTPUT "${DDR_INFO_DIR}/targets/${tgt}.txt" CONTENT "${MAGIC_TEMPLATE}\n")
146+
147+
if(opt_GLOB_HEADERS OR opt_GLOB_HEADERS_RECURSIVE)
148+
get_target_property(source_dir ${tgt} SOURCE_DIR)
149+
if(opt_GLOB_HEADERS_RECURSIVE)
150+
set(glob GLOB_RECURSE)
151+
else()
152+
set(glob GLOB)
153+
endif()
154+
file(${glob} c_headers "${source_dir}/*.h")
155+
file(${glob} cpp_headers "${source_dir}/*.hpp")
156+
ddr_add_headers(${tgt}
157+
${c_headers}
158+
${cpp_headers}
159+
)
160+
161+
endif()
114162
endfunction(target_enable_ddr)
163+
164+
function(ddr_add_headers tgt)
165+
if(NOT OMR_DDR)
166+
return()
167+
endif()
168+
set_property(TARGET ${tgt} APPEND PROPERTY DDR_HEADERS ${ARGN})
169+
endfunction(ddr_add_headers)

cmake/modules/ddr/DDRSetStub.cmake.in

+77-35
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,42 @@
2121

2222
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
2323

24-
project(dummy LANGUAGES NONE)
25-
26-
set(OMR_MODULES_DIR @OMR_MODULES_DIR@)
24+
set(OMR_MODULES_DIR "@OMR_MODULES_DIR@")
2725
set(DDR_SUPPORT_DIR "@OMR_MODULES_DIR@/ddr")
28-
set(DDR_INPUTS
29-
$<JOIN:$<TARGET_PROPERTY:@DDR_TARGET_NAME@,INPUT_TARGETS>,
30-
>
31-
)
26+
set(DDR_INFO_DIR "@DDR_INFO_DIR@")
3227
set(DDR_BLACKLIST "$<TARGET_PROPERTY:@DDR_TARGET_NAME@,BLACKLIST>")
3328
set(DDR_OVERRIDES_FILE "$<TARGET_PROPERTY:@DDR_TARGET_NAME@,OVERRIDES_FILE>")
3429
set(DDR_BLOB "$<TARGET_PROPERTY:@DDR_TARGET_NAME@,BLOB>")
3530
set(DDR_SUPERSET "$<TARGET_PROPERTY:@DDR_TARGET_NAME@,SUPERSET>")
31+
set(DDR_MACRO_LIST "${DDR_INFO_DIR}/sets/@[email protected]")
32+
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OMR_MODULES_DIR})
33+
34+
set(DDR_TARGETS
35+
$<JOIN:$<TARGET_PROPERTY:@DDR_TARGET_NAME@,DDR_TARGETS>,
36+
>
37+
)
38+
set(DDR_SUBSETS
39+
$<JOIN:$<TARGET_PROPERTY:@DDR_TARGET_NAME@,DDR_SUBSETS>,
40+
>
41+
)
42+
43+
project(@DDR_TARGET_NAME@ LANGUAGES NONE)
3644

3745
include("@DDR_TOOLS_EXPORT@")
46+
include(OmrUtility)
3847

39-
# If not provided, set default values for superset and blob outputs
40-
if(NOT DDR_BLOB)
41-
set(DDR_BLOB "${CMAKE_CURRENT_BINARY_DIR}/blob.dat")
42-
endif()
48+
# given a var, make the path specified absolute,
49+
# assuming paths are relative to the ddr set source directory
50+
macro(make_absolute var_name)
51+
if(${var_name})
52+
get_filename_component(${var_name} "${${var_name}}" ABSOLUTE BASE_DIR "$<TARGET_PROPERTY:@DDR_TARGET_NAME@,SOURCE_DIR>")
53+
endif()
54+
endmacro()
4355

44-
if(NOT DDR_SUPERSET)
45-
set(DDR_SUPERSET "${CMAKE_CURRENT_BINARY_DIR}/superset.out")
46-
endif()
56+
make_absolute(DDR_BLACKLIST)
57+
make_absolute(DDR_OVERRIDES_FILE)
58+
make_absolute(DDR_BLOB)
59+
make_absolute(DDR_SUPERSET)
4760

4861
function(get_relative_path output filename base)
4962
get_filename_component(temp "${filename}" ABSOLUTE BASE_DIR "${base}")
@@ -127,7 +140,6 @@ function(process_source_files src_files)
127140
endif()
128141

129142
if(OPT_OUTPUT_ANNOTATED)
130-
message(STATUS "setting annotated file for ${target} ${annotated_files}")
131143
set("${OPT_OUTPUT_ANNOTATED}" "${annotated_files}" PARENT_SCOPE)
132144
endif()
133145
endfunction(process_source_files)
@@ -137,15 +149,17 @@ set(target_files )
137149

138150
function(process_target target)
139151
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${target}")
140-
file(STRINGS "${CMAKE_SOURCE_DIR}/${target}.txt" target_config)
152+
set(target_info_file "${DDR_INFO_DIR}/targets/${target}.txt")
153+
# Make cmake configuration depend on input file
154+
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${target_info_file}")
155+
file(STRINGS "${target_info_file}" target_config)
141156

142157
cmake_parse_arguments("OPT" "" "SOURCE_DIR;OUTPUT_FILE" "INCLUDE_PATH;DEFINES;SOURCES;HEADERS;PREINCLUDES" ${target_config})
143158

144159
if(OPT_OUTPUT_FILE)
145160
set(target_files ${target_files} "${OPT_OUTPUT_FILE}" PARENT_SCOPE)
146161
endif()
147162

148-
149163
process_source_files(
150164
${OPT_SOURCES}
151165
TARGET "${target}"
@@ -175,38 +189,66 @@ function(process_target target)
175189

176190
endfunction(process_target)
177191

178-
foreach(target IN LISTS DDR_INPUTS)
192+
foreach(target IN LISTS DDR_TARGETS)
179193
process_target("${target}")
180194
endforeach()
181195

196+
set(subset_macro_lists "")
197+
foreach(subset IN LISTS DDR_SUBSETS)
198+
list(APPEND subset_macro_lists "${DDR_INFO_DIR}/sets/${subset}.macros")
199+
endforeach()
182200
add_custom_command(
183-
OUTPUT macroList
184-
DEPENDS ${annotated_files}
185-
COMMAND cat ${annotated_files} > macroList
201+
OUTPUT ${DDR_MACRO_LIST}
202+
DEPENDS ${annotated_files} ${subset_macro_lists}
203+
COMMAND cat ${annotated_files} ${subset_macro_lists} > ${DDR_MACRO_LIST}
186204
)
187205

188206
set(EXTRA_DDRGEN_OPTIONS "")
189207
if(DDR_BLACKLIST)
190208
list(APPEND EXTRA_DDRGEN_OPTIONS "--blacklist" "${DDR_BLACKLIST}")
191209
endif()
210+
211+
if(DDR_BLOB)
212+
list(APPEND EXTRA_DDRGEN_OPTIONS "--blob" "${DDR_BLOB}")
213+
endif()
214+
215+
if(DDR_SUPERSET)
216+
list(APPEND EXTRA_DDRGEN_OPTIONS "--superset" "${DDR_SUPERSET}")
217+
endif()
218+
192219
if(DDR_OVERRIDES_FILE)
193220
# Because ddr overrides files specify relative paths, we need to run ddrgen
194221
# in the same directory as the overrides files.
195-
get_filename_component(override_dir "${DDR_OVERRIDES_FILE}" DIRECTORY)
222+
get_filename_component(override_file_dir "${DDR_OVERRIDES_FILE}" DIRECTORY)
196223

197-
list(APPEND EXTRA_DDRGEN_OPTIONS "--overrides" "${DDR_OVERRIDES_FILE}" WORKING_DIRECTORY "${override_dir}")
224+
list(APPEND EXTRA_DDRGEN_OPTIONS "--overrides" "${DDR_OVERRIDES_FILE}" WORKING_DIRECTORY "${override_file_dir}")
198225
endif()
199226

200-
add_custom_command(
201-
OUTPUT ${DDR_BLOB} ${DDR_SUPERSET}
202-
DEPENDS macroList
203-
COMMAND omr_ddrgen
204-
${target_files}
205-
-e
206-
--macrolist macroList
207-
--blob ${DDR_BLOB}
208-
--superset ${DDR_SUPERSET}
209-
${EXTRA_DDRGEN_OPTIONS}
210-
)
227+
set(subset_binaries)
228+
foreach(subset IN LISTS DDR_SUBSETS)
229+
# Name of file which subset generates, listing all of the input binaries
230+
set(binaries_list_file "${DDR_INFO_DIR}/sets/${subset}.binaries")
231+
set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${binaries_list_file}")
232+
file(STRINGS "${binaries_list_file}" binaries)
233+
list(APPEND subset_binaries ${binaries})
234+
endforeach()
211235

212-
add_custom_target(ddrgen ALL DEPENDS ${DDR_BLOB})
236+
# Now we generate our own list of binaries, so that they can be parsed if we are a subset
237+
omr_join(binaries_list "\n"
238+
${target_files}
239+
${subset_binaries}
240+
)
241+
file(WRITE "${DDR_INFO_DIR}/sets/@[email protected]" "${binaries_list}")
242+
243+
if(DDR_BLOB OR DDR_SUPERSET)
244+
add_custom_command(
245+
OUTPUT ${DDR_BLOB} ${DDR_SUPERSET}
246+
DEPENDS ${DDR_MACRO_LIST} ${target_files} ${subset_binaries}
247+
COMMAND omr_ddrgen
248+
${target_files} ${subset_binaries}
249+
--show-empty
250+
--macrolist ${DDR_MACRO_LIST}
251+
${EXTRA_DDRGEN_OPTIONS}
252+
)
253+
endif()
254+
add_custom_target(@DDR_TARGET_NAME@ ALL DEPENDS ${DDR_BLOB} ${DDR_MACRO_LIST})

cmake/modules/ddr/cmake_ddr.awk

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ END {
130130
}
131131

132132
NR == 1 {
133-
print "DDRFILE_BEGIN " FILENAME
133+
begin_file(FILENAME);
134134
}
135135

136136
/@ddr_options: *valuesonly/ { add_values = 1; add_flags = 0}

ddr/test/CMakeLists.txt

+3-5
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ add_executable(ddrgentest
3030
test.cpp
3131
)
3232

33-
make_ddr_set(testset)
34-
target_enable_ddr(ddrgentest testset)
35-
36-
file(GLOB_RECURSE headerfiles "${CMAKE_CURRENT_SOURCE_DIR}/*.h(pp)?")
37-
set_property(TARGET ddrgentest PROPERTY DDR_HEADERS ${headerfiles})
33+
make_ddr_set(ddr_testset)
34+
target_enable_ddr(ddrgentest GLOB_HEADERS_RECURSIVE)
35+
ddr_set_add_targets(ddr_testset ddrgentest)

gc/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,8 @@ target_link_libraries(omrgc
372372
${OMR_PORT_LIB}
373373
${OMR_HOOK_LIB}
374374
)
375-
target_enable_ddr(omrgc "${OMR_DDR_SET}" EARLY_SOURCE_EVAL)
375+
target_enable_ddr(omrgc EARLY_SOURCE_EVAL)
376+
ddr_set_add_targets(omrddr omrgc)
376377

377378
set_target_properties(omrgc omrgc_hookgen omrgc_tracegen PROPERTIES FOLDER gc)
378379

omr/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ if(OMR_GC)
8484
)
8585
endif(OMR_GC)
8686

87-
target_enable_ddr(omrcore "${OMR_DDR_SET}")
87+
target_enable_ddr(omrcore)
88+
ddr_set_add_targets(omrddr omrcore)

omr/startup/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,5 @@ if(OMR_GC)
5151
)
5252
endif()
5353

54-
target_enable_ddr(omrvmstartup "${OMR_DDR_SET}")
54+
target_enable_ddr(omrvmstartup)
55+
ddr_set_add_targets(omrddr omrvmstartup)

omrsigcompat/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,5 @@ install(
104104
LIBRARY DESTINATION ${OMR_INSTALL_LIB_DIR}/
105105
)
106106

107-
target_enable_ddr(omrsig "${OMR_DDR_SET}")
107+
target_enable_ddr(omrsig)
108+
ddr_set_add_targets(omrddr omrsig)

omrtrace/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ target_link_libraries(omrtrace
4747
omrutil
4848
)
4949

50-
target_enable_ddr(omrtrace "${OMR_DDR_SET}")
50+
target_enable_ddr(omrtrace)
51+
ddr_set_add_targets(omrddr omrtrace)
5152

5253
#TODO: check if following makefile fragment still required:
5354
#ifeq (gcc,$(OMR_TOOLCHAIN))

port/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,8 @@ omr_add_exports(omrport_obj
373373

374374
)
375375

376-
target_enable_ddr(omrport_obj "${OMR_DDR_SET}")
376+
target_enable_ddr(omrport_obj)
377+
ddr_set_add_targets(omrddr omrport_obj)
377378

378379
add_library(omrport STATIC
379380
$<TARGET_OBJECTS:omrport_obj>

thread/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ endif()
136136

137137
include(exports.cmake)
138138

139-
target_enable_ddr(j9thr_obj "${OMR_DDR_SET}")
139+
target_enable_ddr(j9thr_obj)
140+
ddr_set_add_targets(omrddr j9thr_obj)
140141

141142
add_library(j9thrstatic STATIC
142143
$<TARGET_OBJECTS:j9thr_obj>

0 commit comments

Comments
 (0)