Skip to content

Commit 21722ef

Browse files
authored
Fix drogon_ctl compilation with clang-cl (#2477)
1 parent 707c4c3 commit 21722ef

10 files changed

Lines changed: 38 additions & 0 deletions

File tree

drogon_ctl/create.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,14 @@ void create::handleCommand(std::vector<std::string> &parameters)
5656
parameters[0] = createObjName;
5757
exeCommand(parameters);
5858
}
59+
60+
// Prevent clang-cl/lld-link from discarding DrObject<T>::alloc_ on Windows.
61+
// On COFF targets, clang places the CRT initializer for the template static
62+
// member in the same COMDAT group as the variable itself. When no code in the
63+
// translation unit takes the address of alloc_ (clang inlines className()),
64+
// the entire COMDAT is eligible for elimination — and lld-link's /OPT:REF
65+
// removes it, so DrClassMap is never populated.
66+
// Explicit template instantiation forces a strong (non-COMDAT) definition,
67+
// which the linker must keep. This is a no-op on MSVC, GCC, and ELF targets
68+
// (where .init_array entries are GC roots and are never discarded).
69+
template class drogon::DrObject<drogon_ctl::create>;

drogon_ctl/create_controller.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,3 +469,6 @@ void create_controller::createARestfulController(const std::string &className,
469469
std::cout << "File name: " << ctlName << ".h and " << ctlName << ".cc"
470470
<< std::endl;
471471
}
472+
473+
// See create.cc for rationale.
474+
template class drogon::DrObject<drogon_ctl::create_controller>;

drogon_ctl/create_filter.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,6 @@ void create_filter::handleCommand(std::vector<std::string> &parameters)
116116
createFilterSourceFile(oSourceFile, className, fileName);
117117
}
118118
}
119+
120+
// See create.cc for rationale.
121+
template class drogon::DrObject<drogon_ctl::create_filter>;

drogon_ctl/create_model.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,3 +1460,6 @@ void create_model::createRestfulAPIController(
14601460
<< std::endl;
14611461
}
14621462
}
1463+
1464+
// See create.cc for rationale.
1465+
template class drogon::DrObject<drogon_ctl::create_model>;

drogon_ctl/create_plugin.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,6 @@ void create_plugin::handleCommand(std::vector<std::string> &parameters)
116116
createPluginSourceFile(oSourceFile, className, fileName);
117117
}
118118
}
119+
120+
// See create.cc for rationale.
121+
template class drogon::DrObject<drogon_ctl::create_plugin>;

drogon_ctl/create_project.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,6 @@ void create_project::createProject(const std::string &projectName)
141141
std::ofstream testCmakeFile("test/CMakeLists.txt", std::ofstream::out);
142142
newTestCmakeFile(testCmakeFile, projectName);
143143
}
144+
145+
// See create.cc for rationale.
146+
template class drogon::DrObject<drogon_ctl::create_project>;

drogon_ctl/create_view.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,3 +552,6 @@ void create_view::newViewSourceFile(std::ofstream &file,
552552
file << "return templ->genText(data);\n";
553553
file << "}\n}\n";
554554
}
555+
556+
// See create.cc for rationale.
557+
template class drogon::DrObject<drogon_ctl::create_view>;

drogon_ctl/help.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,6 @@ void help::handleCommand(std::vector<std::string> &parameters)
6868
}
6969
}
7070
}
71+
72+
// See create.cc for rationale.
73+
template class drogon::DrObject<drogon_ctl::help>;

drogon_ctl/press.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,6 @@ void press::outputResults()
470470
<< std::endl;
471471
exit(0);
472472
}
473+
474+
// See create.cc for rationale.
475+
template class drogon::DrObject<drogon_ctl::press>;

drogon_ctl/version.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,6 @@ void version::handleCommand(std::vector<std::string> &parameters)
6666
std::cout << " yaml-cpp: no\n";
6767
#endif
6868
}
69+
70+
// See create.cc for rationale.
71+
template class drogon::DrObject<drogon_ctl::version>;

0 commit comments

Comments
 (0)