Browse Source

add include, warnings, sanitize, etc. props

rebrand
Martin Dørum 3 years ago
parent
commit
5ef00b9ee8
4 changed files with 107 additions and 47 deletions
  1. 6
    42
      src/CompileStep.cc
  2. 1
    1
      src/main.cc
  3. 93
    0
      src/toolchain.cc
  4. 7
    4
      src/toolchain.h

+ 6
- 42
src/CompileStep.cc View File

@@ -105,30 +105,15 @@ void CompileStep::doWriteCompDB(const std::string &outDir, compdb::Writer &w) {

std::vector<std::string> CompileStep::getPublicLDFlags(const std::string &outDir) {
BBVariables &vars = variables();
auto it = vars.find("ldflags");
if (it == vars.end()) {
return {};
} else {
return it->second;
}
std::vector<std::string> flags;
toolchain::getLDFlags(vars, flags);
return flags;
}

std::vector<std::string> CompileStep::getPublicLDLibs(const std::string &outDir) {
std::vector<std::string> libs;
BBVariables &vars = variables();

auto pkgsIt = vars.find("pkgs");
if (pkgsIt != vars.end()) {
toolchain::getPkgConfigLDLibs(pkgsIt->second, libs);
}

auto libsIt = vars.find("ldlibs");
if (libsIt != vars.end()) {
for (auto &lib: libsIt->second) {
libs.push_back(lib);
}
}

std::vector<std::string> libs;
toolchain::getLDLibs(vars, libs);
return libs;
}

@@ -163,28 +148,7 @@ std::vector<std::string> &CompileStep::flags() {

BBVariables &vars = variables();

auto pkgsIt = vars.find("pkgs");
if (pkgsIt != vars.end()) {
toolchain::getPkgConfigFlags(pkgsIt->second, flags_);
}

std::string cflagsName;
switch (type_) {
case toolchain::FileType::C:
cflagsName = "cflags";
break;
case toolchain::FileType::CXX:
cflagsName = "cxxflags";
break;
}

auto cflagsIt = vars.find(cflagsName);
if (cflagsIt != vars.end()) {
for (auto &flag: cflagsIt->second) {
flags_.push_back(flag);
}
}

toolchain::getFlags(vars, type_, flags_);
hasFlags_ = true;
return flags_;
}

+ 1
- 1
src/main.cc View File

@@ -1,4 +1,4 @@
//#bb ldlibs := -lpthread
//#bb ldlibs := pthread

#include <getopt.h>
#include <string.h>

+ 93
- 0
src/toolchain.cc View File

@@ -122,6 +122,99 @@ std::string targetFilePath(
abort();
}

void getFlags(const BBVariables &vars, FileType type, std::vector<std::string> &flags) {
auto std = vars.find("std");
if (std != vars.end() && std->second.size() > 0) {
flags.push_back("-std=" + std->second[1]);
}

auto pkgs = vars.find("pkgs");
if (pkgs != vars.end()) {
std::vector<std::string> argv;
argv.push_back(getPkgConfig());
argv.push_back("--cflags");
for (auto &pkg: pkgs->second) {
argv.push_back(pkg);
}

// Execute $(PKG_CONFIG) --cflags $(PKGS)
std::string output;
sys::execute(argv, &output, global::verbose >= 2);
parseWhitespaceSeparated(output, flags);
}

auto warnings = vars.find("warnings");
if (warnings != vars.end()) {
for (auto &w: warnings->second) {
flags.push_back("-W" + w);
}
}

auto includes = vars.find("includes");
if (includes != vars.end()) {
for (auto &i: includes->second) {
flags.push_back("-I" + i);
}
}

auto sanitize = vars.find("sanitize");
if (sanitize != vars.end()) {
for (auto &s: sanitize->second) {
flags.push_back("-fsanitize=" + s);
}
}

auto cflags = vars.find(
type == FileType::C ? "cflags" :
type == FileType::CXX ? "cxxflags" :
nullptr);
if (cflags != vars.end()) {
for (auto &f: cflags->second) {
flags.push_back(f);
}
}
}

void getLDLibs(const BBVariables &vars, std::vector<std::string> &flags) {
auto pkgs = vars.find("pkgs");
if (pkgs != vars.end()) {
std::vector<std::string> argv;
argv.push_back(getPkgConfig());
argv.push_back("--libs");
for (auto &pkg: pkgs->second) {
argv.push_back(pkg);
}

// Execute $(PKG_CONFIG) --cflags $(PKGS)
std::string output;
sys::execute(argv, &output, global::verbose >= 2);
parseWhitespaceSeparated(output, flags);
}

auto ldlibs = vars.find("ldlibs");
if (ldlibs != vars.end()) {
for (auto &l: ldlibs->second) {
flags.push_back("-l" + l);
}
}
}

void getLDFlags(const BBVariables &vars, std::vector<std::string> &flags) {
auto sanitize = vars.find("sanitize");
if (sanitize != vars.end()) {
for (auto &s: sanitize->second) {
flags.push_back("-fsanitize=" + s);
}
}

auto ldflags = vars.find("ldflags");
if (ldflags != vars.end()) {
for (auto &f: ldflags->second) {
flags.push_back(f);
}
}
}

void getPkgConfigFlags(const std::vector<std::string> &pkgs, std::vector<std::string> &flags) {
std::vector<std::string> argv;
argv.push_back(getPkgConfig());

+ 7
- 4
src/toolchain.h View File

@@ -3,13 +3,15 @@
#include <vector>
#include <string>

#include "BBParser.h"

namespace toolchain {

enum FileType {
enum class FileType {
C, CXX,
};

enum TargetType {
enum class TargetType {
BINARY,
SHARED_LIBRARY,
STATIC_LIBRARY,
@@ -21,8 +23,9 @@ std::string targetFilePath(
const std::string &path,
const std::string &outDir);

void getPkgConfigFlags(const std::vector<std::string> &pkgs, std::vector<std::string> &flags);
void getPkgConfigLDLibs(const std::vector<std::string> &pkgs, std::vector<std::string> &flags);
void getFlags(const BBVariables &vars, FileType type, std::vector<std::string> &flags);
void getLDLibs(const BBVariables &vars, std::vector<std::string> &flags);
void getLDFlags(const BBVariables &vars, std::vector<std::string> &flags);

std::vector<std::string> getDependencies(
const std::vector<std::string> &flags,

Loading…
Cancel
Save