Skip to content

Commit 8c524d6

Browse files
committed
用户自定义规则支持多行命令了
1 parent f885519 commit 8c524d6

File tree

7 files changed

+94
-4
lines changed

7 files changed

+94
-4
lines changed

README.chinese.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,24 @@ include-dir = F:\vcpkg\installed\x86-windows\include
387387
lib-dir = F:\vcpkg\installed\x86-windows\lib
388388
dll-dir = F:\vcpkg\installed\x86-windows\bin
389389
```
390+
## 内嵌的Make
391+
现实中的C++工程,源代码除了C++的.cpp跟.h外,还会涉及到其他一些类型的文件。
392+
393+
比如Qt的界面描述文件.ui,FLTK的界面描述文件.fl。
394+
这些文件经过编译之后,会产生.cpp或.h文件。
395+
除此之外,Qt著名的moc还会从.h生成.cpp。
396+
对于这类千变万化的东西,cpps提供了嵌入式的make脚本。
397+
```c++
398+
#include "finddialog.h" // usingcpp
399+
// using nocheck finddialog.h.moc.cpp
400+
/* cpps-make
401+
finddialog.h.moc.cpp : finddialog.h
402+
moc finddialog.h -o finddialog.h.moc.cpp
403+
*/
404+
```
405+
`using`指令后的`nocheck`告诉cpps,这个叫finddialog.h.moc.cpp的文件是build阶段生成出来的,即便扫描阶段不存在,也不要报错。
406+
407+
`cpps-make`指令引入一条用户自定义规则,语法同Makefile,当然,不会有普通Makefile那么完备。具体请参考examples里fltk跟qt的例子。
390408

391409
## 其他
392410
QQ交流群:492455203

examples/hello-qt-moc/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
// using nocheck finddialog.h.moc.cpp
88
// cpps-make finddialog.h.moc.cpp : finddialog.h // moc finddialog.h -o finddialog.h.moc.cpp
9+
// 上面这是单行make。只支持一条命令。命令写在//之后
910

1011
int main(int argc, char *argv[])
1112
{

examples/hello-qt-uic/main.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
#include <QApplication>
22
#include <QDialog>
33

4-
#include "gotocelldialog.h"
5-
6-
// cpps-make ui_gotocelldialog.h : gotocelldialog.ui // uic gotocelldialog.ui -o gotocelldialog.h
4+
#include "ui_gotocelldialog.h"
75

86
// vc-extra-compile-flags: -IF:\vcpkg\installed\x86-windows\include\QtWidgets
97

108
/* cpps-make
119
ui_gotocelldialog.h : gotocelldialog.ui
1210
uic gotocelldialog.ui -o gotocelldialog.h
11+
del ui_gotocelldialog.h > NUL 2>&1
12+
ren gotocelldialog.h ui_gotocelldialog.h
1313
*/
14+
// 上面这是多行make。但这个例子根本不需要这么复杂,用单行make即可。我只是为了举个例子。//之后那个-是为了避免cpps将其当作指令
15+
//- cpps-make ui_gotocelldialog.h : gotocelldialog.ui // uic gotocelldialog.ui -o ui_gotocelldialog.h
1416

1517
int main(int argc, char *argv[])
1618
{

src/UserDefinedRule.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,53 @@ void process_user_defined_rule(fs::path src_path, string rule_string, InfoPackag
6969

7070
}
7171

72+
void process_user_defined_rule_multi_lines(fs::path src_path, string dependency_relationship,
73+
vector<string> commands, InfoPackageScanned& pack)
74+
{
75+
// 分离dependency relationship中的targets与prerequisites
76+
auto colon_pos = dependency_relationship.find(":");
77+
string targets = dependency_relationship.substr(0, colon_pos);
78+
boost::algorithm::trim(targets);
79+
string prerequisites = dependency_relationship.substr(colon_pos + 1);
80+
boost::algorithm::trim(prerequisites);
81+
//cout << targets << endl;
82+
//cout << prerequisites << endl;
83+
84+
// 分离dependency relationship中的各个target
85+
vector<string> target_vector;
86+
std::string target_delimiters(" "); // 支持多个分界符
87+
boost::split(target_vector, targets, boost::is_any_of(target_delimiters), boost::token_compress_on); // token_compress_on是为了将单词之间的多个空格视为一个
88+
//for (auto t : target_vector) {
89+
// cout << ">>>" << t << "<<<" << endl;
90+
//}
91+
92+
// 分离prerequisites中的各个prerequisite
93+
vector<string> prerequisite_vector;
94+
std::string prerequisite_delimiters(" "); // 支持多个分界符
95+
boost::split(prerequisite_vector, prerequisites, boost::is_any_of(prerequisite_delimiters), boost::token_compress_on); // token_compress_on是为了将单词之间的多个空格视为一个
96+
//for (auto p : prerequisite_vector) {
97+
// cout << ">>>" << p << "<<<" << endl;
98+
//}
99+
100+
UserDefinedRule rule;
101+
rule.dir = src_path;
102+
rule.dir.remove_filename();
103+
104+
for (auto t : target_vector) {
105+
fs::path a = rule.dir;
106+
a /= t;
107+
rule.targets.push_back(a);
108+
}
109+
110+
for (auto p : prerequisite_vector) {
111+
fs::path a = rule.dir;
112+
a /= p;
113+
rule.prerequisites.push_back(a);
114+
}
115+
116+
117+
rule.commands = commands;
118+
119+
pack.user_defined_rules.push_back(rule);
120+
121+
}

src/UserDefinedRule.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,7 @@ struct UserDefinedRule {
2323
};
2424

2525
void process_user_defined_rule(fs::path src_path, string rule, InfoPackageScanned& pack);
26+
void process_user_defined_rule_multi_lines(fs::path src_path, string dependency_relationship,
27+
vector<string> commands, InfoPackageScanned& pack);
2628

2729
#endif // USERDEFINEDRULE_H

src/scan.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ void scan(fs::path src_path, InfoPackageScanned& pack)
8181
// cpps-before-link shell命令 在链接之前执行的操作
8282
// cpps-after-link shell命令 在链接之后执行的操作
8383

84-
regex user_defined_rule_pat{ R"(//\scpps-make\s+(.+\w))" };
84+
regex user_defined_rule_pat{ R"(//\scpps-make\s+(.+\w))" }; // 单行
85+
regex user_defined_rule_multi_lines_pat{R"(/\* cpps-make)"};
8586

8687
int n = 0;
8788
while (getline(in, line)) {
@@ -186,7 +187,23 @@ void scan(fs::path src_path, InfoPackageScanned& pack)
186187
process_user_defined_rule(src_path, matches[1], pack);
187188

188189
}
190+
else if (regex_search(line, matches, user_defined_rule_multi_lines_pat)) {
191+
//cout << matches[1] << endl;
192+
string dependency_relationship;
193+
getline(in, dependency_relationship);
194+
195+
vector<string> commands;
196+
string c;
197+
getline(in, c);
198+
boost::algorithm::trim(c);
199+
while (c != "*/") {
200+
commands.push_back(c);
201+
getline(in, c);
202+
boost::algorithm::trim(c);
203+
}
204+
process_user_defined_rule_multi_lines(src_path, dependency_relationship, commands, pack);
189205

206+
}
190207

191208
if (max_line_scan != -1) {
192209
n++;

0 commit comments

Comments
 (0)