aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bdep/new.cxx307
1 files changed, 163 insertions, 144 deletions
diff --git a/bdep/new.cxx b/bdep/new.cxx
index 9066176..52c3de8 100644
--- a/bdep/new.cxx
+++ b/bdep/new.cxx
@@ -1976,25 +1976,40 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
// In absence of the source subdirectory, fallback to the package name
// to minimize the potential macro name clash.
//
- string mp (
+ string mx (
sanitize_identifier (
ucase (const_cast<const string&> (!ip.empty () ? ip : n))));
// Strip the trailing underscore (produced from slash).
//
if (!ip.empty ())
- mp.pop_back ();
+ mx.pop_back ();
string apih; // API header name.
string exph; // Export header name (empty if binless).
string verh; // Version header name.
+ // Language-specific source code comment markers.
+ //
+ string O; // Open multi-line comment.
+ string X; // Middle of multi-line comment.
+ string Q; // Close multi-line comment.
+
+ string B; // Begin of a single-line comment.
+ string E; // End of a single-line comment.
+
bool binless (t.lib_opt.binless ());
switch (l)
{
case lang::c:
{
+ O = "/* ";
+ X = " * ";
+ Q = " */";
+ B = "/* ";
+ E = " */";
+
if (binless)
{
apih = s + ".h";
@@ -2024,8 +2039,6 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
<< " return fprintf (f, \"Hello, %s!\\n\", name);" << '\n'
<< "}" << '\n';
os.close ();
-
- break;
}
else
{
@@ -2046,7 +2059,7 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
<< " * stream. On success, return the number of characters printed." << '\n'
<< " * On failure, set errno and return a negative value." << '\n'
<< " */" << '\n'
- << mp << "_SYMEXPORT int" << '\n'
+ << mx << "_SYMEXPORT int" << '\n'
<< "say_hello (FILE *, const char *name);" << '\n';
os.close ();
@@ -2068,92 +2081,98 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
<< " return fprintf (f, \"Hello, %s!\\n\", n);" << '\n'
<< "}" << '\n';
os.close ();
-
- break;
}
+
+ break;
}
case lang::cxx:
- if (binless)
{
- apih = s + he;
- verh = ver ? "version" + he : string ();
+ O = "// ";
+ X = "// ";
+ Q = "// ";
+ B = "// ";
+ E = "";
- // <inc>/<stem>[.<hxx-ext>]
- //
- open (out_inc / apih);
- os << "#pragma once" << '\n'
- << '\n'
- << "#include <string>" << '\n'
- << "#include <ostream>" << '\n'
- << "#include <stdexcept>" << '\n'
- << '\n'
- << "namespace " << id << '\n'
- << "{" << '\n'
- << " // Print a greeting for the specified name into the specified" << '\n'
- << " // stream. Throw std::invalid_argument if the name is empty." << '\n'
- << " //" << '\n'
- << " inline void" << '\n'
- << " say_hello (std::ostream& o, const std::string& name)" << '\n'
- << " {" << '\n'
- << " using namespace std;" << '\n'
- << '\n'
- << " if (name.empty ())" << '\n'
- << " throw invalid_argument (\"empty name\");" << '\n'
- << '\n'
- << " o << \"Hello, \" << name << '!' << endl;" << '\n'
- << " }" << '\n'
- << "}" << '\n';
- os.close ();
+ if (binless)
+ {
+ apih = s + he;
+ verh = ver ? "version" + he : string ();
- break;
- }
- else
- {
- apih = s + he;
- exph = "export" + he;
- verh = ver ? "version" + he : string ();
+ // <inc>/<stem>[.<hxx-ext>]
+ //
+ open (out_inc / apih);
+ os << "#pragma once" << '\n'
+ << '\n'
+ << "#include <string>" << '\n'
+ << "#include <ostream>" << '\n'
+ << "#include <stdexcept>" << '\n'
+ << '\n'
+ << "namespace " << id << '\n'
+ << "{" << '\n'
+ << " // Print a greeting for the specified name into the specified" << '\n'
+ << " // stream. Throw std::invalid_argument if the name is empty." << '\n'
+ << " //" << '\n'
+ << " inline void" << '\n'
+ << " say_hello (std::ostream& o, const std::string& name)" << '\n'
+ << " {" << '\n'
+ << " using namespace std;" << '\n'
+ << '\n'
+ << " if (name.empty ())" << '\n'
+ << " throw invalid_argument (\"empty name\");" << '\n'
+ << '\n'
+ << " o << \"Hello, \" << name << '!' << endl;" << '\n'
+ << " }" << '\n'
+ << "}" << '\n';
+ os.close ();
+ }
+ else
+ {
+ apih = s + he;
+ exph = "export" + he;
+ verh = ver ? "version" + he : string ();
- // <inc>/<stem>[.<hxx-ext>]
- //
- open (out_inc / apih);
- os << "#pragma once" << '\n'
- << '\n'
- << "#include <iosfwd>" << '\n'
- << "#include <string>" << '\n'
- << '\n'
- << "#include <" << ip << exph << ">" << '\n'
- << '\n'
- << "namespace " << id << '\n'
- << "{" << '\n'
- << " // Print a greeting for the specified name into the specified" << '\n'
- << " // stream. Throw std::invalid_argument if the name is empty." << '\n'
- << " //" << '\n'
- << " " << mp << "_SYMEXPORT void" << '\n'
- << " say_hello (std::ostream&, const std::string& name);" << '\n'
- << "}" << '\n';
- os.close ();
+ // <inc>/<stem>[.<hxx-ext>]
+ //
+ open (out_inc / apih);
+ os << "#pragma once" << '\n'
+ << '\n'
+ << "#include <iosfwd>" << '\n'
+ << "#include <string>" << '\n'
+ << '\n'
+ << "#include <" << ip << exph << ">" << '\n'
+ << '\n'
+ << "namespace " << id << '\n'
+ << "{" << '\n'
+ << " // Print a greeting for the specified name into the specified" << '\n'
+ << " // stream. Throw std::invalid_argument if the name is empty." << '\n'
+ << " //" << '\n'
+ << " " << mx << "_SYMEXPORT void" << '\n'
+ << " say_hello (std::ostream&, const std::string& name);" << '\n'
+ << "}" << '\n';
+ os.close ();
- // <src>/<stem>.<cxx-ext>
- //
- open (out_src / s + xe);
- os << "#include <" << ip << apih << ">" << '\n'
- << '\n'
- << "#include <ostream>" << '\n'
- << "#include <stdexcept>" << '\n'
- << '\n'
- << "using namespace std;" << '\n'
- << '\n'
- << "namespace " << id << '\n'
- << "{" << '\n'
- << " void say_hello (ostream& o, const string& n)" << '\n'
- << " {" << '\n'
- << " if (n.empty ())" << '\n'
- << " throw invalid_argument (\"empty name\");" << '\n'
- << '\n'
- << " o << \"Hello, \" << n << '!' << endl;" << '\n'
- << " }" << '\n'
- << "}" << '\n';
- os.close ();
+ // <src>/<stem>.<cxx-ext>
+ //
+ open (out_src / s + xe);
+ os << "#include <" << ip << apih << ">" << '\n'
+ << '\n'
+ << "#include <ostream>" << '\n'
+ << "#include <stdexcept>" << '\n'
+ << '\n'
+ << "using namespace std;" << '\n'
+ << '\n'
+ << "namespace " << id << '\n'
+ << "{" << '\n'
+ << " void say_hello (ostream& o, const string& n)" << '\n'
+ << " {" << '\n'
+ << " if (n.empty ())" << '\n'
+ << " throw invalid_argument (\"empty name\");" << '\n'
+ << '\n'
+ << " o << \"Hello, \" << n << '!' << endl;" << '\n'
+ << " }" << '\n'
+ << "}" << '\n';
+ os.close ();
+ }
break;
}
@@ -2177,34 +2196,34 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
<< "// the end it's all trial and error." << '\n'
<< '\n';
}
- os << "#if defined(" << mp << "_STATIC) // Using static." << '\n'
- << "# define " << mp << "_SYMEXPORT" << '\n'
- << "#elif defined(" << mp << "_STATIC_BUILD) // Building static." << '\n'
- << "# define " << mp << "_SYMEXPORT" << '\n'
- << "#elif defined(" << mp << "_SHARED) // Using shared." << '\n'
- << "# ifdef _WIN32" << '\n'
- << "# define " << mp << "_SYMEXPORT __declspec(dllimport)" << '\n'
- << "# else" << '\n'
- << "# define " << mp << "_SYMEXPORT" << '\n'
- << "# endif" << '\n'
- << "#elif defined(" << mp << "_SHARED_BUILD) // Building shared." << '\n'
- << "# ifdef _WIN32" << '\n'
- << "# define " << mp << "_SYMEXPORT __declspec(dllexport)" << '\n'
- << "# else" << '\n'
- << "# define " << mp << "_SYMEXPORT" << '\n'
- << "# endif" << '\n'
- << "#else" << '\n'
- << "// If none of the above macros are defined, then we assume we are being used" << '\n'
- << "// by some third-party build system that cannot/doesn't signal the library" << '\n'
- << "// type. Note that this fallback works for both static and shared libraries" << '\n'
- << "// provided the library only exports functions (in other words, no global" << '\n'
- << "// exported data) and for the shared case the result will be sub-optimal" << '\n'
- << "// compared to having dllimport. If, however, your library does export data," << '\n'
- << "// then you will probably want to replace the fallback with the (commented" << '\n'
- << "// out) error since it won't work for the shared case." << '\n'
- << "//" << '\n'
- << "# define " << mp << "_SYMEXPORT // Using static or shared." << '\n'
- << "//# error define " << mp << "_STATIC or " << mp << "_SHARED preprocessor macro to signal " << n << " library type being linked" << '\n'
+ os << "#if defined(" << mx << "_STATIC) " << B << "Using static." << E << '\n'
+ << "# define " << mx << "_SYMEXPORT" << '\n'
+ << "#elif defined(" << mx << "_STATIC_BUILD) " << B << "Building static." << E << '\n'
+ << "# define " << mx << "_SYMEXPORT" << '\n'
+ << "#elif defined(" << mx << "_SHARED) " << B << "Using shared." << E << '\n'
+ << "# ifdef _WIN32" << '\n'
+ << "# define " << mx << "_SYMEXPORT __declspec(dllimport)" << '\n'
+ << "# else" << '\n'
+ << "# define " << mx << "_SYMEXPORT" << '\n'
+ << "# endif" << '\n'
+ << "#elif defined(" << mx << "_SHARED_BUILD) " << B << "Building shared." << E << '\n'
+ << "# ifdef _WIN32" << '\n'
+ << "# define " << mx << "_SYMEXPORT __declspec(dllexport)" << '\n'
+ << "# else" << '\n'
+ << "# define " << mx << "_SYMEXPORT" << '\n'
+ << "# endif" << '\n'
+ << "#else" << '\n'
+ << O << "If none of the above macros are defined, then we assume we are being used" << '\n'
+ << X << "by some third-party build system that cannot/doesn't signal the library" << '\n'
+ << X << "type. Note that this fallback works for both static and shared libraries" << '\n'
+ << X << "provided the library only exports functions (in other words, no global" << '\n'
+ << X << "exported data) and for the shared case the result will be sub-optimal" << '\n'
+ << X << "compared to having dllimport. If, however, your library does export data," << '\n'
+ << X << "then you will probably want to replace the fallback with the (commented" << '\n'
+ << X << "out) error since it won't work for the shared case." << '\n'
+ << Q << '\n'
+ << "# define " << mx << "_SYMEXPORT " << B << "Using static or shared." << E << '\n'
+ << B << "# error define " << mx << "_STATIC or " << mx << "_SHARED preprocessor macro to signal " << n << " library type being linked" << E << '\n'
<< "#endif" << '\n';
os.close ();
}
@@ -2217,38 +2236,38 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
os << "#pragma once" << '\n'
<< '\n'
- << "// The numeric version format is AAAAABBBBBCCCCCDDDE where:" << '\n'
- << "//" << '\n'
- << "// AAAAA - major version number" << '\n'
- << "// BBBBB - minor version number" << '\n'
- << "// CCCCC - bugfix version number" << '\n'
- << "// DDD - alpha / beta (DDD + 500) version number" << '\n'
- << "// E - final (0) / snapshot (1)" << '\n'
- << "//" << '\n'
- << "// When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:" << '\n'
- << "//" << '\n'
- << "// Version AAAAABBBBBCCCCCDDDE" << '\n'
- << "//" << '\n'
- << "// 0.1.0 0000000001000000000" << '\n'
- << "// 0.1.2 0000000001000020000" << '\n'
- << "// 1.2.3 0000100002000030000" << '\n'
- << "// 2.2.0-a.1 0000200001999990010" << '\n'
- << "// 3.0.0-b.2 0000299999999995020" << '\n'
- << "// 2.2.0-a.1.z 0000200001999990011" << '\n'
- << "//" << '\n'
- << "#define " << mp << "_VERSION $" << v << ".version.project_number$ULL" << '\n'
- << "#define " << mp << "_VERSION_STR \"$" << v << ".version.project$\"" << '\n'
- << "#define " << mp << "_VERSION_ID \"$" << v << ".version.project_id$\"" << '\n'
- << "#define " << mp << "_VERSION_FULL \"$" << v << ".version$\"" << '\n'
+ << O << "The numeric version format is AAAAABBBBBCCCCCDDDE where:" << '\n'
+ << X << '\n'
+ << X << "AAAAA - major version number" << '\n'
+ << X << "BBBBB - minor version number" << '\n'
+ << X << "CCCCC - bugfix version number" << '\n'
+ << X << "DDD - alpha / beta (DDD + 500) version number" << '\n'
+ << X << "E - final (0) / snapshot (1)" << '\n'
+ << X << '\n'
+ << X << "When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:" << '\n'
+ << X << '\n'
+ << X << "Version AAAAABBBBBCCCCCDDDE" << '\n'
+ << X << '\n'
+ << X << "0.1.0 0000000001000000000" << '\n'
+ << X << "0.1.2 0000000001000020000" << '\n'
+ << X << "1.2.3 0000100002000030000" << '\n'
+ << X << "2.2.0-a.1 0000200001999990010" << '\n'
+ << X << "3.0.0-b.2 0000299999999995020" << '\n'
+ << X << "2.2.0-a.1.z 0000200001999990011" << '\n'
+ << Q << '\n'
+ << "#define " << mx << "_VERSION $" << v << ".version.project_number$ULL" << '\n'
+ << "#define " << mx << "_VERSION_STR \"$" << v << ".version.project$\"" << '\n'
+ << "#define " << mx << "_VERSION_ID \"$" << v << ".version.project_id$\"" << '\n'
+ << "#define " << mx << "_VERSION_FULL \"$" << v << ".version$\"" << '\n'
<< '\n'
- << "#define " << mp << "_VERSION_MAJOR $" << v << ".version.major$" << '\n'
- << "#define " << mp << "_VERSION_MINOR $" << v << ".version.minor$" << '\n'
- << "#define " << mp << "_VERSION_PATCH $" << v << ".version.patch$" << '\n'
+ << "#define " << mx << "_VERSION_MAJOR $" << v << ".version.major$" << '\n'
+ << "#define " << mx << "_VERSION_MINOR $" << v << ".version.minor$" << '\n'
+ << "#define " << mx << "_VERSION_PATCH $" << v << ".version.patch$" << '\n'
<< '\n'
- << "#define " << mp << "_PRE_RELEASE $" << v << ".version.pre_release$" << '\n'
+ << "#define " << mx << "_PRE_RELEASE $" << v << ".version.pre_release$" << '\n'
<< '\n'
- << "#define " << mp << "_SNAPSHOT_SN $" << v << ".version.snapshot_sn$ULL" << '\n'
- << "#define " << mp << "_SNAPSHOT_ID \"$" << v << ".version.snapshot_id$\"" << '\n';
+ << "#define " << mx << "_SNAPSHOT_SN $" << v << ".version.snapshot_sn$ULL" << '\n'
+ << "#define " << mx << "_SNAPSHOT_ID \"$" << v << ".version.snapshot_id$\"" << '\n';
os.close ();
}
@@ -2557,8 +2576,8 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
if (!binless)
os << '\n'
- << "{hbmia obja}{*}: " << mc << ".poptions += -D" << mp << "_STATIC_BUILD" << '\n'
- << "{hbmis objs}{*}: " << mc << ".poptions += -D" << mp << "_SHARED_BUILD" << '\n';
+ << "{hbmia obja}{*}: " << mc << ".poptions += -D" << mx << "_STATIC_BUILD" << '\n'
+ << "{hbmis objs}{*}: " << mc << ".poptions += -D" << mx << "_SHARED_BUILD" << '\n';
// Export.
//
@@ -2578,8 +2597,8 @@ cmd_new (cmd_new_options&& o, cli::group_scanner& args)
if (!binless)
os << '\n'
- << "liba{" << s << "}: " << mc << ".export.poptions += -D" << mp << "_STATIC" << '\n'
- << "libs{" << s << "}: " << mc << ".export.poptions += -D" << mp << "_SHARED" << '\n';
+ << "liba{" << s << "}: " << mc << ".export.poptions += -D" << mx << "_STATIC" << '\n'
+ << "libs{" << s << "}: " << mc << ".export.poptions += -D" << mx << "_SHARED" << '\n';
// Library versioning.
//