diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libctor.cc | 5 | ||||
| -rw-r--r-- | src/libctor.h | 16 | ||||
| -rw-r--r-- | src/rebuild.cc | 54 | ||||
| -rw-r--r-- | src/rebuild.h | 9 | ||||
| -rw-r--r-- | src/task_ar.cc | 4 | ||||
| -rw-r--r-- | src/tasks.cc | 47 | 
6 files changed, 129 insertions, 6 deletions
| diff --git a/src/libctor.cc b/src/libctor.cc index ca60de2..0ec6c6c 100644 --- a/src/libctor.cc +++ b/src/libctor.cc @@ -185,6 +185,11 @@ Options:  			files.insert(configFiles[i].file);  		} +		for(std::size_t i = 0; i < numExternalConfigFiles; ++i) +		{ +			files.insert(externalConfigFiles[i].file); +		} +  		for(const auto& file : files)  		{  			std::cout << file << "\n"; diff --git a/src/libctor.h b/src/libctor.h index 5c22614..2a10c53 100644 --- a/src/libctor.h +++ b/src/libctor.h @@ -51,17 +51,31 @@ struct BuildConfiguration  	OutputSystem system{OutputSystem::Host};  	std::string target; // Output target file for this configuration  	std::vector<Source> sources; // source list -	std::vector<std::string> depends; // internal dependencies +	std::vector<std::string> depends; // internal target dependencies  	std::vector<std::string> cxxflags; // flags for c++ compiler  	std::vector<std::string> cflags; // flags for c compiler  	std::vector<std::string> ldflags; // flags for linker  	std::vector<std::string> asmflags; // flags for asm translator +	std::vector<std::string> externals; // externals used by this configuration  };  using BuildConfigurations = std::vector<BuildConfiguration>;  int reg(const char* location, BuildConfigurations (*cb)()); +struct ExternalConfiguration +{ +	std::string name; // Name for configuration +	std::vector<std::string> cxxflags; // flags for c++ compiler +	std::vector<std::string> cflags; // flags for c compiler +	std::vector<std::string> ldflags; // flags for linker +	std::vector<std::string> asmflags; // flags for asm translator +}; + +using ExternalConfigurations = std::vector<ExternalConfiguration>; + +int reg(const char* location, ExternalConfigurations (*cb)()); +  // Convenience macro - ugly but keeps things simple(r)  #define CONCAT(a, b) CONCAT_INNER(a, b)  #define CONCAT_INNER(a, b) a ## b diff --git a/src/rebuild.cc b/src/rebuild.cc index c1f2a4a..3492955 100644 --- a/src/rebuild.cc +++ b/src/rebuild.cc @@ -55,9 +55,48 @@ int unreg(const char* location)  		}  	} +	for(std::size_t i = 0; i < numExternalConfigFiles;) +	{ +		if(std::string(location) == externalConfigFiles[i].file) +		{ +			++found; +			for(std::size_t j = i; j < numExternalConfigFiles; ++j) +			{ +				externalConfigFiles[j] = externalConfigFiles[j + 1]; +			} +			--numExternalConfigFiles; +		} +		else +		{ +			++i; +		} +	} +  	return found;  } +std::array<ExternalConfigurationEntry, 1024> externalConfigFiles; +std::size_t numExternalConfigFiles{0}; + +// TODO: Use c++20 when ready, somehing like this: +//int reg(const std::source_location location = std::source_location::current()) +int reg(const char* location, std::vector<ExternalConfiguration> (*cb)()) +{ +	// NOTE: std::cout cannot be used here +	if(numExternalConfigFiles >= externalConfigFiles.size()) +	{ +		fprintf(stderr, "Max %d external configurations currently supported.\n", +		        (int)externalConfigFiles.size()); +		exit(1); +	} + +	externalConfigFiles[numExternalConfigFiles].file = location; +	externalConfigFiles[numExternalConfigFiles].cb = cb; +	++numExternalConfigFiles; + +	return 0; +} +  namespace  {  bool contains(const std::vector<Source>& sources, const std::string& file) @@ -130,6 +169,21 @@ void recompileCheck(const Settings& global_settings, int argc, char* argv[],  		}  	} +	for(std::size_t i = 0; i < numExternalConfigFiles; ++i) +	{ +		std::string location = externalConfigFiles[i].file; +		if(global_settings.verbose > 1) +		{ +			std::cout << " - " << location << "\n"; +		} + +		// Ensure that files containing multiple configurations are only added once. +		if(!contains(config.sources, location)) +		{ +			config.sources.push_back(location); +		} +	} +  	auto tasks = taskFactory({config}, settings, {});  	for(auto task : tasks) diff --git a/src/rebuild.h b/src/rebuild.h index 906d089..ae3e408 100644 --- a/src/rebuild.h +++ b/src/rebuild.h @@ -16,9 +16,18 @@ struct BuildConfigurationEntry  	std::vector<BuildConfiguration> (*cb)();  }; +struct ExternalConfigurationEntry +{ +	const char* file; +	std::vector<ExternalConfiguration> (*cb)(); +}; +  extern std::array<BuildConfigurationEntry, 1024> configFiles;  extern std::size_t numConfigFiles; +extern std::array<ExternalConfigurationEntry, 1024> externalConfigFiles; +extern std::size_t numExternalConfigFiles; +  //int reg(const char* location, std::vector<BuildConfiguration> (*cb)());  int unreg(const char* location); diff --git a/src/task_ar.cc b/src/task_ar.cc index fdd29b1..9658953 100644 --- a/src/task_ar.cc +++ b/src/task_ar.cc @@ -107,10 +107,6 @@ int TaskAR::runInner()  	{  		args.push_back(objectFile.string());  	} -	for(const auto& flag : config.ldflags) -	{ -		args.push_back(flag); -	}  	{ // Write flags to file.  		std::ofstream flagsStream(flagsFile); diff --git a/src/tasks.cc b/src/tasks.cc index 56988f9..8efc98e 100644 --- a/src/tasks.cc +++ b/src/tasks.cc @@ -23,6 +23,17 @@ const std::deque<Target>& getTargets(const Settings& settings)  	static std::deque<Target> targets;  	if(!initialised)  	{ + +		// Generate externals +		std::vector<ExternalConfiguration> externalConfigs; +		for(std::size_t i = 0; i < numExternalConfigFiles; ++i) +		{ +			auto newExternalConfigs = externalConfigFiles[i].cb(); +			externalConfigs.insert(externalConfigs.end(), +			                       newExternalConfigs.begin(), +			                       newExternalConfigs.end()); +		} +  		for(std::size_t i = 0; i < numConfigFiles; ++i)  		{  			std::string path = @@ -32,8 +43,42 @@ const std::deque<Target>& getTargets(const Settings& settings)  				std::cout << configFiles[i].file << " in path " << path << "\n";  			}  			auto configs = configFiles[i].cb(); -			for(const auto& config : configs) +			for(auto& config : configs)  			{ + + +				// Resolv config externals +				for(const auto& external : config.externals) +				{ +					bool found{false}; +					for(const auto& externalConfig : externalConfigs) +					{ +						if(externalConfig.name == external) +						{ +							found = true; +							config.cflags.insert(config.cflags.end(), +							                     externalConfig.cflags.begin(), +							                     externalConfig.cflags.end()); +							config.cxxflags.insert(config.cxxflags.end(), +							                     externalConfig.cxxflags.begin(), +							                     externalConfig.cxxflags.end()); +							config.ldflags.insert(config.ldflags.end(), +							                     externalConfig.ldflags.begin(), +							                     externalConfig.ldflags.end()); +							config.asmflags.insert(config.asmflags.end(), +							                     externalConfig.asmflags.begin(), +							                     externalConfig.asmflags.end()); +						} +					} +					if(!found) +					{ +						std::cout << "External '" << external << "' not found.\n"; +						exit(1); +					} + +				} + +  				targets.push_back({config, path});  			}  		} | 
