diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rwxr-xr-x | bootstrap.sh | 7 | ||||
| -rw-r--r-- | libcppbuild.cc | 92 | 
3 files changed, 90 insertions, 13 deletions
@@ -24,8 +24,8 @@ CXXFLAGS = -g -O3 -std=c++17 -I.  libcppbuild.a: $(OBJ)  	ar rcs $@ $(OBJ) -cppbuild: cppbuild.cc subdir/cppbuild.cc libcppbuild.a -	g++ $(CXXFLAGS) -pthread cppbuild.cc subdir/cppbuild.cc libcppbuild.a -o $@ +cppbuild: libcppbuild.a +	g++ $(CXXFLAGS) -pthread libcppbuild.a -o $@  clean:  	rm -f libcppbuild.a $(OBJ) cppbuild $(DEPFILES) diff --git a/bootstrap.sh b/bootstrap.sh index 0172c10..29b422b 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,7 +1,2 @@  #!/bin/bash -CFGS="\ -  cppbuild.cc \ -  subdir/cppbuild.cc \ -" - -g++ -std=c++17 $CFGS -pthread libcppbuild.a -o cppbuild +g++ -std=c++17 -pthread libcppbuild.a -o cppbuild diff --git a/libcppbuild.cc b/libcppbuild.cc index 5e63029..7280910 100644 --- a/libcppbuild.cc +++ b/libcppbuild.cc @@ -12,6 +12,7 @@  #include <array>  #include <deque>  #include <fstream> +#include <set>  #include <getoptpp/getoptpp.hpp> @@ -147,7 +148,7 @@ struct BuildConfigurationEntry  	std::vector<BuildConfiguration> (*cb)();  };  std::array<BuildConfigurationEntry, 1024> configFiles; -int numConfigFiles{0}; +std::size_t numConfigFiles{0};  }  // TODO: Use c++20 when ready, somehing like this: @@ -165,12 +166,37 @@ int reg(const char* location, std::vector<BuildConfiguration> (*cb)())  	configFiles[numConfigFiles].file = location;  	configFiles[numConfigFiles].cb = cb;  	++numConfigFiles; +  	return 0;  } -void recompileCheck(const Settings& settings, int argc, char* argv[]) +int unreg(const char* location)  { -	bool dirty{false}; +	std::size_t found{0}; +	for(std::size_t i = 0; i < numConfigFiles;) +	{ +		if(std::string(location) == configFiles[i].file) +		{ +			++found; +			for(std::size_t j = i; j < numConfigFiles; ++j) +			{ +				configFiles[j] = configFiles[j + 1]; +			} +			--numConfigFiles; +		} +		else +		{ +			++i; +		} +	} + +	return found; +} + +void recompileCheck(const Settings& settings, int argc, char* argv[], +                    bool force = false) +{ +	bool dirty{force};  	std::vector<std::string> args;  	args.push_back("-s"); @@ -203,7 +229,7 @@ void recompileCheck(const Settings& settings, int argc, char* argv[])  		std::cout << "Recompile check (" << numConfigFiles << "):\n";  	} -	for(int i = 0; i < numConfigFiles; ++i) +	for(std::size_t i = 0; i < numConfigFiles; ++i)  	{  		std::string location = configFiles[i].file;  		if(settings.verbose > 1) @@ -254,7 +280,7 @@ std::list<std::shared_ptr<Task>> getTasks(const Settings& settings)  {  	static std::deque<BuildConfiguration> build_configs;  	std::list<std::shared_ptr<Task>> tasks; -	for(int i = 0; i < numConfigFiles; ++i) +	for(std::size_t i = 0; i < numConfigFiles; ++i)  	{  		std::string path =  			std::filesystem::path(configFiles[i].file).parent_path(); @@ -410,6 +436,9 @@ int main(int argc, char* argv[])  	std::string compilation_database;  	bool print_configure_cmd{false};  	bool print_configure_db{false}; +	std::vector<std::string> add_files; +	std::vector<std::string> remove_files; +	bool list_files{false};  	dg::Options opt;  	int key{256}; @@ -444,6 +473,27 @@ int main(int argc, char* argv[])  		        return 0;  	        }); +	opt.add("add", required_argument, 'a', +	        "Add specified file to the build configurations.", +	        [&]() { +		        add_files.push_back(optarg); +		        return 0; +	        }); + +	opt.add("remove", required_argument, 'r', +	        "Remove specified file from the build configurations.", +	        [&]() { +		        remove_files.push_back(optarg); +		        return 0; +	        }); + +	opt.add("list", no_argument, 'l', +	        "List files in the build configurations.", +	        [&]() { +		        list_files = true; +		        return 0; +	        }); +  	opt.add("configure-cmd", no_argument, key++,  	        "Print commandline for last configure.",  	        [&]() { @@ -477,6 +527,38 @@ int main(int argc, char* argv[])  	opt.process(argc, argv); +	if(list_files) +	{ +		std::set<std::string> files; +		for(std::size_t i = 0; i < numConfigFiles; ++i) +		{ +			files.insert(configFiles[i].file); +		} + +		for(const auto& file : files) +		{ +			std::cout << file << "\n"; +		} + +		return 0; +	} + +	if(!add_files.empty() || !remove_files.empty()) +	{ +		for(const auto& add_file : add_files) +		{ +			reg(add_file.data(), [](){ return std::vector<BuildConfiguration>{};}); +		} + +		for(const auto& remove_file : remove_files) +		{ +			unreg(remove_file.data()); +		} + +		// Force rebuild if files were added +		recompileCheck(settings, 1, argv, true); +	} +  	recompileCheck(settings, argc, argv);  	std::filesystem::path builddir(settings.builddir);  | 
