Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
781 lines (687 loc) · 39.8 KB
/
Copy pathMakefile
File metadata and controls
781 lines (687 loc) · 39.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
ORIG_PATH := $(PATH)
PATH := /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
ITERM_PID=$(shell pgrep "iTerm2")
APPS := /Applications
ITERM_CONF_PLIST = $(HOME)/Library/Preferences/com.googlecode.iterm2.plist
# Local checkout of the iterm2-website repo, where built plugins are published.
ITERM2_WEBSITE ?= $(HOME)/iterm2-website
SUITE ?= $(notdir $(CURDIR))
COMPACTDATE=$(shell date +"%Y%m%d")
VERSION = $(shell cat version.txt | sed -e "s/%(extra)s/$(COMPACTDATE)/")
NAME=$(shell echo $(VERSION) | sed -e "s/\\./_/g")
HOMEBREW_PREFIX ?= $(shell brew --prefix 2>/dev/null || echo /opt/homebrew)
CMAKE ?= $(HOMEBREW_PREFIX)/bin/cmake
PKG_CONFIG ?= $(HOMEBREW_PREFIX)/bin/pkg-config
RUSTUP ?= $(shell PATH="$(ORIG_PATH):$(HOME)/.cargo/bin" which rustup 2>/dev/null)
DEPLOYMENT_TARGET=13.0
# Build product directory: defaults to xcodebuild's SYMROOT.
# Override with BUILD_DIR=/path/to/dir on the command line.
# Skip validation for targets that don't need a build directory.
ifndef BUILD_DIR
BUILD_DIR := $(shell xcodebuild -scheme iTerm2 -showBuildSettings 2>/dev/null | awk -F ' = ' '/^ *SYMROOT/{print $$2; exit}')
endif
_NEEDS_BUILD_DIR := $(if $(filter-out setup dangerous-setup _setup-main help doctor,$(MAKECMDGOALS)),yes,$(if $(MAKECMDGOALS),,yes))
ifdef _NEEDS_BUILD_DIR
ifeq ($(strip $(BUILD_DIR)),)
$(error Could not determine BUILD_DIR from xcodebuild -showBuildSettings. Is Xcode installed? Set BUILD_DIR explicitly to override.)
endif
ifeq ($(patsubst /%,%,$(BUILD_DIR)),$(BUILD_DIR))
$(error BUILD_DIR is not an absolute path: $(BUILD_DIR))
endif
ifneq ($(shell d='$(BUILD_DIR)'; while [ ! -d "$$d" ]; do d=$$(dirname "$$d"); done; [ -w "$$d" ] && echo ok),ok)
$(error BUILD_DIR is not writable: $(BUILD_DIR))
endif
endif
# Code signing: disabled by default (contributor-friendly).
# Use SIGNED=1 to build with the project's signing identity.
ifndef SIGNED
SIGNING_FLAGS = CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
endif
# Architecture: native-only by default (faster builds).
# Use UNIVERSAL=1 to build universal (arm64 + x86_64) binaries for release.
NATIVE_ARCH := $(shell uname -m)
ifndef UNIVERSAL
ARCH_FLAGS = ARCHS="$(NATIVE_ARCH)" ONLY_ACTIVE_ARCH=YES
endif
# Architecture for cmake-based deps.
ifdef UNIVERSAL
CMAKE_ARCHS = x86_64;arm64
else
CMAKE_ARCHS = $(NATIVE_ARCH)
endif
# Rust target triple for the native architecture.
ifeq ($(NATIVE_ARCH),arm64)
RUST_NATIVE_TARGET = aarch64-apple-darwin
else
RUST_NATIVE_TARGET = x86_64-apple-darwin
endif
.PHONY: clean all backup-old-iterm restart setup dangerous-setup _setup-main help doctor companion-bump-build companion-bump-build-upload
help:
@echo "iTerm2 — $(VERSION) ($(NATIVE_ARCH))"
@echo ""
@echo "First time:"
@echo " make setup Install all build dependencies (interactive)"
@echo " make dangerous-setup Same as setup, skip all confirmations"
@echo ""
@echo "Build:"
@echo " make Build Development (default)"
@echo " make dev Build Development"
@echo " make prod Build Deployment"
@echo " make run Build and launch Development build"
@echo " make run-keychain Signed dev build w/ keychain entitlement (test migration)"
@echo " make purge-keychain-test Wipe the app's data-protection keychain (test reset)"
@echo " make reset-suite Erase the dev suite's settings, keeping the dev-only advanced settings on"
@echo " make watch Build and launch with interactive r=reload q=quit loop"
@echo " make test Run unit tests"
@echo " make install Build Deployment and install to /Applications"
@echo ""
@echo "Dependencies:"
@echo " make paranoid-deps Rebuild all native dependencies (sandboxed)"
@echo " make DepsIfNeeded Rebuild deps only if Xcode version changed"
@echo " make clean Remove build products"
@echo " make cleandeps Clean submodule build directories"
@echo ""
@echo "Release:"
@echo " make Beta Build Beta configuration"
@echo " make Nightly Build Nightly configuration"
@echo " make Deployment Build Deployment configuration"
@echo ""
@echo "Companion (iOS):"
@echo " make companion-bump-build Bump app + PushService build # and regenerate"
@echo " (N=123 to set an explicit number)"
@echo " make companion-bump-build-upload Bump #, then archive + upload to TestFlight"
@echo " via fastlane (needs ASC_* env vars set)"
@echo ""
@echo "Diagnose:"
@echo " make doctor Check all build dependencies"
@echo ""
@echo "Options:"
@echo " SIGNED=1 Enable code signing"
@echo " UNIVERSAL=1 Build universal (arm64 + x86_64) binaries"
@echo " BUILD_DIR=/path Override build output directory"
@echo ""
@echo "Homebrew: $(HOMEBREW_PREFIX)"
all: Development
dev: Development
prod: Deployment
# Bump the Companion app + PushService build number and regenerate the Xcode
# project so it takes effect. CURRENT_PROJECT_VERSION lives once in the generator
# (the source of truth for both targets), so this keeps them in lockstep and
# survives regeneration. Pass N=<number> to set an explicit build number instead
# of incrementing (use this to jump past builds already on App Store Connect).
companion-bump-build:
ruby Companion/tools/bump_build_number.rb $(N)
ruby Companion/tools/generate_companion_project.rb
# Bump the build number and regenerate, then archive and upload to TestFlight
# via fastlane, no Xcode. Needs ASC_KEY_ID, ASC_ISSUER_ID, ASC_KEY_PATH set in
# the environment. Pass N=<number> to set an explicit build number.
companion-bump-build-upload: companion-bump-build
cd Companion && bundle exec fastlane release
setup:
@BREW_BIN=$$(PATH="/opt/homebrew/bin:/usr/local/bin:$(ORIG_PATH)" command -v brew 2>/dev/null); \
if [ -z "$$BREW_BIN" ]; then \
echo "Homebrew is not installed."; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "Install Homebrew via its official install script (requires sudo)? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) echo "Aborted."; exit 1;; esac; \
fi; \
NONINTERACTIVE=1 /bin/bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; \
BREW_BIN=$$(command -v /opt/homebrew/bin/brew 2>/dev/null || command -v /usr/local/bin/brew 2>/dev/null); \
if [ -z "$$BREW_BIN" ]; then \
echo "Error: Homebrew installation failed."; \
exit 1; \
fi; \
fi; \
if ! PATH="$(ORIG_PATH)" command -v brew >/dev/null 2>&1; then \
echo "Restarting setup with Homebrew in PATH..."; \
PATH="$$(dirname $$BREW_BIN):$(ORIG_PATH)" \
$(MAKE) _setup-main SKIP_CONFIRM="$(SKIP_CONFIRM)"; \
else \
$(MAKE) _setup-main SKIP_CONFIRM="$(SKIP_CONFIRM)"; \
fi
dangerous-setup:
@$(MAKE) setup SKIP_CONFIRM=1
_setup-main:
@XCODE_DEV=$$(PATH="$(ORIG_PATH)" xcode-select -p 2>/dev/null); \
if echo "$$XCODE_DEV" | grep -q '/Xcode.*\.app'; then \
XCODE_APP=$$(echo "$$XCODE_DEV" | sed 's|/Contents/Developer.*||'); \
echo "Xcode already selected: $$XCODE_APP"; \
else \
echo "Xcode.app is not selected."; \
XCODE_APP=$$(ls -d /Applications/Xcode*.app 2>/dev/null | head -1); \
if [ -n "$$XCODE_APP" ]; then \
echo "Found $$XCODE_APP, selecting it..."; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "This will run: sudo xcode-select -s \"$$XCODE_APP\". Continue? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) echo "Aborted."; exit 1;; esac; \
fi; \
sudo xcode-select -s "$$XCODE_APP"; \
else \
echo "No Xcode installation found in /Applications."; \
HAS_XCODES=0; \
if PATH="$(ORIG_PATH)" command -v xcodes >/dev/null 2>&1; then \
HAS_XCODES=1; \
else \
echo "Installing xcodes to manage Xcode versions..."; \
PATH="$(ORIG_PATH)" brew install aria2 2>&1 || true; \
if PATH="$(ORIG_PATH)" brew install xcodes 2>&1; then \
HAS_XCODES=1; \
else \
echo "Could not install xcodes. See error above."; \
fi; \
fi; \
if [ "$$HAS_XCODES" = "1" ]; then \
echo "Downloading and installing the latest Xcode (this will take a while)..."; \
PATH="$(ORIG_PATH)" xcodes install --latest --experimental-unxip; \
XCODE_APP=$$(ls -d /Applications/Xcode*.app 2>/dev/null | head -1); \
if [ -z "$$XCODE_APP" ]; then \
XCODE_APP=$$(PATH="$(ORIG_PATH)" xcodes installed | tail -1 | awk '{print $$NF}'); \
fi; \
fi; \
if [ -z "$$XCODE_APP" ]; then \
echo ""; \
echo "Please install Xcode from the App Store or https://developer.apple.com/download/"; \
echo "then re-run make setup."; \
exit 1; \
fi; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "This will run: sudo xcode-select -s \"$$XCODE_APP\". Continue? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) echo "Aborted."; exit 1;; esac; \
fi; \
sudo xcode-select -s "$$XCODE_APP"; \
fi; \
fi
@if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "Accept the Xcode license agreement? [y/N] "; \
read ans </dev/tty; \
case "$$ans" in [yY]) sudo PATH="$(ORIG_PATH)" xcodebuild -license accept;; *) echo "Skipped license acceptance.";; esac; \
else \
sudo PATH="$(ORIG_PATH)" xcodebuild -license accept 2>/dev/null || true; \
fi
@if [ -z "$(RUSTUP)" ]; then \
echo "rustup is not installed."; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "Install rustup via 'curl https://sh.rustup.rs | sh'? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) echo "Aborted."; exit 1;; esac; \
fi; \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; \
export PATH="$$HOME/.cargo/bin:$$PATH"; \
fi
@test -f plists/iTerm2.plist || cp plists/dev-iTerm2.plist plists/iTerm2.plist
@PATH="$(ORIG_PATH)" brew list cmake >/dev/null 2>&1 || PATH="$(ORIG_PATH)" brew install cmake
@PATH="$(ORIG_PATH)" brew list pkg-config >/dev/null 2>&1 || PATH="$(ORIG_PATH)" brew install pkg-config
@PATH="$(ORIG_PATH)" brew list automake >/dev/null 2>&1 || PATH="$(ORIG_PATH)" brew install automake
@PATH="$(ORIG_PATH)" command -v perl >/dev/null 2>&1 || PATH="$(ORIG_PATH)" brew install perl
@# gettext provides envsubst, used by tools/copy_shell_integration.sh to embed it2.py.
@PATH="$(ORIG_PATH)" brew list gettext >/dev/null 2>&1 || PATH="$(ORIG_PATH)" brew install gettext
@if ! test -x "$(HOMEBREW_PREFIX)/bin/python3"; then \
PATH="$(ORIG_PATH)" brew install python3; \
if ! PATH="$(ORIG_PATH)" brew link python@3 2>/dev/null; then \
echo "brew link python@3 would overwrite existing symlinks:"; \
PATH="$(ORIG_PATH)" brew link python@3 2>&1 | head -5; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "Overwrite these symlinks? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) echo "Aborted."; exit 1;; esac; \
fi; \
PATH="$(ORIG_PATH)" brew link --overwrite python@3; \
fi; \
fi
@if ! PATH="$(ORIG_PATH)" brew list --cask sf-symbols >/dev/null 2>&1; then \
INSTALL_SF=1; \
if [ "$(SKIP_CONFIRM)" != "1" ]; then \
printf "sf-symbols is a .pkg installer that requires sudo. Install it now? [y/N] "; \
read ans </dev/tty; case "$$ans" in [yY]) ;; *) INSTALL_SF=0; echo "Skipped sf-symbols.";; esac; \
fi; \
if [ "$$INSTALL_SF" = "1" ]; then \
PATH="$(ORIG_PATH)" brew install --cask sf-symbols || \
{ echo ""; echo "WARNING: sf-symbols installation failed (requires sudo)."; \
echo " Ask your admin to run: brew install --cask sf-symbols"; echo ""; }; \
fi; \
fi
@$(HOMEBREW_PREFIX)/bin/python3 -c "import objc" 2>/dev/null || $(HOMEBREW_PREFIX)/bin/pip3 install --break-system-packages pyobjc
@PATH="$(ORIG_PATH):$$HOME/.cargo/bin" command -v cbindgen >/dev/null || $(or $(RUSTUP),$$HOME/.cargo/bin/rustup) run stable cargo install cbindgen
# Note: this installs arm tooling as well
$(or $(RUSTUP),$$HOME/.cargo/bin/rustup) target add x86_64-apple-darwin
git submodule update --init --recursive
PATH="$(ORIG_PATH)" xcodebuild -downloadComponent MetalToolchain || \
echo "WARNING: Metal Toolchain download failed. You can retry later with: xcodebuild -downloadComponent MetalToolchain"
@echo ""
@echo "Setup complete. Run 'make paranoid-deps' to build native dependencies."
doctor:
@echo "iTerm2 build environment — $(NATIVE_ARCH)"
@echo ""
@printf " %-18s" "Homebrew:"; (PATH="$(ORIG_PATH)" brew --version 2>/dev/null | head -1) || echo "NOT FOUND"
@printf " %-18s" "Homebrew prefix:"; echo "$(HOMEBREW_PREFIX)"
@printf " %-18s" "Xcode:"; (xcodebuild -version 2>/dev/null | tr '\n' ' ' && echo) || echo "NOT FOUND"
@printf " %-18s" "xcode-select:"; (xcode-select -p 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "xcodes:"; (PATH="$(ORIG_PATH)" xcodes version 2>/dev/null) || echo "not installed"
@printf " %-18s" "cmake:"; ($(CMAKE) --version 2>/dev/null | head -1) || echo "NOT FOUND"
@printf " %-18s" "pkg-config:"; ($(PKG_CONFIG) --version 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "automake:"; (PATH="$(ORIG_PATH)" automake --version 2>/dev/null | grep -m1 .) || echo "NOT FOUND"
@printf " %-18s" "perl:"; (PATH="$(ORIG_PATH)" perl -e 'print $$]."\n"' 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "python3 (brew):"; ver=$$($(HOMEBREW_PREFIX)/bin/python3 --version 2>/dev/null); \
if [ -z "$$ver" ]; then echo "NOT FOUND — run make setup"; \
elif echo "$$ver" | grep -q "^Python 3"; then echo "$$ver"; \
else echo "$$ver (WARNING: needs Python 3)"; fi
@printf " %-18s" "pyobjc:"; ($(HOMEBREW_PREFIX)/bin/python3 -c "import objc; print('installed')" 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "rustup:"; (PATH="$(ORIG_PATH):$(HOME)/.cargo/bin" rustup --version 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "cbindgen:"; (PATH="$(ORIG_PATH):$(HOME)/.cargo/bin" cbindgen --version 2>/dev/null) || echo "NOT FOUND"
@printf " %-18s" "sf-symbols:"; (PATH="$(ORIG_PATH)" brew list --cask sf-symbols >/dev/null 2>&1 && echo "installed") || echo "NOT FOUND"
TAGS:
find . -name "*.[mhMH]" -exec etags -o ./TAGS -a '{}' +
install: | Deployment backup-old-iterm
cp -R $(BUILD_DIR)/Deployment/iTerm2.app $(APPS)
# The code-derived string catalog is tracked at xcstrings/Localizable.xcstrings
# (the canonical copy, owned by tools/extract_strings.sh). Xcode's per-build
# "sync localizations" mangles whatever catalog is the app target's resource, so
# the resource copy at sources/Localizable.xcstrings is gitignored and staged
# here from the canonical copy before every build. This must run before
# xcodebuild, because the xcstrings compile computes its outputs at build-planning
# time, before any build phase would run. (The IDE does the same via a scheme
# pre-action; see iTerm2.xcscheme.)
.PHONY: ingest-catalogs
ingest-catalogs:
cp -f xcstrings/Localizable.xcstrings sources/Localizable.xcstrings
Development Beta Deployment Nightly: ingest-catalogs
# Enable the repo's git hooks (tracked in tools/git-hooks). The pre-commit hook
# blocks committing a newly-added string in xcstrings/Localizable.xcstrings that
# isn't translated into every language the catalog uses. Run once per clone.
.PHONY: install-hooks
install-hooks:
git config core.hooksPath tools/git-hooks
@echo "Git hooks enabled (core.hooksPath=tools/git-hooks)."
# Every configuration but Development builds its intermediates in a folder of its own.
# Xcode doesn't separate some of them (generated module maps and precompiled headers) by
# configuration, so building one configuration leaves another's precompiled header stale
# and its next build fails. Development keeps Xcode's default, which Xcode and the tests
# also use.
intermediates = $(BUILD_DIR)/Intermediates-$(1).noindex
Development:
echo "Using PATH for build: $(PATH)"
cp plists/dev-iTerm2.plist plists/iTerm2.plist
xcodebuild -scheme iTerm2 -configuration Development -destination 'platform=macOS' -skipPackagePluginValidation $(SIGNING_FLAGS) $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" && \
chmod -R go+rX $(BUILD_DIR)/Development
Beta:
cp plists/beta-iTerm2.plist plists/iTerm2.plist
xcodebuild -scheme iTerm2 -configuration Beta -destination 'platform=macOS' -skipPackagePluginValidation $(SIGNING_FLAGS) $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" OBJROOT="$(call intermediates,Beta)" ENABLE_ADDRESS_SANITIZER=NO && \
chmod -R go+rX $(BUILD_DIR)/Beta
OBJROOT="$(call intermediates,Beta)" tools/extract_strings.sh Beta "$(BUILD_DIR)"
Deployment:
xcodebuild -scheme iTerm2 -configuration Deployment -destination 'platform=macOS' -skipPackagePluginValidation $(SIGNING_FLAGS) $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" OBJROOT="$(call intermediates,Deployment)" ENABLE_ADDRESS_SANITIZER=NO && \
chmod -R go+rX $(BUILD_DIR)/Deployment
OBJROOT="$(call intermediates,Deployment)" tools/extract_strings.sh Deployment "$(BUILD_DIR)"
Nightly: force
cp plists/nightly-iTerm2.plist plists/iTerm2.plist
xcodebuild -scheme iTerm2 -configuration Nightly -destination 'platform=macOS' -skipPackagePluginValidation $(SIGNING_FLAGS) $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" OBJROOT="$(call intermediates,Nightly)" ENABLE_ADDRESS_SANITIZER=NO
chmod -R go+rX $(BUILD_DIR)/Nightly
companion-iphone: force
Companion/tools/run_on_iphone.sh $(COMPANION_DEVICE)
open: Development
open -W -n "$(BUILD_DIR)/Development/iTerm2.app" --args -suite $(SUITE)
# Set LANGUAGE=<code> to force a UI language, e.g. `LANGUAGE=pt make run` adds
# -AppleLanguages '(pt)'. Leave it unset to use the system language.
run: Development
$(MAKE) run-nobuild
# Like `run`, but builds the Deployment configuration signed as a release is (Developer ID,
# hardened runtime, release entitlements and provisioning profile). Use it to test things
# that depend on the release signature, such as reading login keychain items that release
# builds saved without macOS asking about each one. It uses the dev Info.plist, so it checks
# the nightly appcast rather than the release one, and skips the string extraction the
# Deployment target runs. A debugger can't attach. The signed app is launched with `open`,
# since macOS kills a signed app that is exec'd directly.
run-deployment: ingest-catalogs
cp plists/dev-iTerm2.plist plists/iTerm2.plist
xcodebuild -scheme iTerm2 -configuration Deployment -destination 'platform=macOS' -skipPackagePluginValidation $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" OBJROOT="$(call intermediates,Deployment)" ENABLE_ADDRESS_SANITIZER=NO
open -W -n "$(BUILD_DIR)/Deployment/iTerm2.app" --args -suite $(SUITE) $(if $(LANGUAGE),-AppleLanguages '($(LANGUAGE))')
run-deployment-release: ingest-catalogs
cp plists/release-iTerm2.plist plists/iTerm2.plist
xcodebuild -scheme iTerm2 -configuration Deployment -destination 'platform=macOS' -skipPackagePluginValidation $(ARCH_FLAGS) SYMROOT="$(BUILD_DIR)" OBJROOT="$(call intermediates,Deployment)" ENABLE_ADDRESS_SANITIZER=NO
open -W -n "$(BUILD_DIR)/Deployment/iTerm2.app" --args -suite $(SUITE) $(if $(LANGUAGE),-AppleLanguages '($(LANGUAGE))')
run-nobuild: force
"$(BUILD_DIR)/Development/iTerm2.app/Contents/MacOS/iTerm2" -suite $(SUITE) $(if $(LANGUAGE),-AppleLanguages '($(LANGUAGE))') & \
pid=$$!; \
trap 'kill $$pid 2>/dev/null' INT TERM; \
( sleep 1 && osascript -e "tell application \"System Events\" to set frontmost of (first process whose unix id is $$pid) to true" >/dev/null 2>&1 ) & \
wait $$pid
# Erase every setting of this checkout's suite (the main and .private defaults
# domains for $(SUITE)) and turn back on the two advanced settings a dev build
# should always have: SetIT2AppPath, so the it2 CLI asks this instance for its
# cookie rather than whichever iTerm2 owns the bundle identifier, and
# AiChatRawWireLogging. The suite must not be running: cfprefsd would hand the
# live instance's cached settings straight back on quit. Advanced-setting keys
# are the setting names with the first letter capitalized.
reset-suite: force
@if pgrep -f -- "-suite $(SUITE)( |$$)" >/dev/null; then \
echo "reset-suite: an iTerm2 with -suite $(SUITE) is running; quit it first" >&2; \
exit 1; \
fi
-defaults delete "$(SUITE)" 2>/dev/null
-defaults delete "$(SUITE).private" 2>/dev/null
defaults write "$(SUITE)" SetIT2AppPath -bool YES
defaults write "$(SUITE)" AiChatRawWireLogging -bool YES
@echo "reset-suite: $(SUITE) erased; SetIT2AppPath and AiChatRawWireLogging are on"
# Regenerate sources/Localizable.xcstrings from the current sources. Swift strings come
# from the per-file .stringsdata the build emits (SWIFT_EMIT_LOC_STRINGS=YES); Objective-C
# strings are pulled from the NSLocalizedString family with extractLocStrings, which the
# build does not run for the static-library targets. This is the standalone entry point;
# the Beta and Deployment targets run the same step automatically after building.
extract-strings: Development
tools/extract_strings.sh Development "$(BUILD_DIR)"
# Like `run`, but doubles every localized string at runtime (e.g. "View" -> "View View")
# with -NSDoubleLocalizedStrings. Needs no translations, and because the displayed text
# then differs from the English source it flushes out code that still matches on English
# strings (menu-item lookups, window titles, etc.).
pseudorun: Development
"$(BUILD_DIR)/Development/iTerm2.app/Contents/MacOS/iTerm2" -suite $(SUITE) -NSDoubleLocalizedStrings YES & \
pid=$$!; \
trap 'kill $$pid 2>/dev/null' INT TERM; \
( sleep 1 && osascript -e "tell application \"System Events\" to set frontmost of (first process whose unix id is $$pid) to true" >/dev/null 2>&1 ) & \
wait $$pid
# Like `run`, but re-signs the built app with the keychain-access-groups entitlement
# so the data-protection-keychain migration is actually exercised. Plain `make run`
# uses iTerm2-Development.entitlements, which omits the entitlement to keep the fast
# unsigned dev loop free of provisioning.
#
# Signing an Xcode BUILD with this entitlement needs a provisioning profile, and the
# Development config's Apple Development profile is device-bound (a hassle we avoid).
# Instead we build unsigned (the Development prerequisite) and re-sign the finished
# .app with codesign. keychain-access-groups is a RESTRICTED entitlement: launchd
# refuses to spawn the app unless an embedded provisioning profile authorizes it and
# the signing cert is inside that profile, so tools/codesign_keychain_test.sh finds an
# installed "iTerm2 Dev ID App Prov Prof" whose cert you hold, embeds it, and signs
# with that cert. The signed app must be launched via `open` (LaunchServices), not by
# exec'ing the binary directly (macOS kills a directly-exec'd signed app). `open -W`
# blocks until it quits, like `run`. Runs with -suite; AI-key accounts are NOT
# suite-namespaced, so AI-key migration touches your real keychain items. Drop -suite
# below to test real companion pairing.
run-keychain: Development
tools/codesign_keychain_test.sh "$(BUILD_DIR)/Development/iTerm2.app"
open -W -n "$(BUILD_DIR)/Development/iTerm2.app" --args -suite $(notdir $(CURDIR))
# Reset the data-protection keychain between migration tests. Those items are
# entitlement-gated, so the `security` CLI can't reach them; this signs the app (same as
# run-keychain) and launches it with a DEBUG-only flag that deletes the app's own
# data-protection items (scoped to our access group) and quits. Prints the count.
purge-keychain-test: Development
tools/codesign_keychain_test.sh "$(BUILD_DIR)/Development/iTerm2.app"
rm -f /tmp/iterm2-keychain-purge-result.txt
open -W -n "$(BUILD_DIR)/Development/iTerm2.app" --args --iterm2-purge-data-protection-keychain-for-testing
@cat /tmp/iterm2-keychain-purge-result.txt 2>/dev/null || echo "no purge result written (build may lack the entitlement)"
runbg: Development
"$(BUILD_DIR)/Development/iTerm2.app/Contents/MacOS/iTerm2" -suite $(SUITE) & \
pid=$$!; \
trap 'kill $$pid 2>/dev/null' INT TERM; \
( sleep 1 && osascript -e "tell application \"System Events\" to set frontmost of (first process whose unix id is $$pid) to true" >/dev/null 2>&1 ) & \
watch: Development
tools/run.sh "$(BUILD_DIR)/Development/iTerm2.app/Contents/MacOS/iTerm2" "$(BUILD_DIR)" -suite iterm2-dev
devzip: Development
cd $(BUILD_DIR)/Development && \
zip -r iTerm2-$(NAME).zip iTerm2.app
zip: Deployment
cd $(BUILD_DIR)/Deployment && \
zip -r iTerm2-$(NAME).zip iTerm2.app
clean:
rm -rf "$(BUILD_DIR)"
rm -rf submodules/*/build
rm -rf submodules/*/build-*
rm -rf submodules/*/build_*
rm -rf submodules/libssh2/libssh2.a
rm -f *~
git -C submodules/NMSSH/ checkout NMSSH-OSX/Libraries/lib/
rm -rf BetterFontPicker/BetterFontPicker.framework && git checkout BetterFontPicker/BetterFontPicker.framework
rm -rf ColorPicker/ColorPicker.framework && git checkout ColorPicker/ColorPicker.framework
rm -rf SearchableComboListView/SearchableComboListView.framework && git checkout SearchableComboListView/SearchableComboListView.framework
rm -rf ThirdParty && git checkout ThirdParty
cd submodules/libsixel && make distclean || true
git checkout last-xcode-version
backup-old-iterm:
if [[ -d $(APPS)/iTerm2.app.bak ]] ; then rm -fr $(APPS)/iTerm2.app.bak ; fi
if [[ -d $(APPS)/iTerm2.app ]] ; then \
/bin/mv $(APPS)/iTerm2.app $(APPS)/iTerm2.app.bak ;\
cp $(ITERM_CONF_PLIST) $(APPS)/iTerm2.app.bak/Contents/ ; \
fi
restart:
PATH=$(ORIG_PATH) /usr/bin/open /Applications/iTerm2.app &
/bin/kill -TERM $(ITERM_PID)
release:
cp plists/release-iTerm2.plist plists/iTerm2.plist
make Deployment
preview:
cp plists/preview-iTerm2.plist plists/iTerm2.plist
make Deployment
x86libsixel: force
mkdir -p submodules/libsixel/build-x86
cd submodules/libsixel/build-x86 && PKG_CONFIG=$(PKG_CONFIG) CC="/usr/bin/clang -target x86_64-apple-macos$(DEPLOYMENT_TARGET)" LDFLAGS="-target x86_64-apple-macos$(DEPLOYMENT_TARGET)" CFLAGS="-target x86_64-apple-macos$(DEPLOYMENT_TARGET)" LIBTOOLFLAGS="-target x86_64-apple-macos$(DEPLOYMENT_TARGET)" ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ../configure -host=x86_64-apple-darwin --prefix=${PWD}/ThirdParty/libsixel-x86 --without-libcurl --without-jpeg --without-png --disable-python --disable-shared && $(MAKE) && $(MAKE) install
armsixel: force
mkdir -p submodules/libsixel/build-arm
cd submodules/libsixel/build-arm && PKG_CONFIG=$(PKG_CONFIG) CC="/usr/bin/clang -target arm64-apple-macos$(DEPLOYMENT_TARGET)" LDFLAGS="-target arm64-apple-macos$(DEPLOYMENT_TARGET)" CFLAGS="-target arm64-apple-macos$(DEPLOYMENT_TARGET)" LIBTOOLFLAGS="-target arm64-apple-macos$(DEPLOYMENT_TARGET)" ../configure --host=aarch64-apple-darwin --prefix=${PWD}/ThirdParty/libsixel-arm --without-libcurl --without-jpeg --without-png --disable-python --disable-shared && $(MAKE) && $(MAKE) install
ifdef UNIVERSAL
# Usage: go to an intel mac and run make x86libsixel and commit it. Go to an arm mac and run make armsixel && make libsixel.
fatlibsixel: force armsixel x86libsixel
lipo -create -output ThirdParty/libsixel/lib/libsixel.a ThirdParty/libsixel-arm/lib/libsixel.a ThirdParty/libsixel-x86/lib/libsixel.a
cp ThirdParty/libsixel-arm/include/sixel.h ThirdParty/libsixel/include/sixel.h
else
fatlibsixel: force
ifeq ($(NATIVE_ARCH),arm64)
$(MAKE) armsixel
cp ThirdParty/libsixel-arm/lib/libsixel.a ThirdParty/libsixel/lib/libsixel.a
cp ThirdParty/libsixel-arm/include/sixel.h ThirdParty/libsixel/include/sixel.h
else
$(MAKE) x86libsixel
cp ThirdParty/libsixel-x86/lib/libsixel.a ThirdParty/libsixel/lib/libsixel.a
cp ThirdParty/libsixel-x86/include/sixel.h ThirdParty/libsixel/include/sixel.h
endif
endif
armopenssl: force
echo Begin building configure-armopenssl
cd submodules/openssl && make clean && make distclean || echo make failed
cd submodules/openssl && ./Configure darwin64-arm64-cc no-shared -fPIC -mmacosx-version-min=$(DEPLOYMENT_TARGET)
echo Begin building armopenssl
cd submodules/openssl && $(MAKE)
rm -rf submodules/openssl/build-arm
mkdir submodules/openssl/build-arm
cp submodules/openssl/*.a submodules/openssl/build-arm
x86openssl: force
echo Begin building configure-x86openssl
cd submodules/openssl && make clean && make distclean || echo make failed
cd submodules/openssl && ./Configure darwin64-x86_64-cc no-shared -fPIC -mmacosx-version-min=$(DEPLOYMENT_TARGET)
echo Begin building x86openssl
cd submodules/openssl && $(MAKE)
rm -rf submodules/openssl/build-x86
mkdir submodules/openssl/build-x86
cp submodules/openssl/*.a submodules/openssl/build-x86
ifdef UNIVERSAL
fatopenssl: force
echo Begin building fatopenssl
$(MAKE) armopenssl
$(MAKE) x86openssl
cd submodules/openssl/ && lipo -create -output libcrypto.a build-x86/libcrypto.a build-arm/libcrypto.a
cd submodules/openssl/ && lipo -create -output libssl.a build-x86/libssl.a build-arm/libssl.a
cd submodules/openssl; rm -rf build-fat; mkdir build-fat; mkdir build-fat/lib; cp -R include/ build-fat/include/
cp submodules/openssl/libcrypto.a submodules/openssl/libssl.a submodules/NMSSH/NMSSH-OSX/Libraries/lib
cp submodules/openssl/*a submodules/openssl/build-fat/lib
else
fatopenssl: force
echo Begin building openssl for $(NATIVE_ARCH)
ifeq ($(NATIVE_ARCH),arm64)
$(MAKE) armopenssl
cd submodules/openssl; rm -rf build-fat; mkdir -p build-fat/lib; cp -R include/ build-fat/include/
cp submodules/openssl/build-arm/*.a submodules/openssl/build-fat/lib
cp submodules/openssl/build-arm/libcrypto.a submodules/openssl/build-arm/libssl.a submodules/NMSSH/NMSSH-OSX/Libraries/lib
else
$(MAKE) x86openssl
cd submodules/openssl; rm -rf build-fat; mkdir -p build-fat/lib; cp -R include/ build-fat/include/
cp submodules/openssl/build-x86/*.a submodules/openssl/build-fat/lib
cp submodules/openssl/build-x86/libcrypto.a submodules/openssl/build-x86/libssl.a submodules/NMSSH/NMSSH-OSX/Libraries/lib
endif
endif
x86libssh2: force
echo Begin building x86libssh2
mkdir -p submodules/libssh2/build_x86_64
# Add this flag to enable tracing:
# -DCMAKE_C_FLAGS="-DLIBSSH2DEBUG"
cd submodules/libssh2/build_x86_64 && $(CMAKE) -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_IGNORE_PREFIX_PATH=/opt/homebrew -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -DOPENSSL_INCLUDE_DIR=${PWD}/submodules/openssl/build-fat/include -DOPENSSL_ROOT_DIR=${PWD}/submodules/openssl/build-fat -DBUILD_EXAMPLES=NO -DBUILD_TESTING=NO -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCRYPTO_BACKEND=OpenSSL -DCMAKE_OSX_DEPLOYMENT_TARGET=$(DEPLOYMENT_TARGET) .. && $(MAKE) libssh2_static
armlibssh2: force
echo Begin building armlibssh2
mkdir -p submodules/libssh2/build_arm64
# Add this flag to enable tracing:
# -DCMAKE_C_FLAGS="-DLIBSSH2DEBUG"
cd submodules/libssh2/build_arm64 && $(CMAKE) -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_IGNORE_PREFIX_PATH=/opt/homebrew -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -DOPENSSL_INCLUDE_DIR=${PWD}/submodules/openssl/include -DOPENSSL_ROOT_DIR=${PWD}/submodules/openssl -DBUILD_EXAMPLES=NO -DBUILD_TESTING=NO -DCMAKE_OSX_ARCHITECTURES=arm64 -DCRYPTO_BACKEND=OpenSSL -DCMAKE_OSX_DEPLOYMENT_TARGET=$(DEPLOYMENT_TARGET) .. && $(MAKE) libssh2_static
ifdef UNIVERSAL
fatlibssh2: force fatopenssl
echo Begin building fatlibssh2
$(MAKE) x86libssh2
$(MAKE) armlibssh2
cd submodules/libssh2 && lipo -create -output libssh2.a build_arm64/src/libssh2.a build_x86_64/src/libssh2.a
cp submodules/libssh2/libssh2.a submodules/NMSSH/NMSSH-OSX/Libraries/lib/libssh2.a
else
fatlibssh2: force fatopenssl
echo Begin building libssh2 for $(NATIVE_ARCH)
ifeq ($(NATIVE_ARCH),arm64)
$(MAKE) armlibssh2
cp submodules/libssh2/build_arm64/src/libssh2.a submodules/NMSSH/NMSSH-OSX/Libraries/lib/libssh2.a
else
$(MAKE) x86libssh2
cp submodules/libssh2/build_x86_64/src/libssh2.a submodules/NMSSH/NMSSH-OSX/Libraries/lib/libssh2.a
endif
endif
CoreParse: force
rm -rf ThirdParty/CoreParse.framework
cd submodules/CoreParse && xcodebuild -target CoreParse -configuration Release CONFIGURATION_BUILD_DIR=../../ThirdParty VALID_ARCHS="arm64 x86_64" $(SIGNING_FLAGS) $(ARCH_FLAGS)
cp "submodules/CoreParse//CoreParse/Tokenisation/Token Recognisers/CPRegexpRecogniser.h" ThirdParty/CoreParse.framework/Versions/A/Headers/CPRegexpRecogniser.h
NMSSH: force fatlibssh2
echo Begin building NMSSH
rm -rf ThirdParty/NMSSH.framework
cp submodules/libssh2/include/* submodules/NMSSH/NMSSH-OSX/Libraries/include/libssh2
cd submodules/NMSSH && xcodebuild -target NMSSH -project NMSSH.xcodeproj -configuration Release CONFIGURATION_BUILD_DIR=../../ThirdParty $(SIGNING_FLAGS) $(ARCH_FLAGS)
paranoid-NMSSH: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" NMSSH
ifdef UNIVERSAL
librailroad_dsl: force
$(RUSTUP) target add x86_64-apple-darwin
$(RUSTUP) target add aarch64-apple-darwin
cd submodules/railroad_dsl && MACOSX_DEPLOYMENT_TARGET=$(DEPLOYMENT_TARGET) $(RUSTUP) run stable cargo build --release --target aarch64-apple-darwin && MACOSX_DEPLOYMENT_TARGET=$(DEPLOYMENT_TARGET) $(RUSTUP) run stable cargo build --release --target x86_64-apple-darwin && lipo -create target/aarch64-apple-darwin/release/librailroad_dsl.dylib target/x86_64-apple-darwin/release/librailroad_dsl.dylib -output ../../ThirdParty/librailroad_dsl/lib/librailroad_dsl.dylib && cp include/railroad_dsl.h ../../ThirdParty/librailroad_dsl/include && install_name_tool -id @rpath/librailroad_dsl.dylib ../../ThirdParty/librailroad_dsl/lib/librailroad_dsl.dylib
else
librailroad_dsl: force
$(RUSTUP) target add $(RUST_NATIVE_TARGET)
cd submodules/railroad_dsl && MACOSX_DEPLOYMENT_TARGET=$(DEPLOYMENT_TARGET) $(RUSTUP) run stable cargo build --release --target $(RUST_NATIVE_TARGET) && cp target/$(RUST_NATIVE_TARGET)/release/librailroad_dsl.dylib ../../ThirdParty/librailroad_dsl/lib/librailroad_dsl.dylib && cp include/railroad_dsl.h ../../ThirdParty/librailroad_dsl/include && install_name_tool -id @rpath/librailroad_dsl.dylib ../../ThirdParty/librailroad_dsl/lib/librailroad_dsl.dylib
endif
pwmadapters: force
cd pwmplugin/ && UNIVERSAL=$(UNIVERSAL) ./build.sh
# Build, notarize, staple, and zip the companion consent plugin, then copy the
# notarized zip into the website repo's downloads folder. build.sh prompts for
# the notarization password, the EdDSA signing key, and the version.
companion-plugin: force
cd iTermCompanion && WEBSITE_DOWNLOADS="$(ITERM2_WEBSITE)/downloads/companion-plugin" ./build.sh
# Archive the iOS Companion app (Release) and export a signed App Store .ipa,
# the same Release product Xcode's Archive produces (production aps-environment).
# Upload it separately (Xcode Organizer, Transporter, or `xcrun altool
# --upload-app`); that step needs App Store Connect credentials.
companion-iphone-archive: force
cd Companion && xcodebuild -project iTerm2Companion.xcodeproj -scheme iTerm2Companion \
-configuration Release -destination 'generic/platform=iOS' \
-archivePath Build/ios/iTerm2Companion.xcarchive -allowProvisioningUpdates archive
cd Companion && xcodebuild -exportArchive \
-archivePath Build/ios/iTerm2Companion.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath Build/ios/export -allowProvisioningUpdates
@echo "Archive: Companion/Build/ios/iTerm2Companion.xcarchive"
@echo "IPA: Companion/Build/ios/export/"
it2cli: force
cd it2cli/ && UNIVERSAL=$(UNIVERSAL) ./build.sh
cp it2cli/.build/release/it2 it2cli/bin
# Limit PATH to system directories so SwiftPM clones dependencies with
# /usr/bin/git. The PATH set at the top of this file puts Homebrew first, and
# the sandbox blocks Homebrew's git, which fails a build with no cached checkouts.
paranoid-it2cli: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" PATH=/usr/bin:/bin:/usr/sbin:/sbin it2cli
cc-status: force
cd cc-status/ && ./build.sh
libgit2: force
mkdir -p submodules/libgit2/build
PATH=/usr/local/bin:${PATH} cd submodules/libgit2/build && ${CMAKE} -DBUILD_CLAR=OFF -DCMAKE_IGNORE_PREFIX_PATH=/opt/homebrew -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES="$(CMAKE_ARCHS)" -DCMAKE_OSX_DEPLOYMENT_TARGET="$(DEPLOYMENT_TARGET)" -DCMAKE_INSTALL_PREFIX=../../../ThirdParty/libgit2 -DUSE_SSH=OFF -DUSE_ICONV=OFF ..
PATH=/usr/local/bin:${PATH} cd submodules/libgit2/build && ${CMAKE} --build . --target install --parallel "$$(sysctl -n hw.ncpu)"
sparkle: force
rm -rf ThirdParty/Sparkle.framework
cd submodules/Sparkle && xcodebuild -scheme Sparkle -configuration Release 'CONFIGURATION_BUILD_DIR=$$(SRCROOT)/Build/$$(CONFIGURATION)' $(SIGNING_FLAGS) $(ARCH_FLAGS)
mv submodules/Sparkle/Build/Release/Sparkle.framework ThirdParty/Sparkle.framework
# The Sparkle subbuild signs its nested helpers (the Autoupdate tool and the
# Updater.app agent) ad-hoc, which fails notarization once embedded
# (CodeSignOnCopy does not re-sign them). When signing, re-sign them with
# Developer ID. See tools/sign_sparkle_helpers.sh.
ifdef SIGNED
tools/sign_sparkle_helpers.sh ThirdParty/Sparkle.framework
endif
paranoid-cc-status: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" cc-status
paranoid-CoreParse: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" CoreParse
paranoid-SwiftyMarkdown: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" SwiftyMarkdown
paranoid-deps: force
tools/check-submodule-cleanliness
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" deps
xcodebuild -version > last-xcode-version
paranoid-fatlibssh2: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" fatlibssh2
paranoid-BetterFontPicker: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" BetterFontPicker
paranoid-BetterFontPicker-Dev: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" BetterFontPicker-Dev
paranoid-libgit2: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" libgit2
paranoid-sparkle: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" sparkle
paranoid-fatlibsixel: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" fatlibsixel
paranoid-librailroad_dsl: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" librailroad_dsl
paranoid-ColorPicker: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" ColorPicker
paranoid-SearchableComboListView: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" SearchableComboListView
paranoid-pwmadapters: force
/usr/bin/sandbox-exec -f deps.sb $(MAKE) BUILD_DIR="$(BUILD_DIR)" pwmadapters
# You probably want make paranoid-deps to avoid depending on Homebrew stuff.
deps: force fatlibsixel CoreParse NMSSH bindeps libgit2 sparkle librailroad_dsl sfsymbolenum pwmadapters
sfsymbolenum:
cp submodules/SFSymbolEnum/Sources/SFSymbolEnum/* ThirdParty/SFSymbolEnum
cd submodules/SFSymbolEnum && swift generateSFSymbolEnum.swift --objc > ../../ThirdParty/SFSymbolEnum/SFSymbolEnum.h
cd submodules/SFSymbolEnum && swift generateSFSymbolEnum.swift --objc-impl > ../../ThirdParty/SFSymbolEnum/SFSymbolEnum.m
# Regenerate NSCharacterSet+iTerm.m and iTermCharacterSets.m from latest Unicode data.
# Run this when a new Unicode version is released.
unicode:
rm -rf tools/.unicode_cache
python3 tools/generate_nscharacterset.py
DepsIfNeeded: force
tools/rebuild-deps-if-needed
powerline-extra-symbols: force
cp submodules/powerline-extra-symbols/src/*eps ThirdParty/PowerlineExtraSymbols/
BetterFontPicker: force
cd BetterFontPicker && $(MAKE)
BetterFontPicker-Dev: force
cd BetterFontPicker && $(MAKE) dev
ColorPicker: force
cd ColorPicker && $(MAKE)
bindeps: SwiftyMarkdown Highlightr BetterFontPicker
$(MAKE) ColorPicker
$(MAKE) SearchableComboListView
SearchableComboListView: force
cd SearchableComboListView && $(MAKE)
SwiftyMarkdown: force
cd submodules/SwiftyMarkdown && xcodebuild -configuration Release 'CONFIGURATION_BUILD_DIR=$$(SRCROOT)/Build/$$(CONFIGURATION)' $(SIGNING_FLAGS) $(ARCH_FLAGS)
rm -rf ThirdParty/SwiftyMarkdown.framework
mv submodules/SwiftyMarkdown/Build/Release/SwiftyMarkdown.framework ThirdParty/SwiftyMarkdown.framework
Highlightr: force
cd submodules/Highlightr && xcodebuild -project Highlightr.xcodeproj -target Highlightr-macOS 'CONFIGURATION_BUILD_DIR=$$(SRCROOT)/Build/$$(CONFIGURATION)' $(SIGNING_FLAGS) $(ARCH_FLAGS)
rm -rf ThirdParty/Highlightr.framework
mv submodules/Highlightr/Build/Release/Highlightr.framework ThirdParty/Highlightr.framework
cleandeps: force
cd submodules/CoreParse/ && git clean -f -d .
cd submodules/NMSSH && git restore .
cd submodules/SwiftyMarkdown && git restore .
cd submodules/libsixel && git clean -f -d .
cd submodules/libssh2 && git clean -f -d .
cd submodules/openssl && git clean -f -d .
test: force
tools/run_tests.expect ModernTests
force: