mirror of
https://github.com/gen2brain/cbconvert
synced 2026-06-30 09:11:54 +02:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ddb4d92aa | |||
| b1e9763b0b | |||
| 14bfaf7b6e | |||
| 3dcfc1dd5e | |||
| 2c3fb88e7e | |||
| 5c5352182f | |||
| f490c97974 | |||
| 7a0c108fd1 | |||
| e819224725 |
@@ -6,12 +6,11 @@ Introduction
|
||||
|
||||
CBconvert is a [Comic Book](http://en.wikipedia.org/wiki/Comic_Book_Archive_file) convert tool.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
- reads rar, zip, 7z, gz, bz2, cbr, cbz, cb7, cbt, pdf and plain directory
|
||||
- always saves processed comic in cbz (zip) format
|
||||
- reads RAR, ZIP, 7Z, GZ, BZ2, CBR, CBZ, CB7, CBT, PDF, EPUB, XPS and plain directory
|
||||
- always saves processed comic in CBZ (ZIP) format
|
||||
- images can be converted to JPEG, PNG or 4-Bit BMP (16 colors) format
|
||||
- choose resize algorithm (NearestNeighbor, Bilinear, Bicubic, MitchellNetravali, Lanczos2/3)
|
||||
- export covers from comics
|
||||
@@ -20,33 +19,8 @@ Features
|
||||
Download
|
||||
--------
|
||||
|
||||
- [Windows static build](https://github.com/gen2brain/cbconvert/releases/download/0.1.0/bukanir-0.1.0.zip)
|
||||
- [Linux 64bit build](https://github.com/gen2brain/cbconvert/releases/download/0.1.0/bukanir-0.1.0.tar.gz)
|
||||
|
||||
Compile
|
||||
-------
|
||||
|
||||
Install poppler, poppler-glib, cairo, libarchive and imagemagick dev packages:
|
||||
|
||||
apt-get install libpoppler-glib-dev libcairo2-dev libarchive-dev libmagickcore-dev libmagickwand-dev
|
||||
|
||||
Install go package:
|
||||
|
||||
go get github.com/gen2brain/cbconvert
|
||||
go install github.com/gen2brain/cbconvert && cbconvert
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
go get github.com/MStoykov/go-libarchive
|
||||
go get github.com/cheggaaa/go-poppler
|
||||
go get github.com/cheggaaa/pb
|
||||
go get github.com/gographics/imagick/imagick
|
||||
go get github.com/hotei/bmp
|
||||
go get github.com/nfnt/resize
|
||||
go get github.com/skarademir/naturalsort
|
||||
go get github.com/ungerik/go-cairo
|
||||
go get gopkg.in/alecthomas/kingpin.v2
|
||||
- [Windows static build](https://github.com/gen2brain/cbconvert/releases/download/0.2.0/cbconvert-0.2.0.zip)
|
||||
- [Linux 64bit build](https://github.com/gen2brain/cbconvert/releases/download/0.2.0/cbconvert-0.2.0.tar.gz)
|
||||
|
||||
Using
|
||||
-----
|
||||
@@ -71,7 +45,7 @@ Using
|
||||
-o, --outdir="." output directory
|
||||
-m, --size=0 process only files larger then size (in MB)
|
||||
-r, --recursive process subdirectories recursively
|
||||
-v, --quiet hide console output
|
||||
-Q, --quiet hide console output
|
||||
|
||||
Args:
|
||||
<args> filename or directory
|
||||
@@ -80,14 +54,55 @@ Using
|
||||
Examples
|
||||
--------
|
||||
|
||||
Rescale images to 1200px for all supported files found in directory with size larger then 60MB:
|
||||
|
||||
cbconvert --recursive --width 1200 --size 60 /media/comics/Thorgal/
|
||||
|
||||
Rescale images to 1200px for all supported files found in directory with size larger then 60MB.
|
||||
Convert all images in archive to 4bit BMP image and save result in ~/comics directory:
|
||||
|
||||
cbconvert --bmp --outdir ~/comics /media/comics/Garfield/Garfield_01.cbz
|
||||
|
||||
Convert all images in archive to 4bit BMP image and save result in ~/comics directory. [BMP](http://en.wikipedia.org/wiki/BMP_file_format) format is uncompressed, for black&white pages very good choice. Archive size can be smaller 2-3x and file will be readable by comic readers.
|
||||
[BMP](http://en.wikipedia.org/wiki/BMP_file_format) format is uncompressed, for black&white pages very good choice. Archive size can be smaller 2-3x and file will be readable by comic readers.
|
||||
|
||||
Generate thumbnails by freedesktop specification in ~/.thumbnails/normal directory, Lanczos3 algorithm is used for resizing:
|
||||
|
||||
cbconvert --interpolation=5 --outdir ~/.thumbnails/normal --thumbnail /media/comics/GrooTheWanderer/
|
||||
|
||||
Generate thumbnails by freedesktop specification in ~/.thumbnails/normal directory, Lanczos3 algorithm is used for resizing.
|
||||
Compile
|
||||
-------
|
||||
|
||||
Install imagemagick dev packages:
|
||||
|
||||
apt-get install libmagickcore-dev libmagickwand-dev
|
||||
|
||||
Compile latest MuPDF:
|
||||
|
||||
git clone git://git.ghostscript.com/mupdf.git && cd mupdf
|
||||
git submodule update --init --recursive
|
||||
HAVE_X11=no HAVE_GLFW=no HAVE_GLUT=no WANT_CURL=no make && make install
|
||||
|
||||
Compile unarr library:
|
||||
|
||||
git clone https://github.com/zeniko/unarr && cd unarr
|
||||
mkdir lzma920 && cd lzma920 && curl -L http://www.7-zip.org/a/lzma920.tar.bz2 | tar -xjvp && cd ..
|
||||
curl -L http://zlib.net/zlib-1.2.8.tar.gz | tar -xzvp
|
||||
curl -L http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz | tar -xzvp
|
||||
curl -L https://gist.githubusercontent.com/gen2brain/89fe506863be3fb139e8/raw/8783a7d81e22ad84944d146c5e33beab6dffc641/unarr-makefile.patch | patch -p1
|
||||
CFLAGS="-DHAVE_7Z -DHAVE_ZLIB -DHAVE_BZIP2 -I./lzma920/C -I./zlib-1.2.8 -I./bzip2-1.0.6" make
|
||||
cp build/debug/libunarr.a /usr/lib64/ && cp unarr.h /usr/include
|
||||
|
||||
Install dependencies:
|
||||
|
||||
go get github.com/cheggaaa/pb
|
||||
go get github.com/gen2brain/go-fitz
|
||||
go get github.com/gen2brain/go-unarr
|
||||
go get github.com/gographics/imagick/imagick
|
||||
go get github.com/hotei/bmp
|
||||
go get github.com/nfnt/resize
|
||||
go get github.com/skarademir/naturalsort
|
||||
go get gopkg.in/alecthomas/kingpin.v2
|
||||
|
||||
Install go package:
|
||||
|
||||
go get github.com/gen2brain/cbconvert
|
||||
go install github.com/gen2brain/cbconvert
|
||||
|
||||
+116
-112
@@ -39,9 +39,9 @@ import (
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/MStoykov/go-libarchive"
|
||||
"github.com/cheggaaa/go-poppler"
|
||||
"github.com/cheggaaa/pb"
|
||||
"github.com/gen2brain/go-fitz"
|
||||
"github.com/gen2brain/go-unarr"
|
||||
"github.com/gographics/imagick/imagick"
|
||||
_ "github.com/hotei/bmp"
|
||||
"github.com/nfnt/resize"
|
||||
@@ -154,17 +154,17 @@ func convertImage(img image.Image, index int, pathName string) {
|
||||
<-throttle
|
||||
}
|
||||
|
||||
// Converts pdf file to cbz
|
||||
func convertPDF(file string) {
|
||||
// Converts PDF/EPUB/XPS document to CBZ
|
||||
func convertDocument(file string) {
|
||||
workdir, _ = ioutil.TempDir(os.TempDir(), "cbc")
|
||||
|
||||
doc, err := poppler.Open(file)
|
||||
doc, err := fitz.NewDocument(file)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Skipping %s, error: %v", file, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
npages := doc.GetNPages()
|
||||
npages := doc.Pages()
|
||||
|
||||
var bar *pb.ProgressBar
|
||||
if !opts.Quiet {
|
||||
@@ -179,89 +179,79 @@ func convertPDF(file string) {
|
||||
bar.Increment()
|
||||
}
|
||||
|
||||
page := doc.GetPage(n)
|
||||
images := page.Images()
|
||||
img, err := doc.Image(n)
|
||||
|
||||
if len(images) == 1 {
|
||||
if err == nil && img != nil {
|
||||
throttle <- 1
|
||||
wg.Add(1)
|
||||
|
||||
surface := images[0].GetSurface()
|
||||
go convertImage(surface.GetImage(), page.Index(), "")
|
||||
} else {
|
||||
// FIXME merge images?
|
||||
go convertImage(img, n, "")
|
||||
}
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
// Converts archive to cbz
|
||||
// Converts archive to CBZ
|
||||
func convertArchive(file string) {
|
||||
workdir, _ = ioutil.TempDir(os.TempDir(), "cbc")
|
||||
|
||||
f, err := os.Open(file)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error Open: %v\n", err.Error())
|
||||
return
|
||||
}
|
||||
defer f.Close()
|
||||
ncontents := len(listArchive(file))
|
||||
|
||||
reader, err := archive.NewReader(f)
|
||||
archive, err := unarr.NewArchive(file)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error NewReader: %v\n", err.Error())
|
||||
}
|
||||
defer reader.Free()
|
||||
defer reader.Close()
|
||||
defer archive.Close()
|
||||
|
||||
var bar *pb.ProgressBar
|
||||
if !opts.Quiet {
|
||||
s, _ := f.Stat()
|
||||
bar = pb.New(int(s.Size()))
|
||||
bar.SetUnits(pb.U_BYTES)
|
||||
bar = pb.New(ncontents)
|
||||
bar.ShowTimeLeft = false
|
||||
bar.Prefix(fmt.Sprintf("Converting %d of %d: ", current, nfiles))
|
||||
bar.Start()
|
||||
}
|
||||
|
||||
for {
|
||||
entry, err := reader.Next()
|
||||
err := archive.Entry()
|
||||
if err != nil {
|
||||
if err == archive.ErrArchiveEOF {
|
||||
if err == io.EOF {
|
||||
break
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "Error Next: %v\n", err.Error())
|
||||
fmt.Fprintf(os.Stderr, "Error Entry: %v\n", err.Error())
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
stat := entry.Stat()
|
||||
if stat.Mode()&os.ModeType != 0 || stat.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
if !opts.Quiet {
|
||||
size := reader.Size()
|
||||
bar.Set(size)
|
||||
bar.Increment()
|
||||
}
|
||||
|
||||
pathname := entry.PathName()
|
||||
size := archive.Size()
|
||||
pathname := archive.Name()
|
||||
|
||||
buf := make([]byte, size)
|
||||
for size > 0 {
|
||||
n, err := archive.Read(buf)
|
||||
if err != nil && err != io.EOF {
|
||||
break
|
||||
}
|
||||
size -= n
|
||||
}
|
||||
|
||||
if size > 0 {
|
||||
fmt.Printf("Error Read\n")
|
||||
continue
|
||||
}
|
||||
|
||||
if isImage(pathname) {
|
||||
buf := new(bytes.Buffer)
|
||||
_, err := buf.ReadFrom(reader)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error ReadFrom: %v\n", err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
img, err := decodeImage(bytes.NewReader(buf.Bytes()), pathname)
|
||||
img, err := decodeImage(bytes.NewReader(buf), pathname)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error Decode: %v\n", err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
if opts.NoRGB && !isGrayScale(img) {
|
||||
copyFile(bytes.NewReader(buf.Bytes()), filepath.Join(workdir, filepath.Base(pathname)))
|
||||
copyFile(bytes.NewReader(buf), filepath.Join(workdir, filepath.Base(pathname)))
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -271,13 +261,13 @@ func convertArchive(file string) {
|
||||
go convertImage(img, 0, pathname)
|
||||
}
|
||||
} else {
|
||||
copyFile(reader, filepath.Join(workdir, filepath.Base(pathname)))
|
||||
copyFile(bytes.NewReader(buf), filepath.Join(workdir, filepath.Base(pathname)))
|
||||
}
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
// Converts directory to cbz
|
||||
// Converts directory to CBZ
|
||||
func convertDirectory(path string) {
|
||||
workdir, _ = ioutil.TempDir(os.TempDir(), "cbc")
|
||||
|
||||
@@ -324,7 +314,7 @@ func convertDirectory(path string) {
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
// Saves workdir to cbz archive
|
||||
// Saves workdir to CBZ archive
|
||||
func saveArchive(file string) {
|
||||
defer os.RemoveAll(workdir)
|
||||
|
||||
@@ -368,64 +358,72 @@ func saveArchive(file string) {
|
||||
z.Close()
|
||||
}
|
||||
|
||||
// Unpacks archive to directory
|
||||
func unpackArchive(file string, dir string) {
|
||||
f, err := os.Open(file)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error Open: %v\n", err.Error())
|
||||
return
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
reader, err := archive.NewReader(f)
|
||||
// Lists contents of archive
|
||||
func listArchive(file string) []string {
|
||||
var contents []string
|
||||
archive, err := unarr.NewArchive(file)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error NewReader: %v\n", err.Error())
|
||||
return
|
||||
}
|
||||
defer reader.Free()
|
||||
defer reader.Close()
|
||||
defer archive.Close()
|
||||
|
||||
for {
|
||||
entry, err := reader.Next()
|
||||
err := archive.Entry()
|
||||
if err != nil {
|
||||
if err == archive.ErrArchiveEOF {
|
||||
if err == io.EOF {
|
||||
break
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "Error Entry: %v\n", err.Error())
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if entry.Stat().Mode()&os.ModeType == 0 {
|
||||
err = copyFile(reader, filepath.Join(dir, entry.PathName()))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error: %v\n", err.Error())
|
||||
}
|
||||
pathname := archive.Name()
|
||||
contents = append(contents, pathname)
|
||||
}
|
||||
|
||||
return contents
|
||||
}
|
||||
|
||||
// Extracts cover from archive
|
||||
func coverArchive(file string) (image.Image, error) {
|
||||
tmpdir, _ := ioutil.TempDir(os.TempDir(), "cbc")
|
||||
defer os.RemoveAll(tmpdir)
|
||||
var images []string
|
||||
|
||||
unpackArchive(file, tmpdir)
|
||||
|
||||
images := getImages(tmpdir)
|
||||
if len(images) == 0 {
|
||||
return nil, errors.New("No images")
|
||||
contents := listArchive(file)
|
||||
for _, c := range contents {
|
||||
if isImage(c) {
|
||||
images = append(images, c)
|
||||
}
|
||||
}
|
||||
|
||||
cover := getCover(images)
|
||||
|
||||
p, err := os.Open(cover)
|
||||
archive, err := unarr.NewArchive(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer p.Close()
|
||||
defer archive.Close()
|
||||
|
||||
img, err := decodeImage(p, cover)
|
||||
err = archive.EntryFor(cover)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
size := archive.Size()
|
||||
buf := make([]byte, size)
|
||||
for size > 0 {
|
||||
n, err := archive.Read(buf)
|
||||
if err != nil && err != io.EOF {
|
||||
break
|
||||
}
|
||||
size -= n
|
||||
}
|
||||
|
||||
if size > 0 {
|
||||
return nil, errors.New("Error Read")
|
||||
}
|
||||
|
||||
img, err := decodeImage(bytes.NewReader(buf), cover)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -433,28 +431,23 @@ func coverArchive(file string) (image.Image, error) {
|
||||
return img, nil
|
||||
}
|
||||
|
||||
// Extracts cover from pdf
|
||||
func coverPDF(file string) (image.Image, error) {
|
||||
doc, err := poppler.Open(file)
|
||||
// Extracts cover from document
|
||||
func coverDocument(file string) (image.Image, error) {
|
||||
doc, err := fitz.NewDocument(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
page := doc.GetPage(0)
|
||||
images := page.Images()
|
||||
|
||||
if len(images) == 1 {
|
||||
surface := images[0].GetSurface()
|
||||
img := surface.GetImage()
|
||||
|
||||
if img == nil {
|
||||
return nil, errors.New("Image is nil")
|
||||
}
|
||||
|
||||
return img, nil
|
||||
img, err := doc.Image(0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
if img == nil {
|
||||
return nil, errors.New("Image is nil")
|
||||
}
|
||||
|
||||
return img, nil
|
||||
}
|
||||
|
||||
// Extracts cover from directory
|
||||
@@ -487,7 +480,7 @@ func getFiles() []string {
|
||||
|
||||
walkFiles := func(fp string, f os.FileInfo, err error) error {
|
||||
if !f.IsDir() {
|
||||
if isComic(fp) {
|
||||
if isArchive(fp) || isDocument(fp) {
|
||||
if isSize(f.Size()) {
|
||||
files = append(files, fp)
|
||||
}
|
||||
@@ -505,7 +498,7 @@ func getFiles() []string {
|
||||
}
|
||||
|
||||
if !stat.IsDir() {
|
||||
if isComic(path) {
|
||||
if isArchive(path) || isDocument(path) {
|
||||
if isSize(stat.Size()) {
|
||||
files = append(files, path)
|
||||
}
|
||||
@@ -516,7 +509,7 @@ func getFiles() []string {
|
||||
} else {
|
||||
fs, _ := ioutil.ReadDir(path)
|
||||
for _, f := range fs {
|
||||
if isComic(f.Name()) {
|
||||
if isArchive(f.Name()) || isArchive(f.Name()) {
|
||||
if isSize(f.Size()) {
|
||||
files = append(files, f.Name())
|
||||
}
|
||||
@@ -534,7 +527,7 @@ func getFiles() []string {
|
||||
return files
|
||||
}
|
||||
|
||||
// Returns sorted list of found image files for given directory
|
||||
// Returns list of found image files for given directory
|
||||
func getImages(path string) []string {
|
||||
var images []string
|
||||
|
||||
@@ -578,9 +571,20 @@ func getCover(images []string) string {
|
||||
}
|
||||
|
||||
// Checks if file is comic
|
||||
func isComic(f string) bool {
|
||||
var types = []string{".rar", ".zip", ".7z", ".gz", ".bz2",
|
||||
".cbr", ".cbz", ".cb7", ".cbt", ".pdf"}
|
||||
func isArchive(f string) bool {
|
||||
var types = []string{".rar", ".zip", ".7z", ".gz",
|
||||
".bz2", ".cbr", ".cbz", ".cb7", ".cbt"}
|
||||
for _, t := range types {
|
||||
if strings.ToLower(filepath.Ext(f)) == t {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Checks if file is document
|
||||
func isDocument(f string) bool {
|
||||
var types = []string{".pdf", ".epub", ".xps"}
|
||||
for _, t := range types {
|
||||
if strings.ToLower(filepath.Ext(f)) == t {
|
||||
return true
|
||||
@@ -663,8 +667,8 @@ func extractCover(file string, info os.FileInfo) {
|
||||
var cover image.Image
|
||||
if info.IsDir() {
|
||||
cover, err = coverDirectory(file)
|
||||
} else if strings.ToLower(filepath.Ext(file)) == ".pdf" {
|
||||
cover, err = coverPDF(file)
|
||||
} else if isDocument(file) {
|
||||
cover, err = coverDocument(file)
|
||||
} else {
|
||||
cover, err = coverArchive(file)
|
||||
}
|
||||
@@ -696,8 +700,8 @@ func extractThumbnail(file string, info os.FileInfo) {
|
||||
var cover image.Image
|
||||
if info.IsDir() {
|
||||
cover, err = coverDirectory(file)
|
||||
} else if strings.ToLower(filepath.Ext(file)) == ".pdf" {
|
||||
cover, err = coverPDF(file)
|
||||
} else if isDocument(file) {
|
||||
cover, err = coverDocument(file)
|
||||
} else {
|
||||
cover, err = coverArchive(file)
|
||||
}
|
||||
@@ -747,8 +751,8 @@ func convertComic(file string, info os.FileInfo) {
|
||||
if info.IsDir() {
|
||||
convertDirectory(file)
|
||||
saveArchive(file)
|
||||
} else if strings.ToLower(filepath.Ext(file)) == ".pdf" {
|
||||
convertPDF(file)
|
||||
} else if isDocument(file) {
|
||||
convertDocument(file)
|
||||
saveArchive(file)
|
||||
} else {
|
||||
convertArchive(file)
|
||||
@@ -759,7 +763,7 @@ func convertComic(file string, info os.FileInfo) {
|
||||
// Parses command line flags
|
||||
func parseFlags() {
|
||||
opts = options{}
|
||||
kingpin.Version("CBconvert 0.1.0")
|
||||
kingpin.Version("CBconvert 0.3.0")
|
||||
kingpin.CommandLine.Help = "Comic Book convert tool."
|
||||
kingpin.Flag("png", "encode images to PNG instead of JPEG").Short('p').BoolVar(&opts.ToPNG)
|
||||
kingpin.Flag("bmp", "encode images to 4-Bit BMP instead of JPEG").Short('b').BoolVar(&opts.ToBMP)
|
||||
@@ -775,7 +779,7 @@ func parseFlags() {
|
||||
kingpin.Flag("outdir", "output directory").Default(".").Short('o').StringVar(&opts.Outdir)
|
||||
kingpin.Flag("size", "process only files larger then size (in MB)").Short('m').Default(strconv.Itoa(0)).Int64Var(&opts.Size)
|
||||
kingpin.Flag("recursive", "process subdirectories recursively").Short('r').BoolVar(&opts.Recursive)
|
||||
kingpin.Flag("quiet", "hide console output").Short('v').BoolVar(&opts.Quiet)
|
||||
kingpin.Flag("quiet", "hide console output").Short('Q').BoolVar(&opts.Quiet)
|
||||
kingpin.Arg("args", "filename or directory").Required().ExistingFilesOrDirsVar(&arguments)
|
||||
kingpin.Parse()
|
||||
}
|
||||
|
||||
@@ -5,14 +5,17 @@ mkdir -p build
|
||||
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o build/cbconvert
|
||||
strip build/cbconvert
|
||||
|
||||
#CGO_LDFLAGS="-lm -lz -ldl -lltdl -lfreetype -static-libgcc" CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -v -x -o build/cbconvert-static --ldflags '-extldflags "-static"'
|
||||
#strip build/cbconvert-static
|
||||
|
||||
CGO_LDFLAGS="-L/usr/i686-pc-mingw32/usr/lib" \
|
||||
CGO_CFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
||||
CGO_CXXFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
||||
CGO_CPPFLAGS="-I/usr/i686-pc-mingw32/usr/include -I/usr/i686-pc-mingw32/usr/include/poppler/glib -I/usr/i686-pc-mingw32/usr/include/glib-2.0 -I/usr/i686-pc-mingw32/usr/include/cairo" \
|
||||
CGO_CFLAGS="-I/usr/i686-pc-mingw32/usr/include -Wno-poison-system-directories" \
|
||||
CGO_CXXFLAGS="-I/usr/i686-pc-mingw32/usr/include -Wno-poison-system-directories" \
|
||||
CGO_CPPFLAGS="-I/usr/i686-pc-mingw32/usr/include -Wno-poison-system-directories" \
|
||||
PKG_CONFIG=/usr/bin/i686-pc-mingw32-pkg-config \
|
||||
PKG_CONFIG_PATH=/usr/i686-pc-mingw32/usr/lib/pkgconfig \
|
||||
PKG_CONFIG_LIBDIR=/usr/i686-pc-mingw32/usr/lib/pkgconfig \
|
||||
CC="i686-pc-mingw32-gcc" CXX="i686-pc-mingw32-g++" \
|
||||
CC_FOR_TARGET=i686-pc-mingw32-gcc CXX_FOR_TARGET=i686-pc-mingw32-g++ \
|
||||
CGO_ENABLED=1 GOOS=windows GOARCH=386 go build -x -work -o build/cbconvert.exe -ldflags "-linkmode external -extldflags -static"
|
||||
CGO_ENABLED=1 GOOS=windows GOARCH=386 go build -o build/cbconvert.exe -ldflags "-linkmode external -extldflags -static"
|
||||
i686-pc-mingw32-strip build/cbconvert.exe
|
||||
|
||||
Reference in New Issue
Block a user