Add pdk build target to the Makefile and explain usage in the doc.
diff --git a/Makefile b/Makefile
index e0a9e5c..4513822 100644
--- a/Makefile
+++ b/Makefile
@@ -6,14 +6,18 @@
 ARCHIVES := $(shell find . -type f -name "*.gz")
 ARCHIVE_SOURCES := $(basename $(ARCHIVES))
 
+# PDK setup configs
+THREADS ?= $(shell nproc)
+STD_CELL_LIBRARY ?= sky130_fd_sc_hd
+SPECIAL_VOLTAGE_LIBRARY ?= sky130_fd_sc_hvl
+IO_LIBRARY ?= sky130_fd_io
+SKYWATER_COMMIT ?= ca58d58c07ab2dac53488df393da633fd5fb9a02
+OPEN_PDKS_COMMIT ?= b427e3bd10dcdc36891ae270a1ef0bd02602c553
 
 .DEFAULT_GOAL := ship
 # We need portable GDS_FILE pointers...
 .PHONY: ship
-ship: uncompress
-	ifndef PDK_ROOT
-	$(error PDK_ROOT is undefined, please export it before running make)
-	endif
+ship: check-env uncompress
 	@echo "###############################################"
 	@echo "Generating Caravel GDS (sources are in the 'gds' directory)"
 	@sleep 1
@@ -53,3 +57,50 @@
 .PHONY: uncompress
 uncompress: $(ARCHIVE_SOURCES)
 	@echo "All files are uncompressed!"
+
+.PHONY: pdk
+pdk: skywater-pdk skywater-library open_pdks build-pdk
+
+$(PDK_ROOT)/skywater-pdk:
+	git clone https://github.com/google/skywater-pdk.git $(PDK_ROOT)/skywater-pdk
+
+.PHONY: skywater-pdk
+skywater-pdk: check-env $(PDK_ROOT)/skywater-pdk
+	cd $(PDK_ROOT)/skywater-pdk && \
+		git checkout -qf $(SKYWATER_COMMIT)
+
+.PHONY: skywater-library
+skywater-library: check-env $(PDK_ROOT)/skywater-pdk
+	cd $(PDK_ROOT)/skywater-pdk && \
+		git submodule update --init libraries/$(STD_CELL_LIBRARY)/latest && \
+		git submodule update --init libraries/$(IO_LIBRARY)/latest && \
+		git submodule update --init libraries/$(SPECIAL_VOLTAGE_LIBRARY)/latest && \
+		$(MAKE) -j$(THREADS) timing
+
+### OPEN_PDKS
+$(PDK_ROOT)/open_pdks:
+	git clone https://github.com/RTimothyEdwards/open_pdks.git $(PDK_ROOT)/open_pdks
+
+.PHONY: open_pdks
+open_pdks: check-env $(PDK_ROOT)/open_pdks
+	cd $(PDK_ROOT)/open_pdks && \
+		git checkout -qf $(OPEN_PDKS_COMMIT)
+
+.PHONY: build-pdk
+build-pdk: check-env $(PDK_ROOT)/open_pdks $(PDK_ROOT)/skywater-pdk
+	[ -d $(PDK_ROOT)/sky130A ] && \
+		(echo "Warning: A sky130A build already exists under $(PDK_ROOT). It will be deleted first!" && \
+		sleep 5 && \
+		rm -rf $(PDK_ROOT)/sky130A) || \
+		true
+	cd $(PDK_ROOT)/open_pdks && \
+		./configure --with-sky130-source=$(PDK_ROOT)/skywater-pdk/libraries --with-sky130-local-path=$(PDK_ROOT) && \
+		cd sky130 && \
+		$(MAKE) veryclean && \
+		$(MAKE) && \
+		$(MAKE) install-local
+
+check-env:
+ifndef PDK_ROOT
+	$(error PDK_ROOT is undefined, please export it before running make)
+endif
\ No newline at end of file
diff --git a/README.md b/README.md
index 3e002ed..d05d9aa 100644
--- a/README.md
+++ b/README.md
@@ -15,19 +15,19 @@
 make uncompress
 ```
 
+Install the required version of the PDK by running the following commands:
+
+```bash
+export PDK_ROOT=<The place where you want to install the pdk>
+make pdk
+```
+
 Then, you can learn more about the caravel chip by watching these video:
 - Caravel User Project Features -- https://youtu.be/zJhnmilXGPo
 - Aboard Caravel -- How to put your design on Caravel? -- https://youtu.be/9QV8SDelURk
 - Things to Clarify About Caravel -- What versions to use with Caravel? -- https://youtu.be/-LZ522mxXMw
 
 ## Aboard Caravel:
-### Versions:
-- [OpenLANE](https://github.com/efabless/openlane) rc4 or rc5.
-- latest [Skywater-pdk](https://github.com/google/skywater-pdk).
-    - sky130_fd_sc_hd
-    - sky130_fd_sc_hvl
-    - sky130_fd_io
-- latest [open_pdks](https://github.com/RTimothyEdwards/open_pdks).
 
 Your area is the full user_project_wrapper, so feel free to add your project there or create a differnt macro and harden it seperately then insert it into the user_project_wrapper.
 
@@ -41,7 +41,7 @@
 Run the following command:
 
 ```bash
-export PDK_ROOT=<The place where the installed pdk resides>
+export PDK_ROOT=<The place where the installed pdk resides. The same PDK_ROOT used in the pdk installation step>
 make
 ```