How to modify SWIFT_MODULE_NAME?

16,841

Solution 1

The module name comes from the Product Module Name build setting:

build settings screenshot

The SWIFT_MODULE_NAME setting is apparently hidden, but you can see its derivation by looking at Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.xcplugin/Contents/Resources/Swift.xcspec:

...
{
    Name = "SWIFT_MODULE_NAME";
    Type = String;
    DefaultValue = "$(PRODUCT_MODULE_NAME)";
    CommandLineArgs = (
        "-module-name",
        "$(value)",
    );
},
...

Solution 2

Go to build Settings and click + next to 'Levels'. See :

enter image description here

replace NEW_SETTING as SWIFT_MODULE_NAME for the name of the setting, and whatever is the module name for .h file (No spaces, please) goes on the right.

Solution 3

SWIFT_MODULE_NAME, PRODUCT_MODULE_NAME, PRODUCT_NAME, EXECUTABLE_NAME

Default values:

EXECUTABLE_NAME = $EXECUTABLE_PREFIX$PRODUCT_NAME$EXECUTABLE_SUFFIX
SWIFT_OBJC_INTERFACE_HEADER_NAME = $(SWIFT_MODULE_NAME) 

SWIFT_MODULE_NAME = $(PRODUCT_MODULE_NAME)
PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier)
PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)

Observation:

SWIFT_MODULE_NAME == PRODUCT_MODULE_NAME

c99extidentifier

Xcode is able to substitute a value of variable c99extidentifier identifier which supports extended characters from C99

//for example
PRODUCT_NAME = My Framework
PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier) = My_Framework

EXECUTABLE_NAME name of binary

Product Module Name(PRODUCT_MODULE_NAME) determines how the import statement will look like. For example when you are creating a Library or a Framework.

Using:

//Objective-C
@import module_name; 

//Swift
import module_name 

Product Name(PRODUCT_NAME) determines the name of binary. E.g. MyFramework.framework

[TARGET_NAME]

Rule is:

SWIFT_MODULE_NAME should equal to PRODUCT_MODULE_NAME

[Custom .modulemap]

Share:
16,841

Related videos on Youtube

Sheamus
Author by

Sheamus

iOS Engineer, excited about building great mobile apps that are highly functional and a pleasure to use.

Updated on September 14, 2022

Comments

  • Sheamus
    Sheamus over 1 year

    The title says it all. I've searched in the build settings for SWIFT_MODULE_NAME, and nothing came up. I've also searched online, and there are references to this name, but there is no information on how it is defined. Furthermore, I couldn't find any mention of SWIFT_MODULE_NAME in the Apple Docs.

    I do know this: it is used in the "Objective-C Generated Interface Header Name" build setting, and can be viewed by double-clicking on the settings value:

    $(SWIFT_MODULE_NAME)-Swift.h

    It is used to bridge the gap between Objective-C and Swift, and appears only for projects that include Swift files, (along with Objective-C files I presume). As of this posting, Xcode 7.3 is the latest and greatest.

    But, where is this value defined, and how do I modify it?

  • Sheamus
    Sheamus about 8 years
    Thank you, that's it! I changed the PRODUCT_MODULE_NAME, and the SWIFT_MODULE_NAME was updated!
  • James Wyman
    James Wyman over 6 years
    Hit the plus sign for add user defined settings was the part i missed at first.
  • SXC
    SXC about 6 years
    Added SWIFT_MODULE_NAME and fixed my unit tests on XCode 9 because our module name has a "-" in it. Thanks.
  • Matthew Ferguson
    Matthew Ferguson almost 6 years
    Oh my, 4 hours looking for this - debated the concept of retirement. Xcode Version 9.4 (9F1027a) had filled it blank from a fresh swift project create 3 days ago. I will post a possible bug. ouch! don't forget #import "MsbHrv-Swift.h" in the .m, for every function on swift object that your accessing put the "@objc" in front of the declaration in the .swift file, and make sure this SWIFT_MODULE_NAME is set in the PRODUCT_MODULE_NAME. OR just build everything in swift, be happy, and pet puppies to calm your day.
  • Dino Alves
    Dino Alves over 5 years
    Please note that Product Module Name defaults to using $(PRODUCT_NAME:c99extidentifier) so the best place to change this is to ensure that you set PRODUCT_NAME or "Product Name" to a value and all will update accordingly.
  • Oscar
    Oscar almost 5 years
    To follow up on Dino's observation: There's yet another step, because PRODUCT_NAME is defined as $(TARGET_NAME). But... it dead-ends there. I can't find TARGET_NAME in any of the settings; maybe Xcode only shows it in the project navigator (left pane). One more thing: If your project or product name is hyphenated, Xcode will replace the hyphen with an underscore. This will cause builds to fail if you explicitly refer to the $(SWIFT_MODULE_NAME)-Swift.h file's expected name anywhere.