2021-09-01 02:22:18 +00:00
#!/bin/sh
# Swift Package Manager [has some strict requirements](https://github.com/apple/swift-package-manager/blob/main/Documentation/Usage.md#creating-c-language-targets) to source files layout.
# We can gain SPM support with minimal project structure changes by applying an autogenerated layout based on symbolic links technics.
# SPM related files located under `spm` folder at project's root.
# You should **NEVER** modify it manually nor inlude to Xcode's project.
# ### Generate SPM layout
# 1. From **project's root** run:
# `bash scripts/generate_spm_sources_layout.sh`
# 2. Commit Changes
# Repeate those steps each time you delete/add project's files. **Make sure** to have this CI step which will check that `generate_spm_sources_layout.sh` is not broken.
set -e
###IGListDiffKit
SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH = "spm/Sources/IGListDiffKit/include"
SPM_IG_LIST_DIFF_KIT_SOURCES_PATH = "spm/Sources/IGListDiffKit"
function generate_ig_list_diff_kit_spm_public_headers( ) {
echo "Generate symbolic links for all public headers. *.h"
echo " Generated under ${ SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH } "
public_headers_list = $(
find "Source/IGListDiffKit" \
-type f -name "*.[h]" \
-not -path "spm/*" \
-not -path "Source/IGListDiffKit/Internal/*" \
-not -path "Examples/*" | sed "s| \([^/]\)|:\1|g"
)
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH
for public_file in $public_headers_list ; do
file_to_link = $( echo $public_file | sed "s|:| |g" )
ln -s ../../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_diff_kit_spm_private_headers( ) {
echo "Generate symbolic links for all private headers *.h"
echo " Generated under ${ SPM_IG_LIST_DIFF_KIT_SOURCES_PATH } "
private_headers_list = $(
find "Source/IGListDiffKit/Internal" \
-type f -name "*.h" \
-not -path "spm/*" | sed "s| \([^/]\)|:\1|g" )
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH
for private_file in $private_headers_list ; do
file_to_link = $( echo $private_file | sed "s|:| |g" )
ln -s ../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_diff_kit_spm_sources( ) {
Improve SwiftPM support (#1546)
Summary:
This diff imports and refines the PR made by cntrump on GitHub.
The PR introduces the following:
* Sample apps now use SPM instead of CocoaPods to import IGListKit.
* Adds Mac Catalyst as an example target.
* Adds C++ flags to the CocoaPods specs.
* Fixes a script issue that was discovered when regenerating the symlinks.
The PR originally aimed to remove the need for symlinked references to the IGListKit and IGListDiffKit source files, but in testing, I couldn't get it working. It's possible SPM being too strict [on where the headers can be placed to be discovered](https://forums.swift.org/t/how-do-i-specify-the-headers-directory-for-a-objc-target-in-swift-package-managers-package-swift/58531/3).
Additionally, another issue was that the original PR changed all of the `#import` statements to the the modular `import` statements, which is fine for the sample apps, but ended up breaking compatibility for any apps that had modules disabled.
## Changes in this pull request
Improve SwiftPM support:
Build module `IGListDiffKit` and `IGListKit` as Objective-C++.
module `IGListDiffKit`:
- Source/IGListDiffKit
- module defined in `Source/IGListDiffKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListKit`:
- depend on `IGListDiffKit`, use `import IGListDiffKit;`
- Source/IGListKit
- module defined in `Source/IGListKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListSwiftKit`:
- depend on `IGListKit`, use `import IGListKit`
- Source/IGListSwiftKit
Deleted `spm/` and `scripts/generate_spm_sources_layout.sh`, it is unnecessary.
Updated `.podspec`, add `'OTHER_CFLAGS' => '-fmodules'` and `'OTHER_CPLUSPLUSFLAGS' => '-fcxx-modules'`.
Add missing swift files for `IGListSwiftKit` in `IGListKit.xcodeproj`
### How to use
Replace `#import <IGListDiffKit/IGListDiffKit.h>` with `import IGListDiffKit;`, because `IGListDiffKit.h` isn't exist in `modulemap/`, Or create a symbol link by `ln -sf ../IGListDiffKit.h` for support it ?
### Examples
Use SwiftPM for building examples.
### Checklist
- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [ ] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1546
Test Plan: Test PR showing running tests: https://github.com/TimOliver/IGListKit/actions/runs/4339956050/jobs/7578047058
Reviewed By: lorixx
Differential Revision: D33592395
Pulled By: TimOliver
fbshipit-source-id: 8f7b1873f2b1c6a80908bb55b123e31bea13bb0c
2023-03-07 07:29:41 +00:00
echo "Generate symbolic links for all public implementations. *.m & *.mm"
2021-09-01 02:22:18 +00:00
echo " Generated under ${ SPM_IG_LIST_DIFF_KIT_SOURCES_PATH } "
sources_list = $(
find "Source/IGListDiffKit" \
-type f -name "*.[m]" -o -name "*.mm" \
-not -path "spm/*" | sed "s| \([^/]\)|:\1|g" )
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH
for source_file in $sources_list ; do
file_to_link = $( echo $source_file | sed "s|:| |g" )
ln -s ../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_diff_kit( ) {
generate_ig_list_diff_kit_spm_public_headers
generate_ig_list_diff_kit_spm_private_headers
generate_ig_list_diff_kit_spm_sources
}
#### IGListKit
SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH = "spm/Sources/IGListKit/include"
SPM_IG_LIST_KIT_SOURCES_PATH = "spm/Sources/IGListKit"
function generate_ig_list_kit_spm_public_headers( ) {
echo "Generate symbolic links for all public headers. *.h"
echo " Generated under ${ SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH } "
public_headers_list = $(
find "Source/IGListKit" \
\! -name "IGListBindingSingleSectionController.[hm]" \
-name "*.[h]" \
-type f -not -path "spm/*" \
-not -path "Source/IGListKit/Internal/*" \
-not -path "Examples/*" | sed "s| \([^/]\)|:\1|g"
)
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH
for public_file in $public_headers_list ; do
file_to_link = $( echo $public_file | sed "s|:| |g" )
ln -s ../../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_kit_spm_private_headers( ) {
echo "Generate symbolic links for all private headers/implementations *.h && *.m"
echo " Generated under ${ SPM_IG_LIST_KIT_SOURCES_PATH } "
shared_ig_diff_kit_sorces_list = $( find "Source/IGListDiffKit/Internal" \
-name "*.[hm]" -o -name "*.mm" \
-type f -not -path "spm/*" \
-not -path "Examples/*" | sed "s| \([^/]\)|:\1|g" )
private_headers_list = $( find "Source/IGListKit/Internal" \
-name "*.h" \
-type f -not -path "spm/*" \
-not -path "Examples/*" | sed "s| \([^/]\)|:\1|g" )
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_KIT_SOURCES_PATH
for shared_file in $shared_ig_diff_kit_sorces_list ; do
file_to_link = $( echo $shared_file | sed "s|:| |g" )
ln -s ../../../$file_to_link
done
for private_file in $private_headers_list ; do
file_to_link = $( echo $private_file | sed "s|:| |g" )
ln -s ../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_kit_spm_sources( ) {
Improve SwiftPM support (#1546)
Summary:
This diff imports and refines the PR made by cntrump on GitHub.
The PR introduces the following:
* Sample apps now use SPM instead of CocoaPods to import IGListKit.
* Adds Mac Catalyst as an example target.
* Adds C++ flags to the CocoaPods specs.
* Fixes a script issue that was discovered when regenerating the symlinks.
The PR originally aimed to remove the need for symlinked references to the IGListKit and IGListDiffKit source files, but in testing, I couldn't get it working. It's possible SPM being too strict [on where the headers can be placed to be discovered](https://forums.swift.org/t/how-do-i-specify-the-headers-directory-for-a-objc-target-in-swift-package-managers-package-swift/58531/3).
Additionally, another issue was that the original PR changed all of the `#import` statements to the the modular `import` statements, which is fine for the sample apps, but ended up breaking compatibility for any apps that had modules disabled.
## Changes in this pull request
Improve SwiftPM support:
Build module `IGListDiffKit` and `IGListKit` as Objective-C++.
module `IGListDiffKit`:
- Source/IGListDiffKit
- module defined in `Source/IGListDiffKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListKit`:
- depend on `IGListDiffKit`, use `import IGListDiffKit;`
- Source/IGListKit
- module defined in `Source/IGListKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListSwiftKit`:
- depend on `IGListKit`, use `import IGListKit`
- Source/IGListSwiftKit
Deleted `spm/` and `scripts/generate_spm_sources_layout.sh`, it is unnecessary.
Updated `.podspec`, add `'OTHER_CFLAGS' => '-fmodules'` and `'OTHER_CPLUSPLUSFLAGS' => '-fcxx-modules'`.
Add missing swift files for `IGListSwiftKit` in `IGListKit.xcodeproj`
### How to use
Replace `#import <IGListDiffKit/IGListDiffKit.h>` with `import IGListDiffKit;`, because `IGListDiffKit.h` isn't exist in `modulemap/`, Or create a symbol link by `ln -sf ../IGListDiffKit.h` for support it ?
### Examples
Use SwiftPM for building examples.
### Checklist
- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [ ] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1546
Test Plan: Test PR showing running tests: https://github.com/TimOliver/IGListKit/actions/runs/4339956050/jobs/7578047058
Reviewed By: lorixx
Differential Revision: D33592395
Pulled By: TimOliver
fbshipit-source-id: 8f7b1873f2b1c6a80908bb55b123e31bea13bb0c
2023-03-07 07:29:41 +00:00
echo "Generate symbolic links for all public implementations. *.m"
2021-09-01 02:22:18 +00:00
echo " Generated under ${ SPM_IG_LIST_KIT_SOURCES_PATH } "
sources_list = $(
find "Source/IGListKit" \
\! -name "IGListBindingSingleSectionController.[hm]" \
Improve SwiftPM support (#1546)
Summary:
This diff imports and refines the PR made by cntrump on GitHub.
The PR introduces the following:
* Sample apps now use SPM instead of CocoaPods to import IGListKit.
* Adds Mac Catalyst as an example target.
* Adds C++ flags to the CocoaPods specs.
* Fixes a script issue that was discovered when regenerating the symlinks.
The PR originally aimed to remove the need for symlinked references to the IGListKit and IGListDiffKit source files, but in testing, I couldn't get it working. It's possible SPM being too strict [on where the headers can be placed to be discovered](https://forums.swift.org/t/how-do-i-specify-the-headers-directory-for-a-objc-target-in-swift-package-managers-package-swift/58531/3).
Additionally, another issue was that the original PR changed all of the `#import` statements to the the modular `import` statements, which is fine for the sample apps, but ended up breaking compatibility for any apps that had modules disabled.
## Changes in this pull request
Improve SwiftPM support:
Build module `IGListDiffKit` and `IGListKit` as Objective-C++.
module `IGListDiffKit`:
- Source/IGListDiffKit
- module defined in `Source/IGListDiffKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListKit`:
- depend on `IGListDiffKit`, use `import IGListDiffKit;`
- Source/IGListKit
- module defined in `Source/IGListKit/modulemap/module.modulemap`
- requires `-fmodules` and `-fcxx-modules`
module `IGListSwiftKit`:
- depend on `IGListKit`, use `import IGListKit`
- Source/IGListSwiftKit
Deleted `spm/` and `scripts/generate_spm_sources_layout.sh`, it is unnecessary.
Updated `.podspec`, add `'OTHER_CFLAGS' => '-fmodules'` and `'OTHER_CPLUSPLUSFLAGS' => '-fcxx-modules'`.
Add missing swift files for `IGListSwiftKit` in `IGListKit.xcodeproj`
### How to use
Replace `#import <IGListDiffKit/IGListDiffKit.h>` with `import IGListDiffKit;`, because `IGListDiffKit.h` isn't exist in `modulemap/`, Or create a symbol link by `ln -sf ../IGListDiffKit.h` for support it ?
### Examples
Use SwiftPM for building examples.
### Checklist
- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [ ] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
Pull Request resolved: https://github.com/Instagram/IGListKit/pull/1546
Test Plan: Test PR showing running tests: https://github.com/TimOliver/IGListKit/actions/runs/4339956050/jobs/7578047058
Reviewed By: lorixx
Differential Revision: D33592395
Pulled By: TimOliver
fbshipit-source-id: 8f7b1873f2b1c6a80908bb55b123e31bea13bb0c
2023-03-07 07:29:41 +00:00
-name "*.m" -o -name "*.mm" \
2021-09-01 02:22:18 +00:00
-type f -not -path "spm/*" \
-not -path "Examples/*" | sed "s| \([^/]\)|:\1|g" )
SRC_ROOT = $( pwd )
cd $SPM_IG_LIST_KIT_SOURCES_PATH
for source_file in $sources_list ; do
file_to_link = $( echo $source_file | sed "s|:| |g" )
ln -s ../../../$file_to_link
done
cd $SRC_ROOT
echo " Done"
echo ""
}
function generate_ig_list_kit( ) {
generate_ig_list_kit_spm_public_headers
generate_ig_list_kit_spm_private_headers
generate_ig_list_kit_spm_sources
}
# Delete all symbolik links from `spm` folder
function cleanup( ) {
rm -rf $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH /*.*
rm -rf $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH /*.*
#IGListKit
rm -rf $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH /*.*
rm -rf $SPM_IG_LIST_KIT_SOURCES_PATH /*.*
}
########## SPM generator pipeline #############
#1
cleanup
#2
generate_ig_list_diff_kit
# #3
generate_ig_list_kit