diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bootstrap.cc | 17 | ||||
| -rw-r--r-- | src/configure.cc | 35 | ||||
| -rw-r--r-- | src/ctor.h | 2 | ||||
| -rw-r--r-- | src/task_cc.cc | 26 | ||||
| -rw-r--r-- | src/task_ld.cc | 9 | ||||
| -rw-r--r-- | src/task_so.cc | 5 | 
6 files changed, 92 insertions, 2 deletions
| diff --git a/src/bootstrap.cc b/src/bootstrap.cc index be1b5ed..836504e 100644 --- a/src/bootstrap.cc +++ b/src/bootstrap.cc @@ -82,6 +82,23 @@ std::string ctor::configuration::get(const std::string& key, const std::string&  	return default_value;  } +std::string ctor::configuration::getenv(const std::string& key) const +{ +	auto envit = env.find(key); +	if(envit != env.end()) +	{ +		return envit->second; +	} + +	auto env = std::getenv(key.data()); +	if(env) +	{ +		return env; +	} + +	return {}; +} +  std::vector<std::string> readDeps(const std::string& depFile,                                    ctor::toolchain toolchain)  { diff --git a/src/configure.cc b/src/configure.cc index 7a68f03..ff4f24d 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -99,6 +99,23 @@ std::string ctor::configuration::get(const std::string& key, const std::string&  	return default_value;  } +std::string ctor::configuration::getenv(const std::string& key) const +{ +	auto envit = env.find(key); +	if(envit != env.end()) +	{ +		return envit->second; +	} + +	auto sysenv = std::getenv(key.data()); +	if(sysenv) +	{ +		return sysenv; +	} + +	return {}; +} +  class Args  	: public std::vector<char*>  { @@ -838,12 +855,24 @@ int configure(const ctor::settings& global_settings, int argc, char* argv[])  		env["CC"] = cc_env;  	} +	auto cflags_env = getenv("CFLAGS"); +	if(cflags_env) +	{ +		env["CFLAGS"] = cflags_env; +	} +  	auto cxx_env = getenv("CXX");  	if(cxx_env)  	{  		env["CXX"] = cxx_env;  	} +	auto cxxflags_env = getenv("CXXFLAGS"); +	if(cxxflags_env) +	{ +		env["CXXFLAGS"] = cxxflags_env; +	} +  	auto ar_env = getenv("AR");  	if(ar_env)  	{ @@ -856,6 +885,12 @@ int configure(const ctor::settings& global_settings, int argc, char* argv[])  		env["LD"] = ld_env;  	} +	auto ldflags_env = getenv("LDFLAGS"); +	if(ldflags_env) +	{ +		env["LDFLAGS"] = ldflags_env; +	} +  	auto path_env = getenv("PATH");  	if(path_env)  	{ @@ -292,6 +292,8 @@ struct configuration  	ctor::arch build_arch{ctor::arch::unknown};  	std::vector<std::string> args; // vector of arguments used when last calling configure + +	std::string getenv(const std::string& key) const;  	std::map<std::string, std::string> env; // env used when last calling configure  	std::map<std::string, std::string> tools; // tools diff --git a/src/task_cc.cc b/src/task_cc.cc index b9edcf7..97e99af 100644 --- a/src/task_cc.cc +++ b/src/task_cc.cc @@ -191,7 +191,33 @@ int TaskCC::runInner()  		std::cout << output << std::flush;  	} +	auto toolchain = getToolChain(config.system);  	const auto& cfg = ctor::get_configuration(); +	switch(sourceLanguage()) +	{ +	case ctor::language::c: +		{ +			auto cflags = cfg.getenv("CFLAGS"); +			if(!cflags.empty()) +			{ +				append(args, c_option(toolchain, ctor::c_opt::custom, cflags)); +			} +		} +		break; +	case ctor::language::cpp: +		{ +			auto cxxflags = cfg.getenv("CXXFLAGS"); +			if(!cxxflags.empty()) +			{ +				append(args, cxx_option(toolchain, ctor::cxx_opt::custom, cxxflags)); +			} +		} +		break; +	case ctor::language::automatic: +	case ctor::language::assembler: +		// Only c/c++ handled by this task type. +		break; +	}  	auto res = execute(settings, compiler(), args, cfg.env);  	if(res != 0)  	{ diff --git a/src/task_ld.cc b/src/task_ld.cc index 69c3a8a..03745be 100644 --- a/src/task_ld.cc +++ b/src/task_ld.cc @@ -128,8 +128,13 @@ int TaskLD::runInner()  	}  	auto tool = compiler(); -	const auto& c = ctor::get_configuration(); -	auto res = execute(settings, tool, args, c.env, is_self); +	const auto& cfg = ctor::get_configuration(); +	auto ldflags = cfg.getenv("LDFLAGS"); +	if(!ldflags.empty()) +	{ +		append(args, ld_option(toolchain, ctor::ld_opt::custom, ldflags)); +	} +	auto res = execute(settings, tool, args, cfg.env, is_self);  	if(res != 0)  	{  		std::filesystem::remove(targetFile()); diff --git a/src/task_so.cc b/src/task_so.cc index c98e4a7..92aeefe 100644 --- a/src/task_so.cc +++ b/src/task_so.cc @@ -116,6 +116,11 @@ int TaskSO::runInner()  	auto tool = compiler();  	const auto& cfg = ctor::get_configuration(); +	auto ldflags = cfg.getenv("LDFLAGS"); +	if(!ldflags.empty()) +	{ +		append(args, ld_option(toolchain, ctor::ld_opt::custom, ldflags)); +	}  	auto res = execute(settings, tool, args, cfg.env);  	if(res != 0)  	{ | 
