Skip to content

Commit 164337f

Browse files
committed
Merge branch 'standard-ifdefs' into ast-matcher
2 parents 0ec5e8a + 0a92d07 commit 164337f

2 files changed

Lines changed: 45 additions & 68 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,7 @@ set(_common_headers)
226226
foreach(_header IN LISTS rule_common_headers)
227227
list(APPEND _common_headers --common-header=${_header})
228228
endforeach()
229-
set(CPP2RUST_CXX_STANDARDS 11 17 20 23)
230-
set(c_rules_index_parts)
231-
set(cpp_rules_index_parts)
229+
set(rules_index_parts)
232230
set(rules_index_parts_dir ${CMAKE_BINARY_DIR}/rules_index/parts)
233231
set(RULES_IR_DIR "${CMAKE_BINARY_DIR}/rules")
234232
set(rust_rules_ir_outputs)
@@ -238,28 +236,15 @@ foreach(_rule_dir IN LISTS rule_subdirs)
238236
continue()
239237
endif()
240238
get_filename_component(_rule_name ${_rule_dir} NAME)
241-
if(EXISTS ${_rule_dir}/src.c)
242-
set(_part ${rules_index_parts_dir}/${_rule_name}.c.json)
243-
add_custom_command(
244-
OUTPUT ${_part}
245-
COMMAND ${CMAKE_COMMAND} -E make_directory ${rules_index_parts_dir}
246-
COMMAND $<TARGET_FILE:cpp-rule-indexer> --dir ${_rule_dir} -o ${_part}
247-
DEPENDS ${_rule_dir}/src.c ${rule_indexer_sources} ${RUSTLS_HEADER} ${BROTLI_HEADERS}
248-
VERBATIM
249-
)
250-
list(APPEND c_rules_index_parts ${_part})
251-
endif()
252-
foreach(_standard IN LISTS CPP2RUST_CXX_STANDARDS)
253-
set(_part ${rules_index_parts_dir}/${_rule_name}.cpp${_standard}.json)
254-
add_custom_command(
255-
OUTPUT ${_part}
256-
COMMAND ${CMAKE_COMMAND} -E make_directory ${rules_index_parts_dir}
257-
COMMAND $<TARGET_FILE:cpp-rule-indexer> --dir ${_rule_dir} --cxxflags=-std=c++${_standard} -o ${_part}
258-
DEPENDS ${_cpp_srcs} ${rule_common_headers} ${rule_indexer_sources} ${RUSTLS_HEADER} ${BROTLI_HEADERS}
259-
VERBATIM
260-
)
261-
list(APPEND cpp_rules_index_parts ${_part})
262-
endforeach()
239+
set(_part ${rules_index_parts_dir}/${_rule_name}.json)
240+
add_custom_command(
241+
OUTPUT ${_part}
242+
COMMAND ${CMAKE_COMMAND} -E make_directory ${rules_index_parts_dir}
243+
COMMAND $<TARGET_FILE:cpp-rule-indexer> --dir ${_rule_dir} -o ${_part}
244+
DEPENDS ${_cpp_srcs} ${rule_common_headers} ${rule_indexer_sources} ${RUSTLS_HEADER} ${BROTLI_HEADERS}
245+
VERBATIM
246+
)
247+
list(APPEND rules_index_parts ${_part})
263248

264249
set(_out_dir ${RULES_IR_DIR}/${_rule_name})
265250
set(_rust_srcs)
@@ -290,21 +275,15 @@ foreach(_rule_dir IN LISTS rule_subdirs)
290275
list(APPEND rust_rules_ir_outputs ${_rust_out})
291276
endforeach()
292277

278+
set(cpp_rules_index_outputs ${CMAKE_BINARY_DIR}/rules_index/c.json ${CMAKE_BINARY_DIR}/rules_index/cpp.json)
293279
add_custom_command(
294-
OUTPUT ${CMAKE_BINARY_DIR}/rules_index/c.json
295-
COMMAND $<TARGET_FILE:cpp-rule-indexer> -o ${CMAKE_BINARY_DIR}/rules_index/c.json ${c_rules_index_parts}
296-
DEPENDS ${c_rules_index_parts} ${rule_indexer_sources}
297-
VERBATIM
298-
)
299-
300-
add_custom_command(
301-
OUTPUT ${CMAKE_BINARY_DIR}/rules_index/cpp.json
302-
COMMAND $<TARGET_FILE:cpp-rule-indexer> ${_common_headers} -o ${CMAKE_BINARY_DIR}/rules_index/cpp.json ${cpp_rules_index_parts}
303-
DEPENDS ${cpp_rules_index_parts} ${rule_common_headers} ${rule_indexer_sources}
280+
OUTPUT ${cpp_rules_index_outputs}
281+
COMMAND $<TARGET_FILE:cpp-rule-indexer> ${_common_headers} -o ${CMAKE_BINARY_DIR}/rules_index ${rules_index_parts}
282+
DEPENDS ${rules_index_parts} ${rule_common_headers} ${rule_indexer_sources}
304283
VERBATIM
305284
)
306285

307-
add_custom_target("index-cpp-rules" ALL DEPENDS ${CMAKE_BINARY_DIR}/rules_index/c.json ${CMAKE_BINARY_DIR}/rules_index/cpp.json)
286+
add_custom_target("index-cpp-rules" ALL DEPENDS ${cpp_rules_index_outputs})
308287

309288
add_custom_target("preprocess-rust-rules" ALL
310289
DEPENDS ${rust_rules_ir_outputs})

‎cpp2rust/rule_preprocessing/cpp_rule_indexer.cpp‎

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -139,24 +139,18 @@ llvm::json::Object ReadJson(const fs::path &path) {
139139
return std::move(*parsed->getAsObject());
140140
}
141141

