Skip to content
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

Add, use, and document new function tribits_external_package_create_imported_all_libs_target_and_config_file() (#299) #493

Conversation

bartlettroscoe
Copy link
Member

@bartlettroscoe bartlettroscoe commented Jul 12, 2022

This adds the new module TribitsExternalPackageFindTplHelpers.cmake with the new function tribits_external_package_create_imported_all_libs_target_and_config_file(). This makes it very smooth and easy to use find_package(<externalPkg>) that creates proper IMPORTED targets.

Using the new function will fix the problem with FindTPLGTest.cmake reported in sandialabs/seacas#317 (comment).

Things done here:

  • Added new module TribitsExternalPackageFindTplHelpers.cmake and function tribits_external_package_create_imported_all_libs_target_and_config_file() and used it to upgrade the FindTPL<tplName>.cmake modules for TribitsExampleProject2 (and updated tests to make sure they work).

  • Updated documentation and howto for adding a new TriBITS TPL and write the FindTPL<tplName>.cmake file. (Hopefully this new documentation will be easier to find the code example that a particular FindTPL<tplName>.cmake file should follow.)

Notes to post-merge reviewers

I think this needs to be a CMake code formatting guideline.  It makes the code
more readable since CMake lacks commas to seprate arguments.
…nd_config_file() (TriBITSPub#299)

This is a reusable function that can be used with many other such
FindTPL<tplName>.cmake files that call find_package(<externalPkg>) that
defines imported targets.
…Pub#299)

Now all of the TribitsExampleProject2 TPLs Tpl1, Tpl2, Tpl3, and Tpl4 all can
call:

  tribits_external_package_create_imported_all_libs_target_and_config_file()

to be able to use the externally generated `<externalPkg>Config.cmake` files.

I also updated the tests for TribitsExampleProject2 and TribitsExampleApp2 to
ensure that find_package() is being called (by grepping the output).  I feel
pretty good about these tests.
TribitsExampleProject2
…SPub#299)

It just points to the maintainers guide for now.  May need a local users guide
reference for this.
…nabledTpl.cmake (TriBITSPub#299)

This makes it so that individual FindTPL<tplName>.cmake files don't need to
include this module.
I noticed this while working on TriBITSPub#299 so I decided to just fix this.
I did several things here:

* Updated howto for creating TriBITS FindTPL<tplName>.cmake files to cover all
  cases with more examples.  This also covers the new function
  tribits_external_package_create_imported_all_libs_target_and_config_file()

* Changed section name from "Addtional Topics" to "Miscellaneous Topics"

* Changes section name from "TriBITS TPL" to "TriBITS External Package/TPL"
  but provided anchor `TriBITS TPL`_ so I did not have to update all of the
  references.

* Provided subsections for TriBITS External Package/TPL files and variables

* Moved detailed material on tricky aspects of find_package() and
  <tplName>Config.cmake files to a new section "Tricky considerations for
  TriBITS-generated <tplName>Config.cmake files".

* Added references to documentation for the functions in the module
  TribitsExternalPackageWriteConfigFile.cmake.
bartlettroscoe added a commit to bartlettroscoe/seacas that referenced this pull request Jul 12, 2022
…nd_config_file() (TriBITSPub/TriBITS#299)

This uses the new function
tribits_external_package_create_imported_all_libs_target_and_config_file()
added in the TriBITS PR TriBITSPub/TriBITS#493 to work correctly with new
TriBITS.
@bartlettroscoe
Copy link
Member Author

I am going to go ahead and merge so we can get the updated documentation built and deployed. Then I will request a post-merge review.

Copy link
Collaborator

@rabartlett1972 rabartlett1972 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Going to merge so we can see the updated documentation and so we can update TriBITS in sandialabs/seacas#317, the merge sandialabs/seacas#322 and verify that the problem is resolved.

I will then request a post-merge review.

@bartlettroscoe bartlettroscoe merged commit f36aad6 into TriBITSPub:master Jul 12, 2022
@bartlettroscoe
Copy link
Member Author

Hello @KyleFromKitware, can you please do a post-merge review of this PR? Please see the notes above in the section "Notes to post-merge reviewers".

Hello @gsjaardema, can you please look over the updated documentation related to writing and upgrading FindTPL<tplName>.cmake files in:

and especially in the section:

?

That should solve the problem with seacas/cmake/TPLs/FindTPLGTest.cmake being experienced in sandialabs/seacas#317 and is used in PR sandialabs/seacas#322.

@bartlettroscoe
Copy link
Member Author

FYI @keitat

@@ -15,6 +15,13 @@ understand the internals of TriBITS.
@MACRO: tribits_adjust_package_enables() +
@FUNCTION: tribits_append_forward_dep_packages() +
@MACRO: tribits_assert_read_dependency_vars() +
@FUCNTION: tribits_external_package_append_upstream_target_link_libraries_get_name_and_vis() +
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be @FUNCTION, not @FUCNTION

@@ -15,6 +15,13 @@ understand the internals of TriBITS.
@MACRO: tribits_adjust_package_enables() +
@FUNCTION: tribits_append_forward_dep_packages() +
@MACRO: tribits_assert_read_dependency_vars() +
@FUCNTION: tribits_external_package_append_upstream_target_link_libraries_get_name_and_vis() +
@FUNCTION: tribits_external_package_add_find_upstream_dependencies_str() +
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of the difficulties I often have with reviewing TriBITS is the very long names of functions. Because there's no Prefix_CamelCase or prefix__snake_case, there's not a clear distinction between the prefix and the function name. I know public-facing functions can't be changed due to backwards compatibility, but it would be nice if internal functions used some clearer naming, like ExternalProject_Add which CMake has.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CC: @keitat

@KyleFromKitware

Yea, I see the problem. I will need to think about how to resolve this. How about going with the concept of collections of functions and using a prefix with CamelCase like TribitisExtPkg_add_find_upstream_dependencies_str() instead of tribits_external_package_add_find_upstream_dependencies_str()? If you go with CamelCase, you could do TribitisExtPkg_addFindUpstreamDependenciesStr(). An issue with CMake is that command calls are case insensitive so people could call that as tribitisextpkg_addfindupstreamdependenciesstr() which is completely unreadable. I guess all things considered, I would rather type and read TribitisExtPkg_addFindUpstreamDependenciesStr() than tribits_external_package_add_find_upstream_dependencies_str(). And we can use case-insensitive greps to find all occurrences of a function.

If you look at most of the public-facing TriBITS functions worth documenting at TriBITS Macros and Functions, you will see that some of them are grouped as:

  • tribits_package_xxx()
  • tribits_tpl_xxx()

so those could become:

  • TribitsPkg_xxx()
  • TribitsExtPkg_xxx()

(because we are changing the name from "TPL" to "External Package" as part of #63).

There is a desire to break TriBITS up into smaller collections of reusable software components (i.e. #368) and we could give each of these "components" a single prefix, such as TribitsTesting_ for all of the testing-related functions and macros.

What we need is a CMake coding standards guide for larger software collections written in CMake that helps to address problems like this and other issues since CMake lacks core language features that other languages have (like module scoping).

As for backward compatibility, this is now the time to break that and we could support function renaming with deprecated wrappers (i.e. #429) or with renaming scripts that clients can run on their code when they upgrade. (The former is more work but is a better path.)

But I would like to hold off on a major renaming of TriBITS functions until we get the epic #367 completed while trying to avoid breaking backward compatibility as much as possible. But after that epic is complete, we need to set our sights on the larger refactorings to further componentize TriBITS Core (i.e. #368) and modernize it (i.e. #411).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@KyleFromKitware, also note that the function:

  • tribits_external_package_append_upstream_target_link_libraries_get_name_and_vis()

is being renamed to:

  • tribits_external_package_get_dep_name_and_vis()

as part of #494 shown here.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you go with CamelCase, you could do TribitisExtPkg_addFindUpstreamDependenciesStr(). An issue with CMake is that command calls are case insensitive so people could call that as tribitisextpkg_addfindupstreamdependenciesstr() which is completely unreadable.

Yes, and the answer to this problem is "don't do that".

FWIW, I would use UpperCamelCase_UpperCamelCase rather than UpperCamelCase_lowerCamelCase. That's the convention used by ExternalProject and FetchContent.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As a short-term compromise, how about I change the long prefix tribits_external_package_ to the shorter prefix tribits_extpkg_? As these are new functions that have not been technically synced to Trilinos yet, it is fine to change the name now.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds fine to me - it's ultimately up to you on how to name it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, I would use UpperCamelCase_UpperCamelCase rather than UpperCamelCase_lowerCamelCase. That's the convention used by ExternalProject and FetchContent.

I am just so used to coding conventions where proper nouns for package names, namespaces, and modules use UpperCamelCase but verbs for function and macro names use lowerCamelCase(). In C++, the function would be named TribitisExtPkg::addFindUpstreamDependenciesStr(). So a direct mapping to CMake would be to replace : with _ with TribitisExtPkg_addFindUpstreamDependenciesStr(). I guess to make this more clear/formal we could use a double underscore __ to replace : so it would be TribitisExtPkg__addFindUpstreamDependenciesStr(). It is all what you are used to I guess.

Copy link
Collaborator

@KyleFromKitware KyleFromKitware Jul 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could support function renaming with deprecated wrappers (i.e. #429)

If you're using a new enough CMake, here's a convenient way to add deprecated aliases for functions:

function(add_deprecated_alias alias name)
  cmake_language(EVAL CODE "
    macro(${alias})
      message(DEPRECATION \"${alias} is deprecated - use ${name} instead\")
      ${name}(\${ARGN})
    endmacro()")
endfunction()

Note that this doesn't get you perfect argument forwarding, which unfortunately is impossible with the current state of CMake.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants