-
Notifications
You must be signed in to change notification settings - Fork 1
/
build.html
153 lines (140 loc) · 12.2 KB
/
build.html
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
<!DOCTYPE html>
<html lang="vi">
<head>
<title>Tin tức Python PyMI.vn</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link href="https://n.pymi.vn/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Tin tức Python PyMI.vn Full Atom Feed" />
<!-- twitter card metadata -->
<meta name="twitter:site" content="">
<meta name="twitter:title" content="Build Python từ source trên Ubuntu 20.04">
<meta name="twitter:description" content="mất 5 phút, dành cho mục đích học tập và nghiên cứu...">
<!-- OG Tags -->
<meta property="og:url" content="./build.html"/>
<meta property="og:title" content="Build Python từ source trên Ubuntu 20.04 | Tin tức Python PyMI.vn" />
<meta property="og:description" content="mất 5 phút, dành cho mục đích học tập và nghiên cứu..." />
<!-- favicon -->
<!-- moment.js for date formatting -->
<script src="./theme/js/moment.js"></script>
<!-- css -->
<link rel="stylesheet" type="text/css" href="./theme/css/main.css" />
<script>
/*! grunt-grunticon Stylesheet Loader - v2.1.2 | https://github.com/filamentgroup/grunticon | (c) 2015 Scott Jehl, Filament Group, Inc. | MIT license. */
(function(e){function t(t,n,r,o){"use strict";function a(){for(var e,n=0;u.length>n;n++)u[n].href&&u[n].href.indexOf(t)>-1&&(e=!0);e?i.media=r||"all":setTimeout(a)}var i=e.document.createElement("link"),l=n||e.document.getElementsByTagName("script")[0],u=e.document.styleSheets;return i.rel="stylesheet",i.href=t,i.media="only x",i.onload=o||null,l.parentNode.insertBefore(i,l),a(),i}var n=function(r,o){"use strict";if(r&&3===r.length){var a=e.navigator,i=e.Image,l=!(!document.createElementNS||!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||e.opera&&-1===a.userAgent.indexOf("Chrome")||-1!==a.userAgent.indexOf("Series40")),u=new i;u.onerror=function(){n.method="png",n.href=r[2],t(r[2])},u.onload=function(){var e=1===u.width&&1===u.height,a=r[e&&l?0:e?1:2];n.method=e&&l?"svg":e?"datapng":"png",n.href=a,t(a,null,null,o)},u.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",document.documentElement.className+=" grunticon"}};n.loadCSS=t,e.grunticon=n})(this);(function(e,t){"use strict";var n=t.document,r="grunticon:",o=function(e){if(n.attachEvent?"complete"===n.readyState:"loading"!==n.readyState)e();else{var t=!1;n.addEventListener("readystatechange",function(){t||(t=!0,e())},!1)}},a=function(e){return t.document.querySelector('link[href$="'+e+'"]')},c=function(e){var t,n,o,a,c,i,u={};if(t=e.sheet,!t)return u;n=t.cssRules?t.cssRules:t.rules;for(var l=0;n.length>l;l++)o=n[l].cssText,a=r+n[l].selectorText,c=o.split(");")[0].match(/US\-ASCII\,([^"']+)/),c&&c[1]&&(i=decodeURIComponent(c[1]),u[a]=i);return u},i=function(e){var t,o,a;o="data-grunticon-embed";for(var c in e)if(a=c.slice(r.length),t=n.querySelectorAll(a+"["+o+"]"),t.length)for(var i=0;t.length>i;i++)t[i].innerHTML=e[c],t[i].style.backgroundImage="none",t[i].removeAttribute(o);return t},u=function(t){"svg"===e.method&&o(function(){i(c(a(e.href))),"function"==typeof t&&t()})};e.embedIcons=i,e.getCSS=a,e.getIcons=c,e.ready=o,e.svgLoadedCallback=u,e.embedSVG=u})(grunticon,this);
grunticon(["./theme/css/icons.data.svg.css", "./theme/css/icons.data.png.css", "./theme/css/icons.fallback.css"]);
</script>
<noscript><link href="./theme/css/icons.fallback.css" rel="stylesheet"></noscript>
<!-- menu toggle javascript -->
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", initMenu);
function initMenu(){
var menu = document.getElementById("menu");
var menulink = document.getElementById("menu-link");
menulink.addEventListener("click", function toggleMenu(){
window.event.preventDefault();
menulink.classList.toggle('active');
menu.classList.toggle('active');
});
};
</script>
<meta name="description" content="mất 5 phút, dành cho mục đích học tập và nghiên cứu..." />
<meta name="tags" content="build" />
<meta name="tags" content="source" />
<meta name="tags" content="C" />
</head>
<body>
<div role="banner" id="masthead">
<header>
<h1><a href="/">Pymiers's Blog</a></h1>
<a href="#menu" id="menu-link">more stuff</a>
<nav id="menu">
<ul>
<li><a href="./category/features.html">features</a></li>
<li class="active"><a href="./category/news.html">news</a></li>
<li><a href="./category/pymivn.html">pymi.vn</a></li>
</ul>
</nav>
</header>
</div>
<div class="page" role="main">
<div class="article" role="article">
<article>
<footer>
<a name="top"></a>
<p>
<time datetime=" 2021-10-03 00:00:00+07:00">
<script>document.write(moment('2021-10-03 00:00:00+07:00').format('LL'));</script>
</time>
</p>
</footer>
<header>
<h2>
Build Python từ source trên Ubuntu 20.04
</h2>
<center>
<h4>
by Pymier0
</h4>
</center>
</header>
<div class="content">
<p>Build phần mềm từ source dù là chuyện phổ biến trong giới mã nguồn mở từ xưa nhưng dần dần trở thành bí kíp thất
truyền với việc các package manager (như apt, yum, …) đều cài sẵn binary (sản phẩm của việc build).</p>
<p>Build từ source không tiện lợi cho mục đích cài phần mềm hàng ngày, nhưng là một kiến thức tốt trong học tập và nghiên cứu.</p>
<p>Build CPython bản mới nhất trên Ubuntu cũng không có khó khăn gì, mất khoảng 3-5 phút tùy tốc độ máy tính.</p>
<p><img alt="img" src="https://images.unsplash.com/photo-1570760295437-3627311f8fbe?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwyMzI1MzN8MHwxfHJhbmRvbXx8fHx8fHx8fDE2MzMyNzgzOTE&ixlib=rb-1.2.1&q=80&w=600"></p>
<h3>Chuẩn bị</h3>
<p>Để thực hiện bài này, cần có 4 phần mềm:</p>
<ul>
<li>curl để tải file source của Python</li>
<li>tar để giải nén</li>
<li>gcc có C compiler - để build</li>
<li>make để chạy lệnh build</li>
</ul>
<p>Chạy trên Ubuntu 20.04.3 <span class="caps">LTS</span></p>
<p>Cài:</p>
<div class="highlight"><pre><span></span><code>sudo apt update && sudo apt-get install -y curl make gcc tar
</code></pre></div>
<h3>Bắt đầu</h3>
<p>Tải từ trang chủ https://www.python.org/downloads/release/python-397/</p>
<div class="highlight"><pre><span></span><code>curl -LO https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz
</code></pre></div>
<p>Giải nén</p>
<div class="highlight"><pre><span></span><code>tar xf Python-3.9.7.tgz; cd Python-3.9.7
</code></pre></div>
<p>Build - theo hướng dẫn trong file <span class="caps">README</span>.rst</p>
<div class="highlight"><pre><span></span><code> ./configure
make
# make test
# sudo make install
</code></pre></div>
<p><code>configure</code> là 1 shell script, chạy các câu lệnh kiểm tra các điều kiện cần thiết (như có C compiler chưa, …) và sinh ra file Makefile.</p>
<p><code>make</code> chạy lệnh trong Makefile, nếu quá trình thành công sẽ tạo ra file <code>python</code>.</p>
<p>Đây chính là chương trình <code>python</code> thu được.</p>
<div class="highlight"><pre><span></span><code># ./python
Python 3.9.7 (default, Oct 3 2021, 16:21:43)
[GCC 9.3.0] on linux
</code></pre></div>
<p>Sau khi xong có thể chạy thêm <code>make test</code> để đảm bảo <code>python</code> chạy thành công các test, và <code>sudo make install</code> để cài vào máy thay Python trên máy.</p>
<p>Trong quá trình compile, người dùng sẽ nhìn thấy các thành phần của Python nằm ở file C code nào - không nhất thiết phải biết code C, nhưng ít ra biết nó ở đâu. Ví dụ:</p>
<div class="highlight"><pre><span></span><code><span class="nv">gcc</span><span class="w"> </span><span class="o">-</span><span class="nv">pthread</span><span class="w"> </span><span class="o">-</span><span class="nv">c</span><span class="w"> </span><span class="o">-</span><span class="nv">Wno</span><span class="o">-</span><span class="nv">unused</span><span class="o">-</span><span class="nb">result</span><span class="w"> </span><span class="o">-</span><span class="nv">Wsign</span><span class="o">-</span><span class="nv">compare</span><span class="w"> </span><span class="o">-</span><span class="nv">DNDEBUG</span><span class="w"> </span><span class="o">-</span><span class="nv">g</span><span class="w"> </span><span class="o">-</span><span class="nv">fwrapv</span><span class="w"> </span><span class="o">-</span><span class="nv">O3</span><span class="w"> </span><span class="o">-</span><span class="nv">Wall</span><span class="w"> </span><span class="o">-</span><span class="nv">std</span><span class="o">=</span><span class="nv">c99</span><span class="w"> </span><span class="o">-</span><span class="nv">Wextra</span><span class="w"> </span><span class="o">-</span><span class="nv">Wno</span><span class="o">-</span><span class="nv">unused</span><span class="o">-</span><span class="nb">result</span><span class="w"> </span><span class="o">-</span><span class="nv">Wno</span><span class="o">-</span><span class="nv">unused</span><span class="o">-</span><span class="nv">parameter</span><span class="w"> </span><span class="o">-</span><span class="nv">Wno</span><span class="o">-</span><span class="nv">missing</span><span class="o">-</span><span class="nv">field</span><span class="o">-</span><span class="nv">initializers</span><span class="w"> </span><span class="o">-</span><span class="nv">Werror</span><span class="o">=</span><span class="nv">implicit</span><span class="o">-</span><span class="nv">function</span><span class="o">-</span><span class="nv">declaration</span><span class="w"> </span><span class="o">-</span><span class="nv">fvisibility</span><span class="o">=</span><span class="nv">hidden</span><span class="w"> </span><span class="o">-</span><span class="nv">I</span>.<span class="o">/</span><span class="k">Include</span><span class="o">/</span><span class="nv">internal</span><span class="w"> </span><span class="o">-</span><span class="nv">I</span>.<span class="w"> </span><span class="o">-</span><span class="nv">I</span>.<span class="o">/</span><span class="k">Include</span><span class="w"> </span><span class="o">-</span><span class="nv">DPy_BUILD_CORE</span><span class="w"> </span><span class="o">-</span><span class="nv">o</span><span class="w"> </span><span class="nv">Objects</span><span class="o">/</span><span class="nv">listobject</span>.<span class="nv">o</span><span class="w"> </span><span class="nv">Objects</span><span class="o">/</span><span class="nv">listobject</span>.<span class="nv">c</span><span class="w"></span>
</code></pre></div>
<p>Hết.</p>
<p>Đăng ký ngay tại <a href="https://pymi.vn">PyMI.vn</a> để học Python tại Hà Nội <span class="caps">TP</span> <span class="caps">HCM</span> (Sài Gòn),
trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.</p>
</div>
<div class="back-to-top">
<a href="#top">back to top</a>
</div>
</article>
</div>
<!-- end article -->
<footer>
<div class="icons">
<a href="https://github.com/pymivn" target="_blank"><div class="icon-github icon"></div></a>
</div>
<p>© <script>document.write(moment().format('YYYY'));</script> Pymiers</p>
</footer>
</div>
</body>
</html>