-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Flesh out CPack packaging for releases. #5135
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
b89ec19
Run CMake formatter
alexreinking cc4f8d1
Add VS output path to .gitignore, fix IDEA.
alexreinking 7ffc2e5
Rename WITH_EXCEPTIONS to HALIDE_WITH_EXCEPTIONS, like HALIDE_ENABLE_…
alexreinking ad1f4fa
Set library version to 10.0.0
alexreinking a95e858
Fix export names for plugins and Python bindings
alexreinking 47f608b
Major packaging improvements.
alexreinking 73b8560
Improve readability.
alexreinking e6d35ee
Something with WABT is broken... trying to fix.
alexreinking ad9feb5
Fixing WASM by explicitly importing LLD. Consolidating LLVM deps find…
alexreinking 62814b1
Add Windows support for bundling LLVM.
alexreinking cfc125d
Merge branch 'master' into cpack
alexreinking File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,200 @@ | ||
| cmake_minimum_required(VERSION 3.16) | ||
|
|
||
| ## | ||
| # This module provides a utility for bundling a set of IMPORTED | ||
| # STATIC libraries together as a merged INTERFACE library that, | ||
| # due to CMake Issue #15415, requires manual propagation to its | ||
| # linkees, unfortunately. | ||
| # | ||
| # This is useful when a STATIC library produced by your project | ||
| # depends privately on some 3rd-party STATIC libraries that are | ||
| # tricky to distribute or for end-users to build. CMake handles | ||
| # this by assuming that imported libraries will be easy to find | ||
| # in an end-user's environment so a simple find_dependency call | ||
| # in the package config will suffice. Unfortunately, things are | ||
| # not so simple. Some libraries (eg. LLVM) can be built in many | ||
| # different configurations, and dependents can be built against | ||
| # one fixed configuration. If we have LLVM -> X -> Y where X is | ||
| # my library and Y is some other user's library, then Y must be | ||
| # very careful to build LLVM in _exactly_ the same way as X was | ||
| # configured to use. While this might be acceptable in a super- | ||
| # build, it fails when we want to release binary packages of X. | ||
| ## | ||
|
|
||
| # All of the IMPORTED_ and INTERFACE_ properties should be accounted for below. | ||
| # https://cmake.org/cmake/help/v3.16/manual/cmake-properties.7.html#properties-on-targets | ||
|
|
||
| # Irrelevant properties: | ||
| # IMPORTED_IMPLIB(_<CONFIG>) # shared-only | ||
| # IMPORTED_LIBNAME(_<CONFIG>) # interface-only | ||
| # IMPORTED_LINK_DEPENDENT_LIBRARIES(_<CONFIG>) # shared-only | ||
| # IMPORTED_LINK_INTERFACE_LIBRARIES(_<CONFIG>) # deprecated | ||
| # IMPORTED_LINK_INTERFACE_MULTIPLICITY(_<CONFIG>) # static-only. irrelevant when all objects listed. | ||
| # IMPORTED_NO_SONAME(_<CONFIG>) # shared-only | ||
| # IMPORTED_SONAME(_<CONFIG>) # shared-only | ||
|
|
||
| function(bundle_static) | ||
| set(options) | ||
| set(oneValueArgs TARGET) | ||
| set(multiValueArgs LIBRARIES) | ||
| cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
|
|
||
| set(interfaceLib ${ARG_TARGET}) | ||
| set(objectLib ${ARG_TARGET}.obj) | ||
|
|
||
| add_library(${interfaceLib} INTERFACE) | ||
| add_library(${objectLib} OBJECT IMPORTED) | ||
| set_target_properties(${objectLib} PROPERTIES IMPORTED_GLOBAL TRUE) | ||
|
|
||
| target_sources(${interfaceLib} INTERFACE $<BUILD_INTERFACE:$<TARGET_OBJECTS:${objectLib}>>) | ||
|
|
||
| set(queue ${ARG_LIBRARIES}) | ||
| while (queue) | ||
| list(POP_FRONT queue lib) | ||
| if (VISITED_${lib}) | ||
| continue() | ||
| endif () | ||
| set(VISITED_${lib} TRUE) | ||
|
|
||
| if (NOT TARGET ${lib}) | ||
| target_link_libraries(${interfaceLib} INTERFACE ${lib}) | ||
| continue() | ||
| endif () | ||
|
|
||
| get_property(isImported TARGET ${lib} PROPERTY IMPORTED) | ||
| get_property(type TARGET ${lib} PROPERTY TYPE) | ||
|
|
||
| if (NOT isImported OR NOT "${type}" STREQUAL "STATIC_LIBRARY") | ||
| target_link_libraries(${interfaceLib} INTERFACE ${lib}) | ||
| continue() | ||
| endif () | ||
|
|
||
| transfer_same(PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE | ||
| FROM ${lib} TO ${interfaceLib}) | ||
|
|
||
| transfer_append(PROPERTIES | ||
| INTERFACE_AUTOUIC_OPTIONS | ||
| INTERFACE_COMPILE_DEFINITIONS | ||
| INTERFACE_COMPILE_FEATURES | ||
| INTERFACE_COMPILE_OPTIONS | ||
| INTERFACE_INCLUDE_DIRECTORIES | ||
| INTERFACE_LINK_DEPENDS | ||
| INTERFACE_LINK_DIRECTORIES | ||
| INTERFACE_LINK_OPTIONS | ||
| INTERFACE_PRECOMPILE_HEADERS | ||
| INTERFACE_SOURCES | ||
| INTERFACE_SYSTEM_INCLUDE_DIRECTORIES | ||
| FROM ${lib} TO ${interfaceLib}) | ||
|
|
||
| transfer_same(PROPERTIES IMPORTED_COMMON_LANGUAGE_RUNTIME | ||
| FROM ${lib} TO ${objectLib}) | ||
|
|
||
| transfer_locations(FROM ${lib} TO ${objectLib}) | ||
|
|
||
| get_property(deps TARGET ${lib} PROPERTY INTERFACE_LINK_LIBRARIES) | ||
| list(APPEND queue ${deps}) | ||
| endwhile () | ||
| endfunction() | ||
|
|
||
| function(transfer_same) | ||
| set(options) | ||
| set(oneValueArgs FROM TO PROPERTIES) | ||
| set(multiValueArgs) | ||
| cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
|
|
||
| foreach (p IN LISTS ARG_PROPERTIES) | ||
| get_property(fromSet TARGET ${ARG_FROM} PROPERTY ${p} SET) | ||
| if (NOT fromSet) | ||
| continue() | ||
| endif () | ||
| get_property(fromVal TARGET ${ARG_FROM} PROPERTY ${p}) | ||
|
|
||
| get_property(toSet TARGET ${ARG_TO} PROPERTY ${p} SET) | ||
| if (NOT toSet) | ||
| set_property(TARGET ${ARG_TO} PROPERTY ${p} ${fromVal}) | ||
| endif () | ||
|
|
||
| get_property(toVal TARGET ${ARG_TO} PROPERTY ${p}) | ||
| if (NOT "${fromVal}" STREQUAL "${toVal}") | ||
| message(WARNING "Property ${p} does not agree between ${ARG_FROM} [${fromVal}] and ${ARG_TO} [${toVal}]") | ||
| endif () | ||
| endforeach () | ||
| endfunction() | ||
|
|
||
| function(transfer_append) | ||
| set(options) | ||
| set(oneValueArgs FROM TO PROPERTIES) | ||
| set(multiValueArgs) | ||
| cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
|
|
||
| foreach (p IN LISTS ARG_PROPERTIES) | ||
| get_property(fromSet TARGET ${ARG_FROM} PROPERTY ${p} SET) | ||
| if (fromSet) | ||
| get_property(fromVal TARGET ${ARG_FROM} PROPERTY ${p}) | ||
| set_property(TARGET ${ARG_TO} APPEND PROPERTY ${p} ${fromVal}) | ||
| endif () | ||
| endforeach () | ||
| endfunction() | ||
|
|
||
| function(transfer_locations) | ||
| set(options) | ||
| set(oneValueArgs FROM TO) | ||
| set(multiValueArgs) | ||
| cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||
|
|
||
| get_property(configs TARGET ${ARG_FROM} PROPERTY IMPORTED_CONFIGURATIONS) | ||
| foreach (cfg IN LISTS configs ITEMS "") | ||
| if (cfg) | ||
| string(TOUPPER "_${cfg}" cfg) | ||
| endif () | ||
|
|
||
| get_property(lib TARGET ${ARG_FROM} PROPERTY "IMPORTED_LOCATION${cfg}") | ||
| if (lib) | ||
| get_filename_component(stage "${lib}" NAME_WE) | ||
| set(stage "${CMAKE_CURRENT_BINARY_DIR}/${stage}.obj") | ||
|
|
||
| if (NOT EXISTS "${stage}") | ||
| file(MAKE_DIRECTORY "${stage}") | ||
| if (MSVC) | ||
| execute_process(COMMAND "${CMAKE_AR}" /NOLOGO /LIST "${lib}" | ||
| WORKING_DIRECTORY "${stage}" | ||
| OUTPUT_VARIABLE objsInLib) | ||
|
|
||
| # Process the output to a list of internal objects | ||
| string(STRIP "${objsInLib}" objsInLib) | ||
| string(REGEX REPLACE "(\r|\n)+" ";" objsInLib "${objsInLib}") | ||
| list(TRANSFORM objsInLib STRIP) | ||
|
|
||
| foreach (obj IN LISTS objsInLib) | ||
| execute_process(COMMAND "${CMAKE_AR}" /NOLOGO "/EXTRACT:${obj}" "${lib}" | ||
| WORKING_DIRECTORY "${stage}") | ||
| endforeach () | ||
| else () | ||
| execute_process(COMMAND "${CMAKE_AR}" -x "${lib}" | ||
| WORKING_DIRECTORY "${stage}" | ||
| RESULT_VARIABLE error) | ||
| endif () | ||
| endif () | ||
|
|
||
| get_property(languages TARGET ${ARG_FROM} PROPERTY "IMPORTED_LINK_INTERFACE_LANGUAGES${cfg}") | ||
| if (NOT languages) | ||
| get_property(languages TARGET ${ARG_FROM} PROPERTY "IMPORTED_LINK_INTERFACE_LANGUAGES") | ||
| endif () | ||
|
|
||
| message(VERBOSE "Transferring ${languages}[${cfg}] objects from ${lib} to ${ARG_TO}") | ||
|
|
||
| unset(globs) | ||
| foreach (lang IN LISTS languages) | ||
| list(APPEND globs "${stage}/*${CMAKE_${lang}_OUTPUT_EXTENSION}") | ||
| endforeach () | ||
|
|
||
| file(GLOB_RECURSE objects ${globs}) | ||
|
|
||
| foreach (obj IN LISTS objects) | ||
| message(VERBOSE "... ${obj}") | ||
| endforeach () | ||
|
|
||
| set_property(TARGET ${ARG_TO} APPEND PROPERTY "IMPORTED_OBJECTS${cfg}" ${objects}) | ||
| endif () | ||
| endforeach () | ||
| endfunction() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this renaming necessary?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because the behavior of Error.cpp changes depending on whether or not Halide was built with exceptions, so our users might need to know whether it was enabled. The old name,
WITH_EXCEPTIONS, is almost guaranteed to conflict with another project so I prefixed it. It also now matchesHALIDE_ENABLE_RTTI.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this macro is ever exported though. It's only used in Error.cpp, and no headers. This is now inconsistent with all the other WITH flags in the makefile.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we think clients might need to check it dynamically should we add an api like we did for llvm_version?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The use cases for checking it would seem to need to be compile-time mostly, I would think (e.g. so that you can wrap try/catch or not).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So perhaps it should be something exported by the Halide package in cmake (not sure of correct terminology here) as the variable HALIDE_WITH_EXCEPTIONS? But this is independent of what the #define is called.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Linking with varying exception-handling capabilities is generally risky, as is linking with varying RTTI info, which is why packages that allow users to disable them have to propagate that information at build time.