Skip to content

Commit 8dbd943

Browse files
committed
cpp-rule-preprocessor receives one file at a time
1 parent 93c9397 commit 8dbd943

4 files changed

Lines changed: 60 additions & 103 deletions

File tree

cpp2rust/cpp2rust.cpp

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@
33

44
#include <llvm/Support/CommandLine.h>
55

6+
#include <algorithm>
7+
#include <array>
68
#include <cstdlib>
79
#include <filesystem>
810
#include <fstream>
911
#include <vector>
1012

13+
#if defined(_WIN32)
14+
#include <windows.h>
15+
#elif defined(__linux__)
16+
#include <limits.h>
17+
#include <unistd.h>
18+
#elif defined(__APPLE__)
19+
#include <mach-o/dyld.h>
20+
#endif
21+
1122
#include "cpp2rust_lib.h"
1223
#include "logging.h"
13-
#include "rules_dir.h"
1424

1525
namespace fs = std::filesystem;
1626

@@ -56,6 +66,41 @@ llvm::cl::list<std::string> CXXFlags("cxxflags",
5666

5767
} // namespace
5868

69+
static fs::path GetExecutableDir() {
70+
#if defined(_WIN32)
71+
char path[MAX_PATH];
72+
GetModuleFileNameA(NULL, path, MAX_PATH);
73+
return fs::path(path).parent_path();
74+
#elif defined(__linux__)
75+
char path[PATH_MAX];
76+
ssize_t count = readlink("/proc/self/exe", path, PATH_MAX);
77+
return fs::path(std::string_view(path, std::max((ssize_t)0, count)))
78+
.parent_path();
79+
#elif defined(__APPLE__)
80+
uint32_t size = 0;
81+
_NSGetExecutablePath(nullptr, &size);
82+
std::vector<char> buffer(size);
83+
_NSGetExecutablePath(buffer.data(), &size);
84+
return fs::path(buffer.data()).parent_path();
85+
#endif
86+
return ".";
87+
}
88+
89+
static bool ResolveRulesDir() {
90+
std::array<fs::path, 3> candidates = {fs::path("./rules"),
91+
fs::path("../rules"),
92+
GetExecutableDir() / "../../rules"};
93+
94+
for (const auto &dir : candidates) {
95+
if (fs::exists(dir) && fs::is_directory(dir)) {
96+
RulesDir = fs::canonical(dir).string();
97+
llvm::errs() << "Using rules directory: " << RulesDir << '\n';
98+
return true;
99+
}
100+
}
101+
return false;
102+
}
103+
59104
int main(int argc, char *argv[]) {
60105
llvm::cl::HideUnrelatedOptions(cpp2rust_cmdargs);
61106
llvm::cl::ParseCommandLineOptions(argc, argv);
@@ -104,7 +149,9 @@ int main(int argc, char *argv[]) {
104149

105150
std::vector<std::string_view> cxx_flags(CXXFlags.begin(), CXXFlags.end());
106151

107-
if (RulesDir.empty() && !cpp2rust::ResolveRulesDir(RulesDir)) {
152+
if (RulesDir.empty() && !ResolveRulesDir()) {
153+
llvm::errs() << "ERROR: rules directory not found. "
154+
"Please specify one with --rules\n";
108155
return EXIT_FAILURE;
109156
}
110157

cpp2rust/cpp_rule_preprocessor.cpp

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,25 @@
1212
#include <string>
1313

1414
#include "converter/rule_src_parser.h"
15-
#include "rules_dir.h"
1615

1716
namespace fs = std::filesystem;
1817

1918
namespace {
2019
llvm::cl::OptionCategory cat("cpp-rule-preprocessor options");
2120

2221
llvm::cl::opt<std::string>
23-
RulesDir("rules",
24-
llvm::cl::desc("Directory containing rule packages (each with a "
25-
"src.cpp); ir_src.json is written next to each. "
26-
"If omitted, auto-detected as in cpp2rust"),
27-
llvm::cl::value_desc("dir"), llvm::cl::cat(cat));
22+
SrcFile("file",
23+
llvm::cl::desc("Path to a rule's src.cpp. ir_src.json is written "
24+
"next to it"),
25+
llvm::cl::value_desc("src.cpp"), llvm::cl::Required,
26+
llvm::cl::cat(cat));
2827
} // namespace
2928

30-
static void process(const fs::path &src) {
29+
int main(int argc, char *argv[]) {
30+
llvm::cl::HideUnrelatedOptions(cat);
31+
llvm::cl::ParseCommandLineOptions(argc, argv);
32+
33+
fs::path src = SrcFile.getValue();
3134
llvm::errs() << "Preprocessing " << src.string() << '\n';
3235
auto strings = cpp2rust::RuleSrcParser::Extract(src);
3336

@@ -53,24 +56,8 @@ static void process(const fs::path &src) {
5356
if (ec) {
5457
llvm::errs() << "ERROR: failed to open " << out_path.string() << ": "
5558
<< ec.message() << '\n';
56-
std::exit(EXIT_FAILURE);
57-
}
58-
out << llvm::formatv("{0:2}", llvm::json::Value(std::move(root))) << '\n';
59-
}
60-
61-
int main(int argc, char *argv[]) {
62-
llvm::cl::HideUnrelatedOptions(cat);
63-
llvm::cl::ParseCommandLineOptions(argc, argv);
64-
65-
if (RulesDir.empty() && !cpp2rust::ResolveRulesDir(RulesDir)) {
6659
return EXIT_FAILURE;
6760
}
68-
69-
for (const auto &entry :
70-
fs::recursive_directory_iterator(RulesDir.getValue())) {
71-
if (entry.is_regular_file() && entry.path().filename() == "src.cpp") {
72-
process(entry.path());
73-
}
74-
}
61+
out << llvm::formatv("{0:2}", llvm::json::Value(std::move(root))) << '\n';
7562
return EXIT_SUCCESS;
7663
}

cpp2rust/rules_dir.cpp

Lines changed: 0 additions & 65 deletions
This file was deleted.

cpp2rust/rules_dir.h

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)