How to create custom module without the package manager?


(Bee) #1

Hi all,

I'd like to create my own simple custom module, but I don't want to use the
complicated package manager. Package manager is overkill for a simple
single source file module. So, here's what I've tried.

file: greet.swift

public func askName() {
print("What's your name? ")
let name = readLine()!
print("Hello, \(name)... good to see you!")
}

file: main.swift

askName()

terminal:

$ swiftc -emit-library -emit-object greet.swift -module-name greet

emits greet.o

$ ar rcs libgreet.a greet.o

emits libgreet.a

$ swiftc -emit-module greet.swift -module-name greet

emits greet.swiftmodule and greet.swiftdoc

All went well, so I think now I already have had the "greet" module. Let's
try to use it…

file: test.swift

import greet
askName()

terminal:

$ swiftc test.swift
clang: warning: argument unused during compilation: '-F/home/username'
/tmp/test-b63aab.o: In function `main':
/tmp/test-b63aab.o:(.text+0x41): undefined reference to
`_TF5greet7askNameFT_T_'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see
invocation)

What's happening? What's wrong? How can I fix it?

Thank you.

Regards,

···

--
-Bee-


(Bee) #2

Sorry… forgot to say. I'm using Swift v.2.2 on Linux Ubuntu 14.04.

···

On Sat, Dec 12, 2015 at 9:50 PM, Bee <bee.ography@gmail.com> wrote:

Hi all,

I'd like to create my own simple custom module, but I don't want to use
the complicated package manager. Package manager is overkill for a simple
single source file module. So, here's what I've tried.

file: greet.swift

public func askName() {
print("What's your name? ")
let name = readLine()!
print("Hello, \(name)... good to see you!")
}

file: main.swift

askName()

terminal:

$ swiftc -emit-library -emit-object greet.swift -module-name greet

emits greet.o

$ ar rcs libgreet.a greet.o

emits libgreet.a

$ swiftc -emit-module greet.swift -module-name greet

emits greet.swiftmodule and greet.swiftdoc

All went well, so I think now I already have had the "greet" module. Let's
try to use it…

file: test.swift

import greet
askName()

terminal:

$ swiftc test.swift
clang: warning: argument unused during compilation: '-F/home/username'
/tmp/test-b63aab.o: In function `main':
/tmp/test-b63aab.o:(.text+0x41): undefined reference to
`_TF5greet7askNameFT_T_'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see
invocation)

What's happening? What's wrong? How can I fix it?

Thank you.

Regards,

--
-Bee-

--
-Bee-


(Bee) #3

Sorry… I answer my own question. It need -l<module-name> argument. So, the
last command should be:

$ swiftc test.swift -lgreet

then it emitted a runnable app. I wonder why does it need an explicit
module name in the command line? While there is already an import clause
within the source file. Anyway, problem solved.

Thank you. :slight_smile:

···

On Sat, Dec 12, 2015 at 9:53 PM, Bee <bee.ography@gmail.com> wrote:

Sorry… forgot to say. I'm using Swift v.2.2 on Linux Ubuntu 14.04.

On Sat, Dec 12, 2015 at 9:50 PM, Bee <bee.ography@gmail.com> wrote:

Hi all,

I'd like to create my own simple custom module, but I don't want to use
the complicated package manager. Package manager is overkill for a simple
single source file module. So, here's what I've tried.

file: greet.swift

public func askName() {
print("What's your name? ")
let name = readLine()!
print("Hello, \(name)... good to see you!")
}

file: main.swift

askName()

terminal:

$ swiftc -emit-library -emit-object greet.swift -module-name greet

emits greet.o

$ ar rcs libgreet.a greet.o

emits libgreet.a

$ swiftc -emit-module greet.swift -module-name greet

emits greet.swiftmodule and greet.swiftdoc

All went well, so I think now I already have had the "greet" module.
Let's try to use it…

file: test.swift

import greet
askName()

terminal:

$ swiftc test.swift
clang: warning: argument unused during compilation: '-F/home/username'
/tmp/test-b63aab.o: In function `main':
/tmp/test-b63aab.o:(.text+0x41): undefined reference to
`_TF5greet7askNameFT_T_'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see
invocation)

What's happening? What's wrong? How can I fix it?

Thank you.

Regards,

--
-Bee-

--
-Bee-

--
-Bee-


(cooper liu) #4

hi,
here is my test under mac os x

simple version
$swiftc -emit-module -emit-library greet.swift
emit greet.swiftdoc greet.swiftmodule libgreet.dylib
$swiftc -I. -L. -lgreet test.swift
emit test

detailed version
$swiftc -emit-module -emit-library -module-name greet -module-link-name mm
-o libmm.dylib greet.swift
emit greet.swiftdoc greet.swiftmodule libmm.dylib
$swiftc -I. -L. -lmm test.swift
emit test