142-
unsigned CxxStandard(const std::vector<std::string> &flags) {
143-
for (llvm::StringRef flag : flags) {
144-
unsigned standard;
145-
if (flag.consume_front("-std=c++") && !flag.getAsInteger(10, standard)) {
146-
return standard;
147-
}
148-
}
149-
return 0;
150-
}
142+
void MergeRules(llvm::json::Object &into, llvm::json::Object &&from);
151143

152-
void IndexDir(const fs::path &rule_dir, const std::vector<std::string> &flags,
153-
const fs::path &out) {
154-
llvm::json::Object rules;
144+
void IndexDir(const fs::path &rule_dir, const fs::path &out) {
155145
auto dir_name = rule_dir.filename().string();
156-
auto standard = CxxStandard(flags);
157-
if (standard == 0) {
158-
Index(rule_dir / "src.c", /*is_c=*/true, dir_name, flags, rules);
159-
} else {
146+
llvm::json::Object c_rules;
147+
if (fs::exists(rule_dir / "src.c")) {
148+
Index(rule_dir / "src.c", /*is_c=*/true, dir_name, {}, c_rules);
149+
}
150+
llvm::json::Object cxx_rules;
151+
for (unsigned standard : {11u, 17u, 20u, 23u}) {
152+
llvm::json::Object rules;
153+
std::vector<std::string> flags{std::format("-std=c++{}", standard)};
160154
for (const char *name : {"src.c", "src.cpp"}) {
161155
auto src_path = rule_dir / name;
162156
if (fs::exists(src_path)) {
@@ -168,8 +162,10 @@ void IndexDir(const fs::path &rule_dir, const std::vector<std::string> &flags,
168162
(*entry.getAsObject())["standards"] = llvm::json::Array{standard};
169163
}
170164
}
165+
MergeRules(cxx_rules, std::move(rules));
171166
}
172-
WriteJson(out, llvm::json::Object{{"rules", std::move(rules)}});
167+
WriteJson(out, llvm::json::Object{{"c", std::move(c_rules)},
168+
{"cpp", std::move(cxx_rules)}});
173169
}
174170

175171
void MergeRules(llvm::json::Object &into, llvm::json::Object &&from) {
@@ -201,17 +197,24 @@ void MergeRules(llvm::json::Object &into, llvm::json::Object &&from) {
201197

202198
void MergeIndexes(const std::vector<std::string> &parts,
203199
const std::vector<std::string> &common_headers,
204-
const fs::path &out) {
205-
llvm::json::Object rules;
200+
const fs::path &index_dir) {
201+
llvm::json::Object c_rules;
202+
llvm::json::Object cxx_rules;
206203
for (const auto &part : parts) {
207-
MergeRules(rules, std::move(*ReadJson(part).getObject("rules")));
204+
auto json = ReadJson(part);
205+
MergeRules(c_rules, std::move(*json.getObject("c")));
206+
MergeRules(cxx_rules, std::move(*json.getObject("cpp")));
208207
}
209208
std::string common;
210209
for (const auto &header : common_headers) {
211210
common += std::format("#include \"{}\"\n", header);
212211
}
213-
WriteJson(out, llvm::json::Object{{"common", std::move(common)},
214-
{"rules", std::move(rules)}});
212+
fs::create_directories(index_dir);
213+
WriteJson(index_dir / "c.json",
214+
llvm::json::Object{{"common", ""}, {"rules", std::move(c_rules)}});
215+
WriteJson(index_dir / "cpp.json",
216+
llvm::json::Object{{"common", std::move(common)},
217+
{"rules", std::move(cxx_rules)}});
215218
}
216219

217220
} // namespace cpp2rust
@@ -224,11 +227,6 @@ llvm::cl::opt<std::string> Dir("dir", llvm::cl::desc("Rule directory to index"),
224227
llvm::cl::value_desc("rule-dir"),
225228
llvm::cl::cat(cat));
226229

227-
llvm::cl::list<std::string> CXXFlags("cxxflags",
228-
llvm::cl::desc("Additional CXXFLAGS"),
229-
llvm::cl::value_desc("cxxflags"),
230-
llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
231-
232230
llvm::cl::list<std::string> Parts(llvm::cl::Positional,
233231
llvm::cl::desc("<indexes to merge>"),
234232
llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
@@ -237,9 +235,10 @@ llvm::cl::list<std::string> CommonHeaders(
237235
"common-header", llvm::cl::desc("Header the C++ rules depend on"),
238236
llvm::cl::value_desc("header"), llvm::cl::ZeroOrMore, llvm::cl::cat(cat));
239237

240-
llvm::cl::opt<std::string> Out("o", llvm::cl::desc("Output index"),
241-
llvm::cl::value_desc("index.json"),
242-
llvm::cl::Required, llvm::cl::cat(cat));
238+
llvm::cl::opt<std::string>
239+
Out("o",
240+
llvm::cl::desc("Output part of a rule directory, or index directory"),
241+
llvm::cl::value_desc("path"), llvm::cl::Required, llvm::cl::cat(cat));
243242

244243
} // namespace
245244

@@ -248,8 +247,7 @@ int main(int argc, char *argv[]) {
248247
llvm::cl::ParseCommandLineOptions(argc, argv);
249248

250249
if (!Dir.empty()) {
251-
cpp2rust::IndexDir(Dir.getValue(), {CXXFlags.begin(), CXXFlags.end()},
252-
Out.getValue());
250+
cpp2rust::IndexDir(Dir.getValue(), Out.getValue());
253251
} else {
254252
cpp2rust::MergeIndexes({Parts.begin(), Parts.end()},
255253
{CommonHeaders.begin(), CommonHeaders.end()},

0 commit comments

Comments
 (0)