diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-25 11:06:50 +0200 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-09-25 11:14:36 +0200 | 
| commit | 019ee9f3026a419cd25916974d32fe1ebcff9578 (patch) | |
| tree | 0e4edbdc40db6cff21d85613decb176ad2dd5378 /src | |
| parent | dcd084fa4abcde59d8e69c3fd24ec8685ad5065c (diff) | |
Add support for (optionally) explicitly declaring source language type in build configurations.
Diffstat (limited to 'src')
| -rw-r--r-- | src/libctor.h | 18 | ||||
| -rw-r--r-- | src/task_ar.cc | 2 | ||||
| -rw-r--r-- | src/task_cc.cc | 66 | ||||
| -rw-r--r-- | src/task_cc.h | 2 | ||||
| -rw-r--r-- | src/task_ld.cc | 2 | ||||
| -rw-r--r-- | src/task_so.cc | 2 | 
6 files changed, 71 insertions, 21 deletions
diff --git a/src/libctor.h b/src/libctor.h index 6903c6b..6026ffb 100644 --- a/src/libctor.h +++ b/src/libctor.h @@ -33,13 +33,27 @@ enum class OutputSystem  	Build, // Internal tool during cross-compilation  }; +struct Source +{ +	Source(const char* file) +		: file(file) {} +	Source(const std::string& file) +		: file(file) {} +	Source(const char* file, Language language) +		: file(file), language(language) {} +	Source(const std::string& file, Language language) +		: file(file), language(language) {} + +	std::string file; +	Language language{Language::Auto}; +}; +  struct BuildConfiguration  {  	TargetType type{TargetType::Auto}; -	Language language{Language::Auto};  	OutputSystem system{OutputSystem::Host};  	std::string target; -	std::vector<std::string> sources; // source list +	std::vector<Source> sources; // source list  	std::vector<std::string> depends; // internal dependencies  	std::vector<std::string> cxxflags; // flags for c++ compiler  	std::vector<std::string> cflags; // flags for c compiler diff --git a/src/task_ar.cc b/src/task_ar.cc index e920571..d767912 100644 --- a/src/task_ar.cc +++ b/src/task_ar.cc @@ -58,7 +58,7 @@ TaskAR::TaskAR(const BuildConfiguration& config,  	source_language = Language::C;  	for(const auto& source : config.sources)  	{ -		std::filesystem::path sourceFile(source); +		std::filesystem::path sourceFile(source.file);  		if(sourceFile.extension().string() != ".c")  		{  			source_language = Language::Cpp; diff --git a/src/task_cc.cc b/src/task_cc.cc index 8256c70..eb361cb 100644 --- a/src/task_cc.cc +++ b/src/task_cc.cc @@ -5,6 +5,7 @@  #include <iostream>  #include <fstream> +#include <cassert>  #include "libctor.h"  #include "settings.h" @@ -84,30 +85,75 @@ std::vector<std::string> readDeps(const std::string& depFile)  	return output;  } + +Language languageFromExtension(const std::filesystem::path& file) +{ +	auto ext = file.extension().string(); +	if(ext == ".c") +	{ +		return Language::C; +	} + +	if(ext == ".C" || +	   ext == ".cc" || +	   ext == ".cpp" || +	   ext == ".CPP" || +	   ext == ".c++" || +	   ext == ".cp" || +	   ext == ".cxx") +	{ +		return Language::Cpp; +	} + +	if(ext == ".s" || +	   ext == ".S" || +	   ext == ".asm") +	{ +		return Language::Asm; +	} + +	std::cerr << "Could not deduce language from " << file.string() << "\n"; +	exit(1); +	return {}; +}  } // namespace ::  TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings, -               const std::string& sourceDir, const std::string& source) +               const std::string& sourceDir, const Source& source)  	: Task(config)  	, config(config)  	, settings(settings)  	, sourceDir(sourceDir)  {  	sourceFile = sourceDir; -	sourceFile /= source; +	sourceFile /= source.file;  	std::filesystem::path base = settings.builddir;  	base /= config.target;  	base += "-";  	base += sourceFile.stem(); -	if(sourceFile.extension().string() == ".c") +	target_type = TargetType::Object; +	source_language = source.language; +	if(source_language == Language::Auto)  	{ -		base += "_c"; +		source_language = languageFromExtension(sourceFile);  	} -	else + +	switch(source_language)  	{ +	case Language::C: +		base += "_c"; +		break; +	case Language::Cpp:  		base += "_cc"; +		break; +	case Language::Asm: +		base += "_asm"; +		break; +	case Language::Auto: +		assert(0 && "This should never happen"); +		break;  	}  	targetFile = base; @@ -116,16 +162,6 @@ TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings,  	depsFile += ".d";  	flagsFile = base;  	flagsFile += ".flags"; - -	target_type = TargetType::Object; -	if(sourceFile.extension().string() == ".c") -	{ -		source_language = Language::C; -	} -	else -	{ -		source_language = Language::Cpp; -	}  }  std::string TaskCC::name() const diff --git a/src/task_cc.h b/src/task_cc.h index 10813a7..67d8d45 100644 --- a/src/task_cc.h +++ b/src/task_cc.h @@ -19,7 +19,7 @@ class TaskCC  public:  	TaskCC(const BuildConfiguration& config,  	       const Settings& settings, -	       const std::string& sourceDir, const std::string& source); +	       const std::string& sourceDir, const Source& source);  	std::string name() const override;  	bool dirtyInner() override; diff --git a/src/task_ld.cc b/src/task_ld.cc index 1b5665e..7710bb0 100644 --- a/src/task_ld.cc +++ b/src/task_ld.cc @@ -62,7 +62,7 @@ TaskLD::TaskLD(const BuildConfiguration& config,  	source_language = Language::C;  	for(const auto& source : config.sources)  	{ -		std::filesystem::path sourceFile(source); +		std::filesystem::path sourceFile(source.file);  		if(sourceFile.extension().string() != ".c")  		{  			source_language = Language::Cpp; diff --git a/src/task_so.cc b/src/task_so.cc index 5623bcf..863b80a 100644 --- a/src/task_so.cc +++ b/src/task_so.cc @@ -57,7 +57,7 @@ TaskSO::TaskSO(const BuildConfiguration& config,  	source_language = Language::C;  	for(const auto& source : config.sources)  	{ -		std::filesystem::path sourceFile(source); +		std::filesystem::path sourceFile(source.file);  		if(sourceFile.extension().string() != ".c")  		{  			source_language = Language::Cpp;  | 