···

2015-12-12 23:05 GMT+08:00 Bee via swift-users <swift-users@swift.org>:

Sorry… I answer my own question. It need -l<module-name> argument. So, the
last command should be:

$ swiftc test.swift -lgreet

then it emitted a runnable app. I wonder why does it need an explicit
module name in the command line? While there is already an import clause
within the source file. Anyway, problem solved.

Thank you. :slight_smile:

On Sat, Dec 12, 2015 at 9:53 PM, Bee <bee.ography@gmail.com> wrote:

Sorry… forgot to say. I'm using Swift v.2.2 on Linux Ubuntu 14.04.

On Sat, Dec 12, 2015 at 9:50 PM, Bee <bee.ography@gmail.com> wrote:

Hi all,

I'd like to create my own simple custom module, but I don't want to use
the complicated package manager. Package manager is overkill for a simple
single source file module. So, here's what I've tried.

file: greet.swift

public func askName() {
print("What's your name? ")
let name = readLine()!
print("Hello, \(name)... good to see you!")
}

file: main.swift

askName()

terminal:

$ swiftc -emit-library -emit-object greet.swift -module-name greet

emits greet.o

$ ar rcs libgreet.a greet.o

emits libgreet.a

$ swiftc -emit-module greet.swift -module-name greet

emits greet.swiftmodule and greet.swiftdoc

All went well, so I think now I already have had the "greet" module.
Let's try to use it…

file: test.swift

import greet
askName()

terminal:

$ swiftc test.swift
clang: warning: argument unused during compilation: '-F/home/username'
/tmp/test-b63aab.o: In function `main':
/tmp/test-b63aab.o:(.text+0x41): undefined reference to
`_TF5greet7askNameFT_T_'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see
invocation)

What's happening? What's wrong? How can I fix it?

Thank you.

Regards,

--
-Bee-

--
-Bee-

--
-Bee-

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


(Bee) #5

I've made a bash script to automate custom module compilation on Linux.
Check it out here: http://beeography.koding.io/viewcode.cgi?file=swiftmod.sh

···

On Sun, Dec 13, 2015 at 9:44 PM, cooper liu <1989lzhh@gmail.com> wrote:

hi,
here is my test under mac os x

simple version
$swiftc -emit-module -emit-library greet.swift
emit greet.swiftdoc greet.swiftmodule libgreet.dylib
$swiftc -I. -L. -lgreet test.swift
emit test

detailed version
$swiftc -emit-module -emit-library -module-name greet -module-link-name mm
-o libmm.dylib greet.swift
emit greet.swiftdoc greet.swiftmodule libmm.dylib
$swiftc -I. -L. -lmm test.swift
emit test

2015-12-12 23:05 GMT+08:00 Bee via swift-users <swift-users@swift.org>:

Sorry… I answer my own question. It need -l<module-name> argument. So,
the last command should be:

$ swiftc test.swift -lgreet

then it emitted a runnable app. I wonder why does it need an explicit
module name in the command line? While there is already an import clause
within the source file. Anyway, problem solved.

Thank you. :slight_smile:

On Sat, Dec 12, 2015 at 9:53 PM, Bee <bee.ography@gmail.com> wrote:

Sorry… forgot to say. I'm using Swift v.2.2 on Linux Ubuntu 14.04.

On Sat, Dec 12, 2015 at 9:50 PM, Bee <bee.ography@gmail.com> wrote:

Hi all,

I'd like to create my own simple custom module, but I don't want to use
the complicated package manager. Package manager is overkill for a simple
single source file module. So, here's what I've tried.

file: greet.swift

public func askName() {
print("What's your name? ")
let name = readLine()!
print("Hello, \(name)... good to see you!")
}

file: main.swift

askName()

terminal:

$ swiftc -emit-library -emit-object greet.swift -module-name greet

emits greet.o

$ ar rcs libgreet.a greet.o

emits libgreet.a

$ swiftc -emit-module greet.swift -module-name greet

emits greet.swiftmodule and greet.swiftdoc

All went well, so I think now I already have had the "greet" module.
Let's try to use it…

file: test.swift

import greet
askName()

terminal:

$ swiftc test.swift
clang: warning: argument unused during compilation: '-F/home/username'
/tmp/test-b63aab.o: In function `main':
/tmp/test-b63aab.o:(.text+0x41): undefined reference to
`_TF5greet7askNameFT_T_'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
<unknown>:0: error: link command failed with exit code 1 (use -v to see
invocation)

What's happening? What's wrong? How can I fix it?

Thank you.

Regards,

--
-Bee-

--
-Bee-

--
-Bee-

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

--
-Bee-