diff options
| -rw-r--r-- | Makefile | 5 | ||||
| -rw-r--r-- | cppbuild.cc | 8 | ||||
| -rw-r--r-- | execute.cc | 76 | ||||
| -rw-r--r-- | execute.h | 9 | ||||
| -rw-r--r-- | libcppbuild.h | 2 | ||||
| -rw-r--r-- | task_cc.cc | 83 | ||||
| -rw-r--r-- | task_ld.cc | 26 | 
7 files changed, 117 insertions, 92 deletions
| @@ -1,10 +1,11 @@  all: libcppbuild.a cppbuild -libcppbuild.a: libcppbuild.cc libcppbuild.h task_cc.cc task_cc.h task_ld.cc task_ld.h task.h +libcppbuild.a: libcppbuild.cc libcppbuild.h task_cc.cc task_cc.h task_ld.cc task_ld.h task.h execute.cc execute.h  	g++ -g -std=c++17  libcppbuild.cc -c -o libcppbuild.o  	g++ -g -std=c++17  task_cc.cc -c -o task_cc.o  	g++ -g -std=c++17  task_ld.cc -c -o task_ld.o -	ar rcs libcppbuild.a libcppbuild.o task_cc.o task_ld.o +	g++ -g -std=c++17  execute.cc -c -o execute.o +	ar rcs libcppbuild.a libcppbuild.o task_cc.o task_ld.o execute.o  cppbuild: cppbuild.cc  libcppbuild.h libcppbuild.a  	g++ -g -std=c++17 cppbuild.cc libcppbuild.a -pthread -o cppbuild diff --git a/cppbuild.cc b/cppbuild.cc index ae6fd8d..3604260 100644 --- a/cppbuild.cc +++ b/cppbuild.cc @@ -161,6 +161,12 @@ BuildConfiguration configs()  		},  		// linker flags -		"-lm -lX11 -lXext -pthread -lsndfile", +		{ +			"-lm", +			"-lX11", +			"-lXext", +			"-pthread", +			"-lsndfile", +		}  	};  } diff --git a/execute.cc b/execute.cc new file mode 100644 index 0000000..cb96bc5 --- /dev/null +++ b/execute.cc @@ -0,0 +1,76 @@ +#include "execute.h" + +#include <unistd.h> +#include <cstring> +#include <sys/types.h> +#include <sys/wait.h> +#include <spawn.h> +#include <iostream> + +namespace +{ +int parent_waitpid(pid_t pid) +{ +	int status; + +	if(waitpid(pid, &status, 0) != pid) +	{ +		return 1; +	} + +	return status; +} +} // namespace :: + +int execute(const std::string& command, +            const std::vector<std::string>& args, +            bool verbose) +{ +	std::vector<const char*> argv; +	argv.push_back(command.data()); +	for(const auto& arg : args) +	{ +		argv.push_back(arg.data()); +	} +	argv.push_back(nullptr); + +	if(verbose) +	{ +		std::string cmd; +		for(const auto& arg : argv) +		{ +			if(arg == nullptr) +			{ +				break; +			} +			if(!cmd.empty()) +			{ +				cmd += " "; +			} +			cmd += arg; +		} + +		std::cout << cmd << "\n"; +	} + +#if 1 +	auto pid = vfork(); +	if(pid == 0) +	{ +		execv(command.data(), (char**)argv.data()); +	} +	auto ret = parent_waitpid(pid); +#elif 0 +	pid_t pid; +	if(posix_spawn(&pid, command.data(), nullptr, nullptr, +	               (char**)argv.data(), nullptr)) +	{ +		return 1; +	} +	auto ret = parent_waitpid(pid); +#else +	auto ret = system(cmd.data()); +#endif + +	return ret; +} diff --git a/execute.h b/execute.h new file mode 100644 index 0000000..f284230 --- /dev/null +++ b/execute.h @@ -0,0 +1,9 @@ +// -*- c++ -*- +#pragma once + +#include <string> +#include <vector> + +int execute(const std::string& command, +            const std::vector<std::string>& args, +            bool verbose = true); diff --git a/libcppbuild.h b/libcppbuild.h index e4a7801..a7b82d7 100644 --- a/libcppbuild.h +++ b/libcppbuild.h @@ -9,7 +9,7 @@ struct BuildConfiguration  	std::vector<std::string> sources;  	std::vector<std::string> cxxflags;  	std::vector<std::string> cflags; -	std::string ldflags; +	std::vector<std::string> ldflags;  };  BuildConfiguration configs(); @@ -2,14 +2,10 @@  #include <iostream>  #include <fstream> -#include <unistd.h> -#include <cstring> -#include <sys/types.h> -#include <sys/wait.h> -#include <spawn.h>  #include "libcppbuild.h"  #include "settings.h" +#include "execute.h"  namespace  { @@ -148,17 +144,6 @@ bool TaskCC::dirty()  	return false;  } -int parent_waitpid(pid_t pid) -{ -	int status; - -	if(waitpid(pid, &status, 0) != pid) -	{ -		return 1; -	} - -	return status; -}  int TaskCC::run()  {  	if(!std::filesystem::exists(sourceFile)) @@ -174,69 +159,19 @@ int TaskCC::run()  		comp = "/usr/bin/gcc";  		flags = config.cflags;  	} - -	char source[256]; -	strcpy(source, std::string(sourceFile).data()); -	char target[256]; -	strcpy(target, std::string(targetFile).data()); -	char pwd[256]; -	strcpy(pwd, std::string(std::filesystem::current_path()).data()); -	std::vector<const char*> argv; -	//args.push_back("/bin/echo"); -	if(comp == "/usr/bin/gcc") -	{ -		argv.push_back("/usr/bin/gcc"); -	} -	else -	{ -		argv.push_back("/usr/bin/g++"); -	} - -	argv.push_back("-MMD"); -	argv.push_back("-c"); -	argv.push_back(source); -	argv.push_back("-o"); -	argv.push_back(target); +	std::vector<std::string> args; +	args.push_back("-MMD"); +	args.push_back("-c"); +	args.push_back(std::string(sourceFile)); +	args.push_back("-o"); +	args.push_back(std::string(targetFile));  	for(const auto& flag : flags)  	{ -		argv.push_back(flag.data()); -	} - -	std::string cmd; -	for(const auto& arg : argv) -	{ -		if(arg == nullptr) -		{ -			break; -		} -		if(!cmd.empty()) -		{ -			cmd += " "; -		} -		cmd += arg; -	} -	std::cout << cmd << "\n"; - -#if 0 -	auto pid = vfork(); -	if(pid == 0) -	{ -		execv(comp.data(), (char**)argv.data()); -	} -	auto ret = parent_waitpid(pid); -#elif 0 -	pid_t pid; -	if(posix_spawn(&pid, comp.data(), nullptr, nullptr, (char**)argv.data(), nullptr)) -	{ -		return 1;//exit(1); +		args.push_back(flag);  	} -	auto ret = parent_waitpid(pid); -#else -	auto ret = system(cmd.data()); -#endif -	return ret; +	return execute(comp, args);  }  int TaskCC::clean() @@ -2,14 +2,10 @@  #include <iostream>  #include <fstream> -#include <unistd.h> -#include <cstring> -#include <sys/types.h> -#include <sys/wait.h> -#include <spawn.h>  #include "libcppbuild.h"  #include "settings.h" +#include "execute.h"  TaskLD::TaskLD(const BuildConfiguration& config,                 const Settings& settings, @@ -22,8 +18,6 @@ TaskLD::TaskLD(const BuildConfiguration& config,  	targetFile /= target;  	for(const auto& object : objects)  	{ -		//std::filesystem::path objectFile = settings.builddir; -		//objectFile /= object;  		std::filesystem::path objectFile = object;  		objectFiles.push_back(objectFile);  	} @@ -60,15 +54,19 @@ int TaskLD::run()  		objectlist += std::string(objectFile);  	} -	std::string compiler = "g++ " + objectlist + " " + -		config.ldflags + " " + -		"-o " + std::string(targetFile); -	std::cout << compiler << "\n"; -	if(system(compiler.data())) +	std::vector<std::string> args; +	for(const auto& objectFile : objectFiles)  	{ -		return 1; +		args.push_back(std::string(objectFile));  	} -	return 0; +	for(const auto& flag : config.ldflags) +	{ +		args.push_back(flag); +	} +	args.push_back("-o"); +	args.push_back(std::string(targetFile)); + +	return execute("/usr/bin/g++", args);  }  int TaskLD::clean() | 
