diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | libcppbuild.cc | 66 | ||||
| -rw-r--r-- | subdir/cppbuild.cc | 125 | ||||
| -rw-r--r-- | subdir/cppbuild2.cc | 125 | ||||
| -rw-r--r-- | task_cc.cc | 5 | ||||
| -rw-r--r-- | task_cc.h | 2 | 
6 files changed, 172 insertions, 155 deletions
| @@ -19,8 +19,8 @@ CXXFLAGS = -g -O3 -std=c++17 -I.  libcppbuild.a: $(OBJ)  	ar rcs $@ $(OBJ) -cppbuild: cppbuild.cc libcppbuild.a -	g++ $(CXXFLAGS) -pthread cppbuild.cc libcppbuild.a -o $@ +cppbuild: cppbuild.cc subdir/cppbuild.cc libcppbuild.a +	g++ $(CXXFLAGS) -pthread cppbuild.cc subdir/cppbuild.cc libcppbuild.a -o $@  clean:  	rm -f libcppbuild.a $(OBJ) cppbuild diff --git a/libcppbuild.cc b/libcppbuild.cc index d58705d..f641a90 100644 --- a/libcppbuild.cc +++ b/libcppbuild.cc @@ -10,6 +10,7 @@  #include <algorithm>  #include <list>  #include <array> +#include <deque>  #include <getoptpp/getoptpp.hpp> @@ -26,7 +27,8 @@  using namespace std::chrono_literals;  std::list<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config, -                                             const Settings& settings) +                                             const Settings& settings, +                                             const std::string& sourceDir)  {  	std::filesystem::path targetFile(config.target); @@ -34,7 +36,8 @@ std::list<std::shared_ptr<Task>> taskFactory(const BuildConfiguration& config,  	std::list<std::shared_ptr<Task>> tasks;  	for(const auto& file : config.sources)  	{ -		tasks.emplace_back(std::make_shared<TaskCC>(config, settings, file)); +		tasks.emplace_back(std::make_shared<TaskCC>(config, settings, +		                                            sourceDir, file));  		objects.push_back(tasks.back()->target());  	} @@ -93,8 +96,7 @@ std::array<Config, 100> configFiles;  int numConfigFiles{0};  // TODO: Use c++20 when ready, somehing like this: -//void reg(const std::source_location location = -//         std::source_location::current()) +//int reg(const std::source_location location = std::source_location::current())  int reg(const char* location,          std::vector<BuildConfiguration> (*cb)())  { @@ -105,7 +107,7 @@ int reg(const char* location,  	return 0;  } -void recompileCheck(int argc, char* argv[]) +void recompileCheck(const Settings& settings, int argc, char* argv[])  {  	bool dirty{false}; @@ -117,11 +119,18 @@ void recompileCheck(int argc, char* argv[])  	std::filesystem::path binFile("cppbuild"); -	std::cout << "Recompile check (" << numConfigFiles << "):\n"; +	if(settings.verbose > 1) +	{ +		std::cout << "Recompile check (" << numConfigFiles << "):\n"; +	} +  	for(int i = 0; i < numConfigFiles; ++i)  	{  		std::string location = configFiles[i].file; -		std::cout << " - " << location << "\n"; +		if(settings.verbose > 1) +		{ +			std::cout << " - " << location << "\n"; +		}  		std::filesystem::path configFile(location);  		if(std::filesystem::last_write_time(binFile) <=  		   std::filesystem::last_write_time(configFile)) @@ -163,21 +172,17 @@ void recompileCheck(int argc, char* argv[])  int main(int argc, char* argv[])  { -	recompileCheck(argc, argv); - -	Settings settings; -	// TODO: Set from commandline -	settings.builddir = "build/foo"; +	Settings settings{}; +	settings.builddir = "build/";  	settings.parallel_processes =  		std::max(1u, std::thread::hardware_concurrency() * 2 - 1); -  	settings.verbose = 0;  	dg::Options opt;  	opt.add("jobs", required_argument, 'j', -	        "Number of parallel jobs.", +	        "Number of parallel jobs. (default: cpucount * 2 - 1 )",  	        [&]() {  		        try  		        { @@ -191,8 +196,15 @@ int main(int argc, char* argv[])  		        return 0;  	        }); +	opt.add("build-dir", required_argument, 'b', +	        "Set output directory for build files (default: build).", +	        [&]() { +		        settings.builddir = optarg; +		        return 0; +	        }); +  	opt.add("verbose", no_argument, 'v', -	        "Be verbose.", +	        "Be verbose. Add multiple times for more verbosity.",  	        [&]() {  		        settings.verbose++;  		        return 0; @@ -208,28 +220,32 @@ int main(int argc, char* argv[])  	opt.process(argc, argv); +	recompileCheck(settings, argc, argv); +  	std::filesystem::path builddir(settings.builddir);  	std::filesystem::create_directories(builddir); -	std::vector<BuildConfiguration> build_configs; +	std::deque<BuildConfiguration> build_configs; +	std::list<std::shared_ptr<Task>> tasks;  	for(int i = 0; i < numConfigFiles; ++i)  	{ -		//std::string location = configFiles[i].file; +		std::string path = +			std::filesystem::path(configFiles[i].file).parent_path(); +		if(settings.verbose > 1) +		{ +			std::cout << configFiles[i].file << " in path " << path << "\n"; +		}  		auto configs = configFiles[i].cb();  		for(const auto& config : configs)  		{  			build_configs.push_back(config); +			const auto& build_config = build_configs.back(); +			std::vector<std::string> objects; +			auto t = taskFactory(build_config, settings, path); +			tasks.insert(tasks.end(), t.begin(), t.end());  		}  	} -	std::list<std::shared_ptr<Task>> tasks; -	for(const auto& build_config : build_configs) -	{ -		std::vector<std::string> objects; -		auto t = taskFactory(build_config, settings); -		tasks.insert(tasks.end(), t.begin(), t.end()); -	} -  	for(auto task : tasks)  	{  		task->registerDepTasks(tasks); diff --git a/subdir/cppbuild.cc b/subdir/cppbuild.cc new file mode 100644 index 0000000..808ac41 --- /dev/null +++ b/subdir/cppbuild.cc @@ -0,0 +1,125 @@ +#if 0/* +if [ "cppbuild" -ot "$0" ] +then +	echo "Rebuilding cppbuild" +	g++ -s -O3 -std=c++17 -pthread $0 libcppbuild.a -o cppbuild +	[ $? != 0 ] && exit 1 +fi + +echo "Launching cppbuild" +./cppbuild $* +exit $? +*/ +#endif + +#include <vector> +#include <string> +#include <utility> + +#include "../libcppbuild.h" + +/* +Nested build configurations for for example unit-tests in a test folder +#include "test/cppbuild.cc" +*/ + +/* +Glob convenience methods +std::string glob = getFilesInDir(...); +*/ + +/* +Compilation database +https://clang.llvm.org/docs/JSONCompilationDatabase.html +*/ + +/* +En feature mere kunne være: pre-post build hooks +De vil kunne udtrykkes som intra-build dependencies +Og så selvfølgelig med conditions +*/ + +/* +Target som er "shell script" eller sådan noget +så kan man kalde f.eks. imageconvert +*/ + +/* +Compiler selection per-target (for arm cross-compilation) +*/ +namespace +{ +std::vector<BuildConfiguration> myConfigs() +{ +	return +	{ +		{ +			.target = "src.a", +			.sources = { +				"../drumgizmo/src/audiocache.cc", +				"../drumgizmo/src/audiocacheeventhandler.cc", +				"../drumgizmo/src/audiocachefile.cc", +				"../drumgizmo/src/audiocacheidmanager.cc", +				"../drumgizmo/src/audiofile.cc", +				"../drumgizmo/src/audioinputengine.cc", +				"../drumgizmo/src/audioinputenginemidi.cc", +				"../drumgizmo/src/audiooutputengine.cc", +				"../drumgizmo/src/bytesizeparser.cc", +				"../drumgizmo/src/channel.cc", +				"../drumgizmo/src/channelmixer.cc", +				"../drumgizmo/src/configfile.cc", +				"../drumgizmo/src/configparser.cc", +				"../drumgizmo/src/dgxmlparser.cc", +				"../drumgizmo/src/directory.cc", +				"../drumgizmo/src/domloader.cc", +				"../drumgizmo/src/drumgizmo.cc", +				"../drumgizmo/src/drumgizmoconf.cc", +				"../drumgizmo/src/drumkit.cc", +				"../drumgizmo/src/drumkitloader.cc", +				"../drumgizmo/src/events.cc", +				"../drumgizmo/src/events_ds.cc", +				"../drumgizmo/src/inputprocessor.cc", +				"../drumgizmo/src/instrument.cc", +				"../drumgizmo/src/latencyfilter.cc", +				"../drumgizmo/src/midimapparser.cc", +				"../drumgizmo/src/midimapper.cc", +				"../drumgizmo/src/path.cc", +				"../drumgizmo/src/powerlist.cc", +				"../drumgizmo/src/powermap.cc", +				"../drumgizmo/src/powermapfilter.cc", +				"../drumgizmo/src/random.cc", +				"../drumgizmo/src/sample.cc", +				"../drumgizmo/src/sample_selection.cc", +				"../drumgizmo/src/sem.cc", +				"../drumgizmo/src/staminafilter.cc", +				"../drumgizmo/src/thread.cc", +				"../drumgizmo/src/translation.cc", +				"../drumgizmo/src/velocityfilter.cc", +				"../drumgizmo/src/versionstr.cc", +				"../drumgizmo/src/zrwrapper.cc", +			}, +			.depends = {}, +			.cxxflags = { +				"-fPIC", +				"-DUI_X11", +				"-O3", +				"-g", +				"-Wall", +				"-Werror", +				"-std=c++11", +				"-Idrumgizmo/getoptpp", +				"-Idrumgizmo/", +				"-Idrumgizmo/hugin", +				"-Idrumgizmo/plugingui/", +				"-Idrumgizmo/src/", +				"-Idrumgizmo/zita-resampler/libs", +				"-Idrumgizmo/pugixml/src", +			}, +			.cflags = {}, +			.ldflags = {} +		} +	}; +} + +int a = reg(__FILE__, myConfigs); +} diff --git a/subdir/cppbuild2.cc b/subdir/cppbuild2.cc deleted file mode 100644 index 374319d..0000000 --- a/subdir/cppbuild2.cc +++ /dev/null @@ -1,125 +0,0 @@ -#if 0/* -if [ "cppbuild" -ot "$0" ] -then -	echo "Rebuilding cppbuild" -	g++ -s -O3 -std=c++17 -pthread $0 libcppbuild.a -o cppbuild -	[ $? != 0 ] && exit 1 -fi - -echo "Launching cppbuild" -./cppbuild $* -exit $? -*/ -#endif - -#include <vector> -#include <string> -#include <utility> - -#include "../libcppbuild.h" - -/* -Nested build configurations for for example unit-tests in a test folder -#include "test/cppbuild.cc" -*/ - -/* -Glob convenience methods -std::string glob = getFilesInDir(...); -*/ - -/* -Compilation database -https://clang.llvm.org/docs/JSONCompilationDatabase.html -*/ - -/* -En feature mere kunne være: pre-post build hooks -De vil kunne udtrykkes som intra-build dependencies -Og så selvfølgelig med conditions -*/ - -/* -Target som er "shell script" eller sådan noget -så kan man kalde f.eks. imageconvert -*/ - -/* -Compiler selection per-target (for arm cross-compilation) -*/ -namespace -{ -std::vector<BuildConfiguration> myConfigs() -{ -	return -	{ -		{ -			.target = "src.a", -			.sources = { -				"drumgizmo/src/audiocache.cc", -				"drumgizmo/src/audiocacheeventhandler.cc", -				"drumgizmo/src/audiocachefile.cc", -				"drumgizmo/src/audiocacheidmanager.cc", -				"drumgizmo/src/audiofile.cc", -				"drumgizmo/src/audioinputengine.cc", -				"drumgizmo/src/audioinputenginemidi.cc", -				"drumgizmo/src/audiooutputengine.cc", -				"drumgizmo/src/bytesizeparser.cc", -				"drumgizmo/src/channel.cc", -				"drumgizmo/src/channelmixer.cc", -				"drumgizmo/src/configfile.cc", -				"drumgizmo/src/configparser.cc", -				"drumgizmo/src/dgxmlparser.cc", -				"drumgizmo/src/directory.cc", -				"drumgizmo/src/domloader.cc", -				"drumgizmo/src/drumgizmo.cc", -				"drumgizmo/src/drumgizmoconf.cc", -				"drumgizmo/src/drumkit.cc", -				"drumgizmo/src/drumkitloader.cc", -				"drumgizmo/src/events.cc", -				"drumgizmo/src/events_ds.cc", -				"drumgizmo/src/inputprocessor.cc", -				"drumgizmo/src/instrument.cc", -				"drumgizmo/src/latencyfilter.cc", -				"drumgizmo/src/midimapparser.cc", -				"drumgizmo/src/midimapper.cc", -				"drumgizmo/src/path.cc", -				"drumgizmo/src/powerlist.cc", -				"drumgizmo/src/powermap.cc", -				"drumgizmo/src/powermapfilter.cc", -				"drumgizmo/src/random.cc", -				"drumgizmo/src/sample.cc", -				"drumgizmo/src/sample_selection.cc", -				"drumgizmo/src/sem.cc", -				"drumgizmo/src/staminafilter.cc", -				"drumgizmo/src/thread.cc", -				"drumgizmo/src/translation.cc", -				"drumgizmo/src/velocityfilter.cc", -				"drumgizmo/src/versionstr.cc", -				"drumgizmo/src/zrwrapper.cc", -			}, -			.depends = {}, -			.cxxflags = { -				"-fPIC", -				"-DUI_X11", -				"-O3", -				"-g", -				"-Wall", -				"-Werror", -				"-std=c++11", -				"-Idrumgizmo/getoptpp", -				"-Idrumgizmo/", -				"-Idrumgizmo/hugin", -				"-Idrumgizmo/plugingui/", -				"-Idrumgizmo/src/", -				"-Idrumgizmo/zita-resampler/libs", -				"-Idrumgizmo/pugixml/src", -			}, -			.cflags = {}, -			.ldflags = {} -		} -	}; -} - -int a = reg(__FILE__, myConfigs); -} @@ -84,12 +84,13 @@ std::vector<std::string> readDeps(const std::string& depFile)  } // namespace ::  TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings, -               const std::string& source) +               const std::string& sourceDir, const std::string& source)  	: Task({})  	, config(config)  	, settings(settings)  { -	sourceFile = source; +	sourceFile = sourceDir; +	sourceFile /= source;  	targetFile = settings.builddir / sourceFile.stem();  	targetFile += ".o"; @@ -17,7 +17,7 @@ class TaskCC  public:  	TaskCC(const BuildConfiguration& config,  	       const Settings& settings, -	       const std::string& source); +	       const std::string& sourceDir, const std::string& source);  	bool dirtyInner() override; | 
