diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ctor.h | 2 | ||||
| -rw-r--r-- | src/tasks.cc | 23 | ||||
| -rw-r--r-- | src/util.cc | 61 | ||||
| -rw-r--r-- | src/util.h | 7 | 
4 files changed, 70 insertions, 23 deletions
@@ -24,6 +24,8 @@ enum class target_type  	unit_test,  	unit_test_library,  	function, + +	unknown,  };  enum class language diff --git a/src/tasks.cc b/src/tasks.cc index 67bed2b..b44fce8 100644 --- a/src/tasks.cc +++ b/src/tasks.cc @@ -18,6 +18,7 @@  #include "task_fn.h"  #include "rebuild.h"  #include "configure.h" +#include "util.h"  const std::deque<Target>& getTargets(const ctor::settings& settings,                                       bool resolve_externals) @@ -92,23 +93,9 @@ std::set<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& con  		{  			target_type = ctor::target_type::function;  		} -		else if(targetFile.extension() == ".a") -		{ -			target_type = ctor::target_type::static_library; -		} -		else if(targetFile.extension() == ".so") -		{ -			target_type = ctor::target_type::dynamic_library; -		} -		else if(targetFile.extension() == "") -		{ -			target_type = ctor::target_type::executable; -		}  		else  		{ -			std::cerr << "Could not deduce target type from target " << -				targetFile.string() << " please specify.\n"; -			exit(1); +			target_type = target_type_from_extension(targetFile);  		}  	} @@ -140,6 +127,12 @@ std::set<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& con  		// The target_type cannot be Auto  		break; +	case ctor::target_type::unknown: +		std::cerr << "Could not deduce target type from target " << +			targetFile.string() << " please specify.\n"; +		exit(1); +		break; +  	case ctor::target_type::static_library:  	case ctor::target_type::unit_test_library:  		tasks.insert(std::make_shared<TaskAR>(config, settings, config.target, diff --git a/src/util.cc b/src/util.cc index ee56ede..601fd54 100644 --- a/src/util.cc +++ b/src/util.cc @@ -5,6 +5,15 @@  #include <iostream>  #include <fstream> +#include <algorithm> +#include <cctype> + +std::string to_lower(const std::string& str) +{ +	std::string out{str}; +	std::transform(out.begin(), out.end(), out.begin(), ::tolower); +	return out; +}  std::string readFile(const std::string& fileName)  { @@ -83,15 +92,23 @@ std::vector<std::string> readDeps(const std::string& depFile)  ctor::language languageFromExtension(const std::filesystem::path& file)  {  	auto ext = file.extension().string(); + +	// First a few case sensitive comparisons  	if(ext == ".c")  	{  		return ctor::language::c;  	} -	if(ext == ".C" || -	   ext == ".cc" || +	if(ext == ".C") +	{ +		return ctor::language::cpp; +	} + +	// The rest are compared in lowercase +	ext = to_lower(ext); + +	if(ext == ".cc" ||  	   ext == ".cpp" || -	   ext == ".CPP" ||  	   ext == ".c++" ||  	   ext == ".cp" ||  	   ext == ".cxx") @@ -100,7 +117,6 @@ ctor::language languageFromExtension(const std::filesystem::path& file)  	}  	if(ext == ".s" || -	   ext == ".S" ||  	   ext == ".asm")  	{  		return ctor::language::assembler; @@ -135,3 +151,40 @@ std::string cleanUp(const std::string& path)  	}  	return cleaned;  } + +ctor::target_type target_type_from_extension(const std::filesystem::path& file) +{ +	auto ext = to_lower(file.extension().string()); +	// Loosely based on: +	// https://en.wikipedia.org/wiki/List_of_file_formats#Object_code,_executable_files,_shared_and_dynamically_linked_libraries +	if(ext == ".a" || +	   ext == ".lib") +	{ +		return ctor::target_type::static_library; +	} + +	if(ext == ".so" || +	   ext == ".dll" || +	   ext == ".dylib") +	{ +		return ctor::target_type::dynamic_library; +	} + +	if(ext == ".o" || +	   ext == ".obj") +	{ +		return ctor::target_type::object; +	} + +	if(ext == "" || +	   ext == ".exe" || +	   ext == ".com" || +	   ext == ".bin" || +	   ext == ".run" || +	   ext == ".out") +	{ +		return ctor::target_type::executable; +	} + +	return ctor::target_type::unknown; +} @@ -8,6 +8,8 @@  #include <string>  #include <filesystem> +std::string to_lower(const std::string& str); +  std::string readFile(const std::string& fileName);  std::vector<std::string> readDeps(const std::string& depFile);  ctor::language languageFromExtension(const std::filesystem::path& file); @@ -19,7 +21,4 @@ void append(T& a, const T& b)  	a.insert(a.end(), b.begin(), b.end());  } -//using cxx_flags = std::vector<ctor::cxx_flag>; -//using c_flags = std::vector<std::string>; -//using ld_flags= std::vector<std::string>; -//using asm_flags = std::vector<std::string>; +ctor::target_type target_type_from_extension(const std::filesystem::path& file);  | 
