Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

What is it

C project template, built on top of make and GNU core utils and binutils. Works with GCC and LLVM/Clang. Template is oriented towards building static and dynamic (at the same time, man!) libraries across platforms.

This is an effort to decouple the build system out from production and extend it towards more general use, where you would start any C project with this template and use it to build a static or dynamic library or an executable.

Features

Warning: Don't use this for exes, yet. Usable, but alpha alert!

You can build static or dynamic library or even an exe out of same make, across platforms!

Main feature are modules, auto discovered, which get compiled into their own object. Within each module you get automatic platform overrides:

src
├── README.md
├── module_one
│ ├── _osx
│ │ ├── module.mk
│ │ └── module_one_override.c
│ ├── module.mk
│ ├── module_one.c
│ ├── module_one.h
│ ├── module_one_override.c
│ └── module_one_override.h
└── module_two
├── _osx
│ └── module.mk
├── module.mk
└── module_two.c

In this example, within module_one, _osx/module_one_override.c will override module_one_override.c from the root of module_one. Thus, any file that exists in platform subdirectory will override its parent if they share the same name.

In order to accomplish this, each module has to have module.mk file, and submodule (platform directories) has to have their own module.mk. Templates for both are in make_tpls. Eventually, I'll make a shell script to scaffold directory structures.

Through those module/submodule.mk files you can override all the compile/link/include flags for each module/submodule as you wish.

Usage

make followed by either release or debug and then one of the flags

  • PLATFORM= with either of the following osx windows linux ios android
  • BUILD_TYPE= with either of the following static dynamic exe libs all

example: make release PLATFORM=osx BUILD_TYPE=libs will build static and dynamic libs in release mode for MacOS

alt text

TODO

  • Refactor static, dynamic, exe into separate branches
  • Test other platforms (linux and mingw a priority)
  • Revise build directory structure
  • Sane defaults for libs/exe if none provided, along with auto-detect of the platform
  • ASM (NASM) integration into build
  • make install - with prefix and probably with public/private structure for headers within modules
  • Optional: Optimization targets. I do them manually, but I may reconsider - it would be a third level down then src/module/_osx/x86_64 for example

Further down the line:

  • Convert everything into a single file utility to scaffold this from the command line
  • Introduce external library dependencies, based on simple JSON, along with custom pre/build/post scripts, if needed. I already have that in the full build system I use, but it needs decoupling. Think of it as a poor man's npm install.

About

C build template for static,dynamic and exe. Crossplatform

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages