Nhằm mục đích là PR cho UIT-LUG nên Team sẽ post một số bài hướng dẫn về lập trình trên Linux và một số kiến thức liên quan về Linux hơn nữa đây cũng coi như là nhật ký sổ tay ghi lại những điều đã học tránh bị quên sau khi học xong or nếu quên thì xem lại nhanh nhớ và có thể áp dụng liền.
Lịch: Team UIT-LUG sẽ sinh hoạt định kỳ vào Sáng thứ 2 hàng tuần bắt đầu từ lúc 8h00 am. Ai đi cũng được cả kéo thêm bạn bè đi càng tốt.
Về chương trình Split Join File là bài tập làm quen với lập trình trên môi trường Linux thời gian hoàn thành trong vòng 1 tuần và có 1 tuần để build nó đem cài thử vào máy mình và người khác.
Về yêu cầu và chức năng chính:
- Chương trình thực hiện bằng command argument như các chương trình khác trên linux.
Ví dụ với lệnh liệt kê các thư mục trong linux: ls liệt kê tất cả các thư mục và file của thư mục hiện tại ra, ls --help show ra phần hướng dẫn sử dụng, ls -a liệt kê ra tất cả file và thư mục kể cả thư mục và file ẩn.
Lưu ý: không phải là nhập từng bước như các bạn vẫn làm trên Lập trình C trên Windows
- split được file
- merge được file
- build bằng GNU Autotools và đem cài trên máy người khác được.
- Viết bằng C or C++ lý do là vì viết cái này thì ai cũng sẽ viết được vì đều đã học tin học đại cương or nói cách khác là không có sinh viên năm nhất ở đây.
Về các thành phần cần thiết khi lập trình và chạy chương trình.
- OS: 1 Distro bất kỳ của Linux có thể là Ubuntu (recommend), Fedora, Arch Linux, Linux Mint ....
- IDE: Eclipse (recommend), NetBeans, Code Blocks ...
- Compiler : GCC
- GNU AutoTools
- Google
....
Về cấu trúc chương trình.
- Source: gồm có các file sau: split.c split.h merge.c merge.h procedure.c procedure.h main.c
- Phần cài đặt gồm có: aclocal.m4 config.h.in Makefile README
AUTHORS configure.scan Makefile.am src
autom4te.cache config.log COPYING stamp-h1
autoscan.log config.status depcomp Makefile.in
ChangeLog configure INSTALL missing
config.h configure.ac install-sh NEWS
Về phần code:
- Split File
Ý tưởng: Để split file đầu tiên ta sẽ đọc file ghi vào buffer tiếp đó ta sẽ lần lượt đọc buffer theo 1 chu kỳ nhất định trong mỗi chu kỳ ta sẽ ghi vào từng file part với kích thước được đã được chia.
Một số hàm chính cần tìm hiểu:
___fread: http://www.cplusplus.com/reference/c.../cstdio/fread/
___fwrite: http://www.cplusplus.com/reference/c...cstdio/fwrite/
Một lưu ý nhỏ ở đây là về kiểu của các biến ở đây ta sẽ dùng kiểu unsigned long để lưu các buffer get từ file vì sao ư đoạn sau sẽ giải thích.
Quan trọng hơn nữa là ở việc chúng ta mở file ở đây chúng ta phải open file dưới mode là rb (read) or wb (write) or ab (append) để dùng. Vì sao ư? Đoạn sau sẽ giải thích.
- Get File Size: có nhiều cách nhưng cách đơn giản nhất là dùng thư viện cho nó đẹp cách khác là dùng fseek
Ở đây ta dùng thư viện "sys/stat.h" đây là thư viện chuẩn nên bạn không cần phải include từ 1 file nào ngoài cả.
- Merge file
Ý tưởng: tương tự như split file ta cũng đọc từng phần của các file part vừa đọc ta vừa ghi vào file merge.
Ở đây quan trọng là làm sao ta nhận ra file nào là file part nếu chúng ta muốn merge tự động.
Muốn làm được như thế ta sẽ xài thư viện "glob.h" http://pubs.opengroup.org/onlinepubs/007904875/basedefs/glob.h.html để matching các pattern mình định nghĩa.
Ở đây mình đã làm theo cách là gộp những file có đuôi là name + (.part0x) đi.
Ví dụ: mình nhập tên file cần join là Forrest Gump.mkv thì nó sẽ từ động tìm những file có tên là Forrest Gump.mkv.part1 , Forrest Gump.mkv.part2 ... để gộp lại thành file Forrest Gump.mkv
- Về phần nhập xuất màn hình theo argument ở đây chúng ta dùng hàm print_usage để in ra các dòng hướng dẫn của chương trình.
- Tiếp theo là các file header nơi khai báo những function đã viết.
- Để sử dụng chương trình bằng command argument như Linux thì bạn phải cần đọc cuốn Advanced Linux Prgramming, Page 20,Chapter 2, 2.1.3 Using getopt_long.
Tiện thể giới thiệu sơ qua cho các bạn về thư viện "getopt.h" http://www.gnu.org/software/gnulib/manual/html_node/getopt_002eh.html
Thư viện này cung cấp cho ta các struct để thực hiện bắt các argument của command nhập vào
chủ yếu dựa trên 2 struct sau
- short_options dùng để bắt các option no_argument
Một số chú ý trong code với option có required_argument thì phải có dấu ":" ở sau
- long_options dùng để bắt các option required_arguent
Để bắt được các options khi ta thực hiện
- Phần tiếp theo là Build và Install vào máy mình và người khác.
Requirement: GCC, GNU-Autotools.
Ví dụ trên Ubuntu có thể dùng lệnh sau để cài đặt:
sau khi cài đặt xong rồi chúng ta mới đi tiếp.
trước tiên gom những file source code (*.h, *c) của mình đã làm vào thư mục src.
tiếp theo chúng ta thử biên dịch bằng gcc và chạy thử.
Quá trình biên dịch bằng gcc gồm 2 bước sau
sau khi chạy 2 dòng sau chúng ta đã có chương trình main và có thể chạy thử bằng cách sử dụng
Để test.
Như vậy là chúng ta đã hoàn thành bước đầu tiên là đã buid và chạy được vào máy của mình. Nhưng chưa cài được.
Để cài đặt trên máy mình or máy người khác thì chúng ta phải đóng gói phần mềm chúng ta viết lại + phần mềm trong linux có một số điểm đặc biệt về việc dùng chung thư viện cũng như một số thứ khác nên việc đóng gói bằng tay sẽ gặp khó khăn và không chuyên nghiêp (thực ra với source code đơn giản thì có thể dùng được bằng cách đơn giản tạo Makefile) nên GNU đã tạo ra bộ công cụ chuẩn là GNU AutoTools để hỗ trợ chúng ta làm điều này.
Giới thiệu qua mời các bạn đọc sơ tài liệu ở đây http://autotoolset.sourceforge.net/tutorial.html#SEC40
Quote lại cho nhanh đọc như này dễ hiểu hơn là dịch.
Một tool thú vị trong bộ GNU Autools đó là autoscan. Tool này rất thông minh sẽ tự động scan source code và đưa ra cho chúng ta những gợi ý thiết thực cho việc configuration hỗ trợ việc đóng gói.
Đọc ở trên ta thấy rằng sản phẩm khi chạy autoscan sẽ là file configure.scan và hình thù file đó nó như thế này
Một số giải thích nhanh như sau:
AC_PREREQ([2.68]):
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]): Chứa thông tin của package gồm: FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS
AC_CONFIG_SRCDIR([src/merge.c]): Source folder ở đâu, ở đây chúng ta cho source nằm trong folder src/ và file chính của chương trình là main.c nên chúng ta phải chú ý ở đây vì đây là file nó tự động detect nên có thể không chính xác và đây là trường hợp đó.
AC_CONFIG_HEADERS([config.h]): cái này để nguyên vì đây là config.h tự động sinh ra chứ không phải là bỏ các file header của ta viết vào đây.
vậy chúng ta sẽ sao chép file này qua file configure.ac thôi. Có một chút chỉnh sửa và thêm như sau
Những dòng bôi đậm ở trên là những dòng đã được thay đổi or thêm. Điều này các bạn sẽ detect khi chạy lệnh
Tiếp theo chúng ta sẽ tạo file Makefile.am
Hình thù của file này khá đơn giản
dòng 1 bin_PROGRAM là chương trình biên dịch của mình có tên là gì?
dòng 2 (tên_chương_trình)_SOURCES = liệt kê tất cả các file đã viết ra bao gồm cả file header.
Tiếp theo chúng ta chạy lệnh
Để có 1 gói chuẩn thì chúng ta cần có những file này NEWS README AUTHORS ChangeLog.
Vì vậy chúng ta sẽ tạo nó
bước tiếp theo ta chạy lên
Bước tiếp là
để tạo ra package của phần mềm ta viết. Tới đây coi như hoàn thành ->> nhưng chưa biết có chạy được không )
Bước tiếp là testing
chúng ta sẽ chạy thử lệnh sau
Nếu kết quả ra như thế này thì có thể đúng
Để đem cài thì các bác đóng thành tar rồi share cho người khác
lệnh cài đơn giản gồm 3 bước
Tiếp tục chỉnh lý!
Lịch: Team UIT-LUG sẽ sinh hoạt định kỳ vào Sáng thứ 2 hàng tuần bắt đầu từ lúc 8h00 am. Ai đi cũng được cả kéo thêm bạn bè đi càng tốt.
Về chương trình Split Join File là bài tập làm quen với lập trình trên môi trường Linux thời gian hoàn thành trong vòng 1 tuần và có 1 tuần để build nó đem cài thử vào máy mình và người khác.
Về yêu cầu và chức năng chính:
- Chương trình thực hiện bằng command argument như các chương trình khác trên linux.
Ví dụ với lệnh liệt kê các thư mục trong linux: ls liệt kê tất cả các thư mục và file của thư mục hiện tại ra, ls --help show ra phần hướng dẫn sử dụng, ls -a liệt kê ra tất cả file và thư mục kể cả thư mục và file ẩn.
Lưu ý: không phải là nhập từng bước như các bạn vẫn làm trên Lập trình C trên Windows
- split được file
- merge được file
- build bằng GNU Autotools và đem cài trên máy người khác được.
- Viết bằng C or C++ lý do là vì viết cái này thì ai cũng sẽ viết được vì đều đã học tin học đại cương or nói cách khác là không có sinh viên năm nhất ở đây.
Về các thành phần cần thiết khi lập trình và chạy chương trình.
- OS: 1 Distro bất kỳ của Linux có thể là Ubuntu (recommend), Fedora, Arch Linux, Linux Mint ....
- IDE: Eclipse (recommend), NetBeans, Code Blocks ...
- Compiler : GCC
- GNU AutoTools
....
Về cấu trúc chương trình.
- Source: gồm có các file sau: split.c split.h merge.c merge.h procedure.c procedure.h main.c
- Phần cài đặt gồm có: aclocal.m4 config.h.in Makefile README
AUTHORS configure.scan Makefile.am src
autom4te.cache config.log COPYING stamp-h1
autoscan.log config.status depcomp Makefile.in
ChangeLog configure INSTALL missing
config.h configure.ac install-sh NEWS
Về phần code:
- Split File
Ý tưởng: Để split file đầu tiên ta sẽ đọc file ghi vào buffer tiếp đó ta sẽ lần lượt đọc buffer theo 1 chu kỳ nhất định trong mỗi chu kỳ ta sẽ ghi vào từng file part với kích thước được đã được chia.
Một số hàm chính cần tìm hiểu:
___fread: http://www.cplusplus.com/reference/c.../cstdio/fread/
___fwrite: http://www.cplusplus.com/reference/c...cstdio/fwrite/
Một lưu ý nhỏ ở đây là về kiểu của các biến ở đây ta sẽ dùng kiểu unsigned long để lưu các buffer get từ file vì sao ư đoạn sau sẽ giải thích.
Quan trọng hơn nữa là ở việc chúng ta mở file ở đây chúng ta phải open file dưới mode là rb (read) or wb (write) or ab (append) để dùng. Vì sao ư? Đoạn sau sẽ giải thích.
Code:
int split_by_part(char *filepartName, unsigned int part) { FILE *fRead; unsigned long fileSize; // file Size unsigned char * buffer; unsigned long result; // Read fRead = fopen(filepartName, "rb"); if (fRead == NULL) { fputs("File error", stderr); exit(1); } // get file size fileSize = get_file_size(filepartName); // allocate memory to contain the whole file: buffer = (char*) malloc(sizeof(char) * fileSize); if (buffer == NULL) { fputs("Memory error", stderr); exit(2); } // create part int i = 1; unsigned long partSize; partSize = fileSize / part; while (result = fread(buffer, 1, partSize, fRead) && i <= part) { FILE * fWrite; char *partName; partName = malloc(strlen(filepartName) + 4); sprintf(partName, "%s.part%d", filepartName, i); // last past if (i == part) { partSize = fileSize - partSize * (i - 1); } // write file fWrite = fopen(partName, "wb"); fwrite(buffer, 1, partSize, fWrite); fclose(fWrite); i++; free(partName); } // terminate fclose(fRead); free(buffer); return 0; }
Ở đây ta dùng thư viện "sys/stat.h" đây là thư viện chuẩn nên bạn không cần phải include từ 1 file nào ngoài cả.
Code:
unsigned long get_file_size(char *filename) { struct stat st; if (stat(filename, &st) == 0) return st.st_size; fprintf(stderr, "Cannot determine size of: %s\n", filename); return -1; }
Ý tưởng: tương tự như split file ta cũng đọc từng phần của các file part vừa đọc ta vừa ghi vào file merge.
Ở đây quan trọng là làm sao ta nhận ra file nào là file part nếu chúng ta muốn merge tự động.
Muốn làm được như thế ta sẽ xài thư viện "glob.h" http://pubs.opengroup.org/onlinepubs/007904875/basedefs/glob.h.html để matching các pattern mình định nghĩa.
Ở đây mình đã làm theo cách là gộp những file có đuôi là name + (.part0x) đi.
Ví dụ: mình nhập tên file cần join là Forrest Gump.mkv thì nó sẽ từ động tìm những file có tên là Forrest Gump.mkv.part1 , Forrest Gump.mkv.part2 ... để gộp lại thành file Forrest Gump.mkv
Code:
int merge_file_by_parttern(char *filename) { glob_t globbuf; char pattern[255]; sprintf(pattern, "%s.part*", filename); switch (glob(pattern, GLOB_DOOFFS, NULL, &globbuf)) { case 0: break; case GLOB_NOSPACE: printf("Out of memory\n"); break; case GLOB_ABORTED: printf("Reading error\n"); break; case GLOB_NOMATCH: printf("No files found\n"); break; default: break; } char partname[255]; sprintf(partname, "%s", globbuf.gl_pathv[1]); // FILE *fWrite; fWrite = fopen(filename, "ab"); // get fileSize unsigned int i; unsigned long lSize; for (i = 0; i < globbuf.gl_pathc; i++) { printf("\n-------%s-------\n", globbuf.gl_pathv[i]); FILE *fRead; char *buffer; lSize = get_file_size(globbuf.gl_pathv[i]); buffer = malloc(lSize); fRead = fopen(globbuf.gl_pathv[i], "rb"); fread(buffer, 1, lSize, fRead); fwrite(buffer, 1, lSize, fWrite); fclose(fRead); free(buffer); } fclose(fWrite); return 0; }
- Về phần nhập xuất màn hình theo argument ở đây chúng ta dùng hàm print_usage để in ra các dòng hướng dẫn của chương trình.
Code:
/* * procedure.c * * Created on: Jul 31, 2012 * Author: sepdau */ #include "stdio.h" #include "stdlib.h" #include "procedure.h" void print_usage(FILE *stream, int exit_code) { fprintf(stream, "Split [s] or Join [j] File [inputfile ...] [size | part]\n"); fprintf(stream, "\t-h \t--help \tDisplay this help and exit\n" "\t-s \t--split=SIZE \tSplit File by Size\n" "\t-S \t--split-part=PART \tSplit File Into PART\n" "\t-J \t--join \tJoin File\n" "\t-v \t--version\n"); exit(exit_code); }
Code:
/* * merge.h * * Created on: Jul 31, 2012 * Author: sepdau */ #ifndef MERGE_H_INCLUDE #define MERGE_H_INCLUDE // function here unsigned long get_file_size(char *filename); int merge_file_by_parttern(char *filename); #endif
Code:
#ifndef SPLIT_H_INCLUDE #define SPLIT_H_INCLUDE // function unsigned long get_file_size(char *filename); int split_by_part(char *filepartName, unsigned int part); #endif /* SPLIT_H_ */
Code:
/* * procedure.h * * Created on: Jul 31, 2012 * Author: sepdau */ #ifndef PROCEDURE_H_INCLUDE #define PROCEDURE_H_INCLUDE void print_usage(FILE *stream, int exit_code); #endif /* PROCEDURE_H_ */
- Để sử dụng chương trình bằng command argument như Linux thì bạn phải cần đọc cuốn Advanced Linux Prgramming, Page 20,Chapter 2, 2.1.3 Using getopt_long.
Tiện thể giới thiệu sơ qua cho các bạn về thư viện "getopt.h" http://www.gnu.org/software/gnulib/manual/html_node/getopt_002eh.html
Thư viện này cung cấp cho ta các struct để thực hiện bắt các argument của command nhập vào
chủ yếu dựa trên 2 struct sau
Code:
const char* const short_options; const struct option long_options;
Một số chú ý trong code với option có required_argument thì phải có dấu ":" ở sau
Code:
const char* const short_options = "hs:S:j:v";
Code:
const struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "split", required_argument, NULL, 's' }, { "split_by_size", required_argument, NULL, 'S' }, { "join", required_argument, NULL, "j" }
Code:
next_option = getopt_long(argc, argv, short_options, long_options, NULL);
- Phần tiếp theo là Build và Install vào máy mình và người khác.
Requirement: GCC, GNU-Autotools.
Ví dụ trên Ubuntu có thể dùng lệnh sau để cài đặt:
Code:
sudo apt-get install gcc autocof automake libtool
trước tiên gom những file source code (*.h, *c) của mình đã làm vào thư mục src.
tiếp theo chúng ta thử biên dịch bằng gcc và chạy thử.
Quá trình biên dịch bằng gcc gồm 2 bước sau
Code:
gcc -c *.c gcc -o main *.o
Code:
./main -h ./main -v .....
Như vậy là chúng ta đã hoàn thành bước đầu tiên là đã buid và chạy được vào máy của mình. Nhưng chưa cài được.
Để cài đặt trên máy mình or máy người khác thì chúng ta phải đóng gói phần mềm chúng ta viết lại + phần mềm trong linux có một số điểm đặc biệt về việc dùng chung thư viện cũng như một số thứ khác nên việc đóng gói bằng tay sẽ gặp khó khăn và không chuyên nghiêp (thực ra với source code đơn giản thì có thể dùng được bằng cách đơn giản tạo Makefile) nên GNU đã tạo ra bộ công cụ chuẩn là GNU AutoTools để hỗ trợ chúng ta làm điều này.
Giới thiệu qua mời các bạn đọc sơ tài liệu ở đây http://autotoolset.sourceforge.net/tutorial.html#SEC40
Quote lại cho nhanh đọc như này dễ hiểu hơn là dịch.
- Autoconf produces a configuration shell script, named `configure', which probes the installer platform for portability related information which is required to customize makefiles, configuration header files, and other application specific files. Then it proceeds to generate customized versions of these files from generic templates. This way, the user will not need to customize these files manually.
- Automake produces makefile templates, `Makefile.in' to be used by Autoconf, from a very high level specification stored in a file called `Makefile.am'. Automake produces makefiles that conform to the GNU makefile standards, taking away the extraordinary effort required to produce them by hand. Automake requires Autoconf in order to be used properly.
- Libtool makes it possible to compile position independent code and build shared libraries in a portable manner. It does not require either Autoconf, or Automake and can be used independently. Automake however supports libtool and interoperates with it in a seamless manner.
- Autotoolset helps you develop portable source code that conforms to the GNU coding standards by generating various boilerplate files from which you can plunge into developing your software.
Một tool thú vị trong bộ GNU Autools đó là autoscan. Tool này rất thông minh sẽ tự động scan source code và đưa ra cho chúng ta những gợi ý thiết thực cho việc configuration hỗ trợ việc đóng gói.
autoscan is used to detect potential portability problems with alredy written programs. That is, it scans the programms and finds, for example, functions that are not installed on all platforms.Running autoscan checks configure.ac (or alternatively configure.in) for completeness and produces aautoscan is used to detect potential portability problems with alredy written programs. That is, it scans the programms and finds, for example, functions that are not installed on all platforms.Running autoscan checks configure.ac (or alternatively configure.in) for completeness and produces a configure.scan which gives hints as to what needs to go into the configure.ac.
The produced configure.scan can then be modified into a suitable configure.ac. which gives hints as to what needs to go into the configure.ac.
The produced configure.scan can then be modified into a suitable configure.ac.
The produced configure.scan can then be modified into a suitable configure.ac. which gives hints as to what needs to go into the configure.ac.
The produced configure.scan can then be modified into a suitable configure.ac.
Đọc ở trên ta thấy rằng sản phẩm khi chạy autoscan sẽ là file configure.scan và hình thù file đó nó như thế này
Code:
AC_PREREQ([2.68])AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([src/merge.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_FUNC_MALLOC AC_OUTPUT
Một số giải thích nhanh như sau:
AC_PREREQ([2.68]):
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]): Chứa thông tin của package gồm: FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS
AC_CONFIG_SRCDIR([src/merge.c]): Source folder ở đâu, ở đây chúng ta cho source nằm trong folder src/ và file chính của chương trình là main.c nên chúng ta phải chú ý ở đây vì đây là file nó tự động detect nên có thể không chính xác và đây là trường hợp đó.
AC_CONFIG_HEADERS([config.h]): cái này để nguyên vì đây là config.h tự động sinh ra chứ không phải là bỏ các file header của ta viết vào đây.
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_FUNC_MALLOC: cái này oánh dấu là chúng ta đã xài hàm malloc trong chương trình nên phải khai báo cho nó biết.
AC_OUTPUT
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_FUNC_MALLOC: cái này oánh dấu là chúng ta đã xài hàm malloc trong chương trình nên phải khai báo cho nó biết.
AC_OUTPUT
Code:
AC_PREREQ([2.68])[B]AC_INIT(sjf, 0.0.1, giaosudau@gmail.com)[/B] [B]AM_INIT_AUTOMAKE[/B] [B]AC_CONFIG_SRCDIR([src/main.c])[/B] AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_FUNC_MALLOC [B]AC_CONFIG_FILES([Makefile])[/B] AC_OUTPUT
Những dòng bôi đậm ở trên là những dòng đã được thay đổi or thêm. Điều này các bạn sẽ detect khi chạy lệnh
Code:
aclocal
aclocal must be run in order to create aclocal.m4. As far as I can see, the idea is to put all m4 macros used for deployment into aclocal.m4 so that the machines, on which a program is going to be installed, are not dependent on automake and the like.
Tiếp theo chúng ta sẽ tạo file Makefile.am
Makefile.am is processed by automake.
The commands in a Makefile.am file mostly look like variable assignment.
The commands in a Makefile.am file mostly look like variable assignment.
Hình thù của file này khá đơn giản
Code:
bin_PROGRAMS = sjf sjf_SOURCES = main.c split.c split.h merge.c merge.h procedure.c procedure.h
dòng 2 (tên_chương_trình)_SOURCES = liệt kê tất cả các file đã viết ra bao gồm cả file header.
Tiếp theo chúng ta chạy lệnh
Code:
[COLOR=#10205F]autoheader[/COLOR]
autoheader can be used to create an initialtemplate header file: config.h.in (or config.in, see AM_CONFIG_HEADER)
Vì vậy chúng ta sẽ tạo nó
Code:
[COLOR=#10205F]touch NEWS README AUTHORS ChangeLog[/COLOR]
Code:
automake -a
autoconf is part of the autoconf package.autoconf determines what the system is capable of. That is, which function exist and the like. Additionally, it finds the location of programms needed to build a program. It is part of autotools.
autoconf produces the configure script.
autoconf produces the configure script.
Code:
autoconf
Bước tiếp là testing
chúng ta sẽ chạy thử lệnh sau
Code:
./confugure
Code:
[LEFT][COLOR=#333333][FONT=lucida grande]sepdau@vnexplorer:~/workspace/[/FONT][/COLOR][COLOR=#333333][FONT=lucida grande]split$ ./configure [/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking for a BSD-compatible install... /usr/bin/install -c[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking whether build environment is sane... yes[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking for a thread-safe mkdir -p... /bin/mkdir -p[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking for gawk... gawk[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking whether make sets $(MAKE)... yes[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking for gcc... gcc[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking whether the C compiler works... yes[/FONT][/COLOR] [COLOR=#333333][FONT=lucida grande]checking for C compiler default output file name.[/FONT][/COLOR][COLOR=#333333][FONT=lucida grande].. a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking for stdlib.h... (cached) yes checking for GNU libc compatible malloc... yes configure: creating ./config.status config.status: creating Makefile config.status: creating config.h config.status: executing depfiles commands[/FONT][/COLOR][/LEFT]
lệnh cài đơn giản gồm 3 bước
Code:
./configure make sudo make install
Tiếp tục chỉnh lý!
Comment