compilation

This commit is contained in:
2026-02-14 11:35:08 +01:00
parent 6eb984c3b8
commit eba402dc31
7 changed files with 108 additions and 23 deletions

View File

@@ -1 +1 @@
Checks: '*,clang-analyzer-*,-llvmlibc-*,-fuchsia-*,-altera-*,-abseil-*,-android-*,-modernize-use-trailing-return-type,-readability-identifier-length,-*-readability-todo,-*-magic-numbers,-readability-function-cognitive-complexity,-*-easily-swappable-parameters,-*-non-private-member-variables-in-classes,-*-no-recursion'
Checks: '*,clang-analyzer-*,-llvmlibc-*,-fuchsia-*,-altera-*,-abseil-*,-android-*,-modernize-use-trailing-return-type,-readability-identifier-length,-*-readability-todo,-*-magic-numbers,-readability-function-cognitive-complexity,-*-easily-swappable-parameters,-*-non-private-member-variables-in-classes,-*-no-recursion,-concurrency-mt-unsafe'

4
.gitignore vendored
View File

@@ -1,2 +1,4 @@
/.cache
/build
/build
hash.py
docker.sh

View File

@@ -4,4 +4,6 @@ project(shrap)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_executable(${PROJECT_NAME} src/main.cc)
add_executable(${PROJECT_NAME} src/main.cc)
target_link_libraries(${PROJECT_NAME} PRIVATE -static)

View File

@@ -1,18 +1,56 @@
#include "parser.h"
#include "util.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include <sys/stat.h>
#include <thread>
int main() {
if (geteuid() != 0) {
std::cerr << "This program needs to be ran as root.\n";
return 1;
}
mkdir("/tmp/shrap", 0777);
std::ifstream file("zlib.shrap");
if (!file) {
std::cerr << "Error opening file\n";
return 1;
}
std::stringstream buffer;
buffer << file.rdbuf();
Expr pkg = Expr::parse(file);
Expr pkg = Expr::parse(buffer.str());
std::cout << pkg.get("name").value << std::endl;
}
Expr src = pkg.get("src").children[0];
std::string src_type = src.children[0].value;
std::string src_url = src.children[1].value;
std::string src_path = "/tmp/shrap/" + src.children[2].value;
if (src_type == "tar") {
std::string archive_path = "/tmp/shrap/" + Util::basename(src_url);
// TODO: replace wget with a library for zero runtime dependencies
Util::shell_command("wget -O " + archive_path + " " + src_url);
// TODO: check archive hash from src.children[3].value
Util::shell_command("tar xf " + archive_path + " -C /tmp/shrap/");
} else {
std::cerr << "ERROR: unrecognized src type: " << src_type << "\n";
return 1;
}
std::string jobs = std::to_string(std::thread::hardware_concurrency());
for (const auto &step : pkg.get("build").children) {
std::string step_type = step.children[0].value;
if (step_type == "configure_make") {
Util::shell_command("./configure --prefix=/usr", src_path);
Util::shell_command("make -j " + jobs, src_path);
Util::shell_command("make install", src_path);
} else {
std::cerr << "ERROR: unrecognized step type: " << step_type << "\n";
return 1;
}
}
}

View File

@@ -1,7 +1,6 @@
#pragma once
#include <sstream>
#include <string>
#include <istream>
#include <vector>
struct Expr {
@@ -20,19 +19,19 @@ public:
if (child.type == Type::List && child.children.size() >= 2 &&
child.children[0].type == Type::Atom &&
child.children[0].value == key) {
return child.children[1];
Expr result = {.type = Type::List};
result.children.assign(child.children.begin() + 1,
child.children.end());
return result;
}
}
throw std::runtime_error("key not found: " + key);
}
static Expr parse(const std::string &input) {
std::istringstream in(input);
return parse_expr(in);
}
static Expr parse(std::istream &in) { return parse_expr(in); }
private:
static std::string read_atom(std::istringstream &in) {
static std::string read_atom(std::istream &in) {
std::string atom;
while (true) {
int next = in.peek();
@@ -48,7 +47,7 @@ private:
return atom;
}
static Expr parse_list(std::istringstream &in) {
static Expr parse_list(std::istream &in) {
Expr result = {.type = Expr::Type::List};
in.get(); // consume bracket
@@ -72,7 +71,7 @@ private:
return result;
}
static std::string read_string(std::istringstream &in) {
static std::string read_string(std::istream &in) {
std::string result;
in.get(); // consume the quote
@@ -91,7 +90,7 @@ private:
return result;
}
static Expr parse_expr(std::istringstream &in) {
static Expr parse_expr(std::istream &in) {
while (is_space(static_cast<char>(in.peek()))) {
in.get();
}
@@ -138,4 +137,4 @@ inline std::ostream &operator<<(std::ostream &out, const Expr &e) {
break;
}
return out;
}
}

44
src/util.h Normal file
View File

@@ -0,0 +1,44 @@
#pragma once
#include <string>
#include <sys/wait.h>
#include <unistd.h>
namespace Util {
static int shell_command(const std::string &cmd, const std::string &dir = ".") {
pid_t pid = fork();
if (pid < 0) {
perror("fork failed");
return -1;
}
if (pid == 0) {
if (chdir(dir.c_str()) != 0) {
perror("chdir failed");
_exit(1);
}
execl("/bin/sh", "sh", "-c", cmd.c_str(), nullptr); // NOLINT(*-vararg)
perror("execl failed");
_exit(1);
} else {
int status = 0;
if (waitpid(pid, &status, 0) < 0) {
perror("waitpid failed");
return -1;
}
return WIFEXITED(status) ? WEXITSTATUS(status) : -1;
}
}
static std::string basename(const std::string &path) {
size_t pos = path.find_last_of("/\\");
if (pos == std::string::npos) {
return path;
}
return path.substr(pos + 1);
}
}; // namespace Util

View File

@@ -2,6 +2,6 @@
(name "zlib")
(version "1.3.1")
(homepage "https://zlib.net/")
(src (tar "https://zlib.net/zlib-1.3.1.tar.gz" "207c3b0862cb4e3686f8405f76a98c38dbad9c94bcf4be4b9efca0716aba51ec"))
(src (tar "https://zlib.net/zlib-1.3.1.tar.gz" "zlib-1.3.1" "207c3b0862cb4e3686f8405f76a98c38dbad9c94bcf4be4b9efca0716aba51ec"))
(build
(configure_make)))
(configure_make)))