build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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 > 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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar
, '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

build: let the environment override MACOS_TARGET - #61

Merged
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override
Aug 31, 2026
Merged

build: let the environment override MACOS_TARGET#61
barnstar merged 1 commit into
tailscale:mainfrom
indiagrams:fix/macos-target-env-override

Conversation

@prakashrj

Copy link
Copy Markdown
Contributor

MACOS_TARGET := 15.0 is a simply-expanded assignment, so an environment variable does not override it. MACOS_TARGET=14.0 make c-archive builds 15.0 and reports success — you set the floor, make agrees, and you get the old one. Only make MACOS_TARGET=14.0 c-archive works.

Measured

make -n, GOOS=darwin, against this Makefile:

beforeafter
MACOS_TARGET=14.0 make … (env)15.014.0
make MACOS_TARGET=14.0 … (command line)14.014.0
default, nothing set15.015.0

?= fixes the environment case and changes nothing else: a command-line override still wins, and the default is untouched for anyone not setting it.

Why it's worth fixing

The failure is quiet in a way that matters for this particular variable. Nothing warns, the build succeeds, and the resulting binary is stamped with a floor its Go objects don't actually support. On macOS the only signal is an ld: warning: object file … was built for newer 'macOS' version, which is easy to lose in build output — and otool won't catch it either, since it reports the number the binary claims.

Found while lowering the macOS floor of a TailscaleKit.xcframework built from this repo.

It's also the same knob #60's "Aside" points at: if the project lowers its own deployment targets, whoever does that is likely to reach for the environment variable first.

Not touched here

The comment above the line still says the wrapper requires macOS 15.0 features. That's a separate question and depends on #60, which measures macOS 14.0 as buildable once the listener API is gated — happy to follow up there if that lands.

`MACOS_TARGET := 15.0` is a simply-expanded assignment, so an environment
variable does not override it. `MACOS_TARGET=14.0 make c-archive` builds 15.0
and reports success — you set the floor, make agrees, and you get the old one.
Only `make MACOS_TARGET=14.0 c-archive` works.
Measured with `make -n` against this Makefile, GOOS=darwin:
before after
env override 15.0 14.0
command-line 14.0 14.0
default 15.0 15.0
`?=` fixes the environment case and changes nothing else: a command-line
override still wins, and the default is untouched for anyone not setting it.
Found while lowering the macOS floor of a TailscaleKit.xcframework built from
this repo. The failure is quiet in a way that matters here — nothing warns, the
build succeeds, and the resulting binary is stamped with a floor its Go objects
do not actually support. On macOS the only signal is an `ld: warning: object
file ... was built for newer 'macOS' version`, which is easy to lose in build
output.
This is the same knob tailscale#60's "Aside" points at: if the project lowers its own
deployment targets, whoever does it is likely to reach for the environment
variable first.
Not touched here: the comment above the line still says the wrapper requires
macOS 15.0 features. That is a separate question and depends on tailscale#60, which
measures macOS 14.0 as buildable once the listener API is gated.
@barnstar
barnstar merged commit 59d4bb8 into tailscale:mainAug 31, 2026
1 check failed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@prakashrj@barnstar