> 태그> MSYS

MSYS

Jpegopitm를 MinGW로 컴파일 그 2

Jpegoptim.c 변경이지만 아래 변경 쪽이 수정 부분이 한 곳에 결정될하고 좋을지도.

@@ -53,6 +53,39 @@ #define ICC_IDENT_STRING "ICC_PROFILE\0" #define ICC_IDENT_STRING_SIZE 12 +#ifdef WIN32 +#define uid_t int +#define gid_t int +#define ROOT_UID 0 +#define ROOT_GID 0 +#define realpath(N,R) _fullpath((R),(N),_MAX_PATH) +uid_t getuid(void) +{ + return ROOT_UID; +} +uid_t geteuid(void) +{ + return ROOT_UID; +} +gid_t getgid(void) +{ + return ROOT_GID; +} +gid_t getegid(void) +{ + return ROOT_GID; +} +int setuid(uid_t uid) +{ + return (uid == ROOT_UID ? 0 : -1); +} +int setgid(gid_t gid) +{ + return (gid == ROOT_GID ? 0 : -1); +} + +#endif + void fatal(const char *msg); struct my_error_mgr { 

Jpegopitm를 MinGW로 컴파일

Jpegoptim 컴파일 잠시 비틀 거렸다 때문에 참고.

  1. msys / src / 디렉토리 아래에 jpegoptim-1.2.3을 압축하여 배포
  2. msys를 시작하고 다음 명령을 입력
     $ cd /src/jpegoptim-1.2.3/ $ autoconf $ configure 
  3. configure가 통하지 않고 다음 오류가 발생
     configure: error: cannot find install-sh, install.sh, or shtool in aux "."/aux 
  4. configure.in을 아래와 같이 수정
     @@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(jpegoptim.c) AC_CONFIG_HEADER(config.h) -AC_CONFIG_AUX_DIR(aux) +AC_CONFIG_AUX_DIR(sub) AC_CANONICAL_HOST 
  5. sub 폴더를 만들고 install-sh 등을 적당한 위치에서 가져온다 (예제에서는 Jpeglib에서)
     $ mkdir sub $ cp ../jpeg-6bx/install-sh ../jpeg-6bx/config.sub ../jpeg-6bx/config.guess ./sub 
  6. 다시 configure 파일을 생성하여 configure를 실행
     $ autoconf $ configure 
  7. configure 통과하면, make를 실행한다. 하면 아래의 오류가 발생
     jpegoptim.c:354: undefined reference to 'realpath' jpegoptim.c:354: undefined reference to 'realpath' 
  8. jpegoptim.c을 아래와 같이 수정
     @@ -351,7 +351,11 @@ } break; case 'd': - if (realpath(optarg,dest_path)==NULL || !is_directory(dest_path)) { +#ifdef WIN32 + if (_fullpath(dest_path,optarg,MAXPATHLEN)==NULL || !is_directory(dest_path)) { +#else + if (realpath(optarg,dest_path)==NULL || !is_directory(dest_path)) { +#endif fatal("invalid argument for option -d, --dest"); } if (verbose_mode) @@ -441,8 +445,13 @@ fatal("splitdir() failed!"); strncpy(newname,argv[i],sizeof(newname)); } - snprintf(tmpfilename,sizeof(tmpfilename), +#ifdef WIN32 + snprintf(tmpfilename,sizeof(tmpfilename), + "%sjpegoptim-%d.tmp", tmpdir, (int)getpid()); +#else + snprintf(tmpfilename,sizeof(tmpfilename), "%sjpegoptim-%d-%d.tmp", tmpdir, (int)getuid(), (int)getpid()); +#endif } retry_point: 
  9. 다시 make로 컴파일이 갔다.

aux는 것은 BSD 계열의 자취에서 install-sh 등의 보조 스크립트가 각 적혀있는 폴더이지만,
Windows에서는 aux라는 폴더는 DOS 특수 폴더의 흔적을 만들 수 없다.
그래서 참조를 "sub"로 변경하고 새롭게 "sub"폴더를 만들고 GNU 시스템 소프트웨어와 함께 제공되는 보조 스크립트 류를 포함했다.
또한 컴파일시 오류가 발생하는 realpath와 getuid는 POSIX 계열의 함수
Windows에는 존재하지 않기 때문에 비슷한 동작하는 것으로 대체하거나 삭제하고있다.
이번 예제에서는 컴파일을 통과 위해 realpath를 _fullpath로 대체했지만 더 예쁘게 고쳐 것이 좋겠다

> 태그> MSYS

검색
피드
번역
Japanese flagItalian flagKorean flagChinese (Simplified) flagChinese (Traditional) flagEnglish flagGerman flagFrench flagRussian flagVietnamese flagThai flag

페이지 상단으로 돌아가기