{"id":22622081,"url":"https://github.com/kareimgazer/gnu-make-tutor","last_synced_at":"2026-05-01T15:36:02.998Z","repository":{"id":260780439,"uuid":"882321929","full_name":"KareimGazer/GNU-Make-Tutor","owner":"KareimGazer","description":"simple make setup - just for learning","archived":false,"fork":false,"pushed_at":"2024-11-02T21:17:00.000Z","size":1217,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T02:28:56.682Z","etag":null,"topics":["bash","config","devops","gnumake","make","makefile","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KareimGazer.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-02T14:12:03.000Z","updated_at":"2024-12-06T12:50:38.000Z","dependencies_parsed_at":"2024-11-02T15:21:33.939Z","dependency_job_id":"1abc79b5-38cf-4eab-841a-3258894b68dc","html_url":"https://github.com/KareimGazer/GNU-Make-Tutor","commit_stats":null,"previous_names":["kareimgazer/gnu-make-tutor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KareimGazer/GNU-Make-Tutor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KareimGazer%2FGNU-Make-Tutor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KareimGazer%2FGNU-Make-Tutor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KareimGazer%2FGNU-Make-Tutor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KareimGazer%2FGNU-Make-Tutor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KareimGazer","download_url":"https://codeload.github.com/KareimGazer/GNU-Make-Tutor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KareimGazer%2FGNU-Make-Tutor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32503198,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","config","devops","gnumake","make","makefile","python"],"created_at":"2024-12-08T23:13:13.655Z","updated_at":"2026-05-01T15:36:02.976Z","avatar_url":"https://github.com/KareimGazer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GUN-MAKE-Tutor\r\n\r\nThis is a simple make setup used to generate plots of the word frequency in sample books just to demonstrate the use of Make as a build tool.\r\n\r\nMake is a general build tool that is not only used for C/C++ compilation but also provide dependency management in other software piplelines.\r\n\r\n## Benefits\r\n\r\nWe generally write scripts not only to automate our work but also to document the steps so it can be reviewed - sometimes called **declarative configuration** in DevOps mindset.\r\n\r\nHowever if some of our dependencies in the build pipeline have changed we are faced with two situations:\r\n\r\n1. run the whole pipeline again\r\n2. run parts of it by adding if conditions or env vars that customizes the execution path of our script\r\n\r\nMake solves this for us by building a dependency tree and only building the parts that needs to be updated by looking at the timestamp of the dependent files and if changed then rebuild all artifcats that has that dependency from the root to the top of the dependency tree.\r\n\r\nMakefiles save time by ensuring that automatically-generated artifacts (such as data files or plots) are only recreated when the files that were used to create these have changed in some way.\r\n\r\nThrough their notion of targets, dependencies, and actions, they serve as a form of documentation, recording dependencies between code, scripts, tools, configurations, raw data, derived data, plots, and papers.\r\n\r\n## In A Nutshell\r\n```bash\r\n# rule\r\ntarget: dependencies...\r\n    Actions\r\n\r\n# vars\r\nDATA_FILES = data/isles.dat data/abyss.dat data/last.dat\r\n$(DATA_FILES) # usage\r\n\r\n# auto vars: specific for the rule\r\n$@ # target\r\n$^ # dependencies\r\n$\u003c # first dependency\r\n\r\n# .PHONY\r\nmarks targets that does not corresponds to existing files\r\n```\r\n\r\n## Folder Struture","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkareimgazer%2Fgnu-make-tutor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkareimgazer%2Fgnu-make-tutor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkareimgazer%2Fgnu-make-tutor/lists"}