From 0a47a3127c3b780b3a25781f1239e7afaa6e7e4c Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Thu, 27 Aug 2020 21:58:57 -0700 Subject: [PATCH] Move c header generation out of build.rs --- Cargo.lock | 9 +- Cargo.toml | 1 + cbindgen.sh | 15 + ci/script.sh | 11 +- token-swap/program/Cargo.toml | 3 - token-swap/program/build.rs | 17 - token/program/Cargo.toml | 3 - token/program/inc/token.h | 418 +++--------------- utils/cgen/Cargo.toml | 9 + utils/cgen/src/main | 0 .../build.rs => utils/cgen/src/main.rs | 50 ++- 11 files changed, 129 insertions(+), 407 deletions(-) create mode 100755 cbindgen.sh delete mode 100644 token-swap/program/build.rs create mode 100644 utils/cgen/Cargo.toml create mode 100644 utils/cgen/src/main rename token/program/build.rs => utils/cgen/src/main.rs (59%) diff --git a/Cargo.lock b/Cargo.lock index 74b027b8..f13ee8b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -244,6 +244,13 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "cgen" +version = "0.1.0" +dependencies = [ + "cbindgen", +] + [[package]] name = "chrono" version = "0.4.13" @@ -2246,7 +2253,6 @@ name = "spl-token" version = "2.0.0" dependencies = [ "arrayref", - "cbindgen", "num-derive 0.3.2", "num-traits", "num_enum", @@ -2275,7 +2281,6 @@ dependencies = [ name = "spl-token-swap" version = "0.1.0" dependencies = [ - "cbindgen", "num-derive 0.3.2", "num-traits", "rand", diff --git a/Cargo.toml b/Cargo.toml index 16d246a9..a9b2f6d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "utils/cgen", "utils/test-client", "memo/program", "token-swap/program", diff --git a/cbindgen.sh b/cbindgen.sh new file mode 100755 index 00000000..a753b772 --- /dev/null +++ b/cbindgen.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +cd "$(dirname "$0")" +set -x + +# Cargo.lock can cause older spl-token bindings to be generated? Move it out of +# the way... +mv -f Cargo.lock Cargo.lock.org + +cargo run --manifest-path=utils/cgen/Cargo.toml +exitcode=$? + +mv -f Cargo.lock.org Cargo.lock + +exit $exitcode diff --git a/ci/script.sh b/ci/script.sh index 5bdbf8fd..5d233784 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -32,11 +32,12 @@ _ cargo run --manifest-path=utils/test-client/Cargo.toml # Check generated C headers -#_ git diff --exit-code token/program/inc/token.h -#_ cc token/program/inc/token.h -o target/token.gch -# -#_ git diff --exit-code token-swap/program/inc/token-swap.h -#_ cc token-swap/program/inc/token-swap.h -o target/token-swap.gch +_ cargo run --manifest-path=utils/cgen/Cargo.toml + +_ git diff --exit-code token/program/inc/token.h +_ cc token/program/inc/token.h -o target/token.gch +_ git diff --exit-code token-swap/program/inc/token-swap.h +_ cc token-swap/program/inc/token-swap.h -o target/token-swap.gch # Run clippy for all program crates, with the `program` feature enabled diff --git a/token-swap/program/Cargo.toml b/token-swap/program/Cargo.toml index 34a874c6..09f20c7e 100644 --- a/token-swap/program/Cargo.toml +++ b/token-swap/program/Cargo.toml @@ -28,9 +28,6 @@ thiserror = "1.0" [dev-dependencies] rand = { version = "0.7.0"} -[build-dependencies] -cbindgen = "=0.14.2" - [lib] name = "spl_token_swap" crate-type = ["cdylib", "lib"] diff --git a/token-swap/program/build.rs b/token-swap/program/build.rs deleted file mode 100644 index 1d9aa856..00000000 --- a/token-swap/program/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -extern crate cbindgen; - -use std::env; - -fn main() { - println!("cargo:rerun-if-env-changed=SPL_CBINDGEN"); - println!("cargo:rerun-if-changed=inc/token-swap.h"); - if std::path::Path::new("inc/token-swap.h").exists() && env::var("SPL_CBINDGEN").is_err() { - return; - } - - println!("cargo:warning=Generating inc/token-swap.h"); - let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - cbindgen::generate(&crate_dir) - .unwrap() - .write_to_file("inc/token-swap.h"); -} diff --git a/token/program/Cargo.toml b/token/program/Cargo.toml index 9a8d17d1..e0b23944 100644 --- a/token/program/Cargo.toml +++ b/token/program/Cargo.toml @@ -29,8 +29,5 @@ num_enum = "0.5.1" [dev-dependencies] rand = { version = "0.7.0"} -[build-dependencies] -cbindgen = "=0.14.2" - [lib] crate-type = ["cdylib", "lib"] diff --git a/token/program/inc/token.h b/token/program/inc/token.h index 32df44b4..75f394b9 100644 --- a/token/program/inc/token.h +++ b/token/program/inc/token.h @@ -7,10 +7,6 @@ #include #include -#define TOKEN_MAJOR_VERSION 1 -#define TOKEN_MINOR_VERSION 1 -#define TOKEN_PATCH_VERSION 0 - /** * Maximum number of multisignature signers (max N) */ @@ -21,89 +17,6 @@ */ #define Token_MIN_SIGNERS 1 -/** - * Account state. - */ -enum Token_AccountState -#ifdef __cplusplus - : uint8_t -#endif // __cplusplus - { - /** - * Account is not yet initialized - */ - Token_AccountState_Uninitialized, - /** - * Account is initialized; the account owner and/or delegate may perform permitted operations - * on this account - */ - Token_AccountState_Initialized, - /** - * Account has been frozen by the mint freeze authority. Neither the account owner nor - * the delegate are able to perform operations on this account. - */ - Token_AccountState_Frozen, -}; -#ifndef __cplusplus -typedef uint8_t Token_AccountState; -#endif // __cplusplus - -/** - * Specifies the authority type for SetAuthority instructions - */ -enum Token_AuthorityType -#ifdef __cplusplus - : uint8_t -#endif // __cplusplus - { - /** - * Authority to mint new tokens - */ - Token_AuthorityType_MintTokens, - /** - * Authority to freeze any account associated with the Mint - */ - Token_AuthorityType_FreezeAccount, - /** - * Holder of a given token account - */ - Token_AuthorityType_AccountHolder, - /** - * Authority to close a token account - */ - Token_AuthorityType_CloseAccount, -}; -#ifndef __cplusplus -typedef uint8_t Token_AuthorityType; -#endif // __cplusplus - -typedef uint8_t Token_Pubkey[32]; - -/** - * A C representation of Rust's `std::option::Option` - */ -typedef enum Token_COption_Pubkey_Tag { - /** - * No value - */ - Token_COption_Pubkey_None_Pubkey, - /** - * Some value `T` - */ - Token_COption_Pubkey_Some_Pubkey, -} Token_COption_Pubkey_Tag; - -typedef struct Token_COption_Pubkey_Token_Some_Body_Pubkey { - Token_Pubkey _0; -} Token_COption_Pubkey_Token_Some_Body_Pubkey; - -typedef struct Token_COption_Pubkey { - Token_COption_Pubkey_Tag tag; - union { - Token_COption_Pubkey_Token_Some_Body_Pubkey some; - }; -} Token_COption_Pubkey; - /** * Instructions supported by the token program. */ @@ -118,15 +31,17 @@ typedef enum Token_TokenInstruction_Tag { * Accounts expected by this instruction: * * 0. `[writable]` The mint to initialize. - * 1. `[]` Rent sysvar + * 1. + * * If supply is non-zero: `[writable]` The account to hold all the newly minted tokens. + * * If supply is zero: `[]` The owner/multisignature of the mint. + * 2. `[]` (optional) The owner/multisignature of the mint if supply is non-zero, if + * present then further minting is supported. * */ Token_TokenInstruction_InitializeMint, /** - * Initializes a new account to hold tokens. If this account is associated with the native - * mint then the token balance of the initialized account will be equal to the amount of SOL - * in the account. If this account is associated with another mint, that mint must be - * initialized before this command can succeed. + * Initializes a new account to hold tokens. If this account is associated with the native mint + * then the token balance of the initialized account will be equal to the amount of SOL in the account. * * The `InitializeAccount` instruction requires no signers and MUST be included within * the same Transaction as the system program's `CreateInstruction` that creates the account @@ -137,7 +52,6 @@ typedef enum Token_TokenInstruction_Tag { * 0. `[writable]` The account to initialize. * 1. `[]` The mint this account will be associated with. * 2. `[]` The new account's owner/multisignature. - * 3. `[]` Rent sysvar */ Token_TokenInstruction_InitializeAccount, /** @@ -154,8 +68,7 @@ typedef enum Token_TokenInstruction_Tag { * Accounts expected by this instruction: * * 0. `[writable]` The multisignature account to initialize. - * 1. `[]` Rent sysvar - * 2. ..2+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11. + * 1. ..1+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11. */ Token_TokenInstruction_InitializeMultisig, /** @@ -180,7 +93,6 @@ typedef enum Token_TokenInstruction_Tag { /** * Approves a delegate. A delegate is given the authority over * tokens on behalf of the source account's owner. - * * Accounts expected by this instruction: * * * Single owner @@ -211,34 +123,36 @@ typedef enum Token_TokenInstruction_Tag { */ Token_TokenInstruction_Revoke, /** - * Sets a new authority of a mint or account. + * Sets a new owner of a mint or account. * * Accounts expected by this instruction: * - * * Single authority - * 0. `[writable]` The mint or account to change the authority of. - * 1. `[signer]` The current authority of the mint or account. + * * Single owner + * 0. `[writable]` The mint or account to change the owner of. + * 1. `[]` The new owner/delegate/multisignature. + * 2. `[signer]` The owner of the mint or account. * - * * Multisignature authority - * 0. `[writable]` The mint or account to change the authority of. - * 1. `[]` The mint's or account's multisignature authority. - * 2. ..2+M '[signer]' M signer accounts + * * Multisignature owner + * 0. `[writable]` The mint or account to change the owner of. + * 1. `[]` The new owner/delegate/multisignature. + * 2. `[]` The mint's or account's multisignature owner. + * 3. ..3+M '[signer]' M signer accounts */ - Token_TokenInstruction_SetAuthority, + Token_TokenInstruction_SetOwner, /** * Mints new tokens to an account. The native mint does not support minting. * * Accounts expected by this instruction: * - * * Single authority + * * Single owner * 0. `[writable]` The mint. * 1. `[writable]` The account to mint tokens to. - * 2. `[signer]` The mint's minting authority. + * 2. `[signer]` The mint's owner. * - * * Multisignature authority + * * Multisignature owner * 0. `[writable]` The mint. * 1. `[writable]` The account to mint tokens to. - * 2. `[]` The mint's multisignature mint-tokens authority. + * 2. `[]` The mint's multisignature owner. * 3. ..3+M '[signer]' M signer accounts. */ Token_TokenInstruction_MintTo, @@ -250,14 +164,12 @@ typedef enum Token_TokenInstruction_Tag { * * * Single owner/delegate * 0. `[writable]` The account to burn from. - * 1. '[writable]' The token mint. - * 2. `[signer]` The account's owner/delegate. + * 1. `[signer]` The account's owner/delegate. * * * Multisignature owner/delegate * 0. `[writable]` The account to burn from. - * 1. '[writable]' The token mint. - * 2. `[]` The account's multisignature owner/delegate. - * 3. ..3+M '[signer]' M signer accounts. + * 1. `[]` The account's multisignature owner/delegate. + * 2. ..2+M '[signer]' M signer accounts. */ Token_TokenInstruction_Burn, /** @@ -278,145 +190,17 @@ typedef enum Token_TokenInstruction_Tag { * 3. ..3+M '[signer]' M signer accounts. */ Token_TokenInstruction_CloseAccount, - /** - * Freeze an Initialized account using the Mint's freeze_authority (if set). - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The account to freeze. - * 1. '[]' The token mint. - * 2. `[signer]` The mint freeze authority. - * - * * Multisignature owner - * 0. `[writable]` The account to freeze. - * 1. '[]' The token mint. - * 2. `[]` The mint's multisignature freeze authority. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_FreezeAccount, - /** - * Thaw a Frozen account using the Mint's freeze_authority (if set). - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The account to freeze. - * 1. '[]' The token mint. - * 2. `[signer]` The mint freeze authority. - * - * * Multisignature owner - * 0. `[writable]` The account to freeze. - * 1. '[]' The token mint. - * 2. `[]` The mint's multisignature freeze authority. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_ThawAccount, - /** - * Transfers tokens from one account to another either directly or via a delegate. If this - * account is associated with the native mint then equal amounts of SOL and Tokens will be - * transferred to the destination account. - * - * This instruction differs from Transfer in that the token mint and decimals value is - * asserted by the caller. This may be useful when creating transactions offline or within a - * hardware wallet. - * - * Accounts expected by this instruction: - * - * * Single owner/delegate - * 0. `[writable]` The source account. - * 1. '[]' The token mint. - * 2. `[writable]` The destination account. - * 3. '[signer]' The source account's owner/delegate. - * - * * Multisignature owner/delegate - * 0. `[writable]` The source account. - * 1. '[]' The token mint. - * 2. `[writable]` The destination account. - * 3. '[]' The source account's multisignature owner/delegate. - * 4. ..4+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_Transfer2, - /** - * Approves a delegate. A delegate is given the authority over - * tokens on behalf of the source account's owner. - * - * This instruction differs from Approve in that the token mint and decimals value is asserted - * by the caller. This may be useful when creating transactions offline or within a hardware - * wallet. - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The source account. - * 1. '[]' The token mint. - * 2. `[]` The delegate. - * 3. `[signer]` The source account owner. - * - * * Multisignature owner - * 0. `[writable]` The source account. - * 1. '[]' The token mint. - * 2. `[]` The delegate. - * 3. '[]' The source account's multisignature owner. - * 4. ..4+M '[signer]' M signer accounts - */ - Token_TokenInstruction_Approve2, - /** - * Mints new tokens to an account. The native mint does not support minting. - * - * This instruction differs from MintTo in that the decimals value is asserted by the - * caller. This may be useful when creating transactions offline or within a hardware wallet. - * - * Accounts expected by this instruction: - * - * * Single authority - * 0. `[writable]` The mint. - * 1. `[writable]` The account to mint tokens to. - * 2. `[signer]` The mint's minting authority. - * - * * Multisignature authority - * 0. `[writable]` The mint. - * 1. `[writable]` The account to mint tokens to. - * 2. `[]` The mint's multisignature mint-tokens authority. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_MintTo2, - /** - * Burns tokens by removing them from an account. `Burn2` does not support accounts - * associated with the native mint, use `CloseAccount` instead. - * - * This instruction differs from Burn in that the decimals value is asserted by the caller. - * This may be useful when creating transactions offline or within a hardware wallet. - * - * Accounts expected by this instruction: - * - * * Single owner/delegate - * 0. `[writable]` The account to burn from. - * 1. '[writable]' The token mint. - * 2. `[signer]` The account's owner/delegate. - * - * * Multisignature owner/delegate - * 0. `[writable]` The account to burn from. - * 1. '[writable]' The token mint. - * 2. `[]` The account's multisignature owner/delegate. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_Burn2, } Token_TokenInstruction_Tag; typedef struct Token_TokenInstruction_Token_InitializeMint_Body { + /** + * Initial amount of tokens to mint. + */ + uint64_t amount; /** * Number of base 10 digits to the right of the decimal place. */ uint8_t decimals; - /** - * The authority/multisignature to mint tokens. - */ - Token_Pubkey mint_authority; - /** - * The freeze authority/multisignature of the mint. - */ - Token_COption_Pubkey freeze_authority; } Token_TokenInstruction_Token_InitializeMint_Body; typedef struct Token_TokenInstruction_Token_InitializeMultisig_Body { @@ -440,17 +224,6 @@ typedef struct Token_TokenInstruction_Token_Approve_Body { uint64_t amount; } Token_TokenInstruction_Token_Approve_Body; -typedef struct Token_TokenInstruction_Token_SetAuthority_Body { - /** - * The type of authority to update. - */ - Token_AuthorityType authority_type; - /** - * The new authority - */ - Token_COption_Pubkey new_authority; -} Token_TokenInstruction_Token_SetAuthority_Body; - typedef struct Token_TokenInstruction_Token_MintTo_Body { /** * The amount of new tokens to mint. @@ -465,50 +238,6 @@ typedef struct Token_TokenInstruction_Token_Burn_Body { uint64_t amount; } Token_TokenInstruction_Token_Burn_Body; -typedef struct Token_TokenInstruction_Token_Transfer2_Body { - /** - * The amount of tokens to transfer. - */ - uint64_t amount; - /** - * Expected number of base 10 digits to the right of the decimal place. - */ - uint8_t decimals; -} Token_TokenInstruction_Token_Transfer2_Body; - -typedef struct Token_TokenInstruction_Token_Approve2_Body { - /** - * The amount of tokens the delegate is approved for. - */ - uint64_t amount; - /** - * Expected number of base 10 digits to the right of the decimal place. - */ - uint8_t decimals; -} Token_TokenInstruction_Token_Approve2_Body; - -typedef struct Token_TokenInstruction_Token_MintTo2_Body { - /** - * The amount of new tokens to mint. - */ - uint64_t amount; - /** - * Expected number of base 10 digits to the right of the decimal place. - */ - uint8_t decimals; -} Token_TokenInstruction_Token_MintTo2_Body; - -typedef struct Token_TokenInstruction_Token_Burn2_Body { - /** - * The amount of tokens to burn. - */ - uint64_t amount; - /** - * Expected number of base 10 digits to the right of the decimal place. - */ - uint8_t decimals; -} Token_TokenInstruction_Token_Burn2_Body; - typedef struct Token_TokenInstruction { Token_TokenInstruction_Tag tag; union { @@ -516,30 +245,48 @@ typedef struct Token_TokenInstruction { Token_TokenInstruction_Token_InitializeMultisig_Body initialize_multisig; Token_TokenInstruction_Token_Transfer_Body transfer; Token_TokenInstruction_Token_Approve_Body approve; - Token_TokenInstruction_Token_SetAuthority_Body set_authority; Token_TokenInstruction_Token_MintTo_Body mint_to; Token_TokenInstruction_Token_Burn_Body burn; - Token_TokenInstruction_Token_Transfer2_Body transfer2; - Token_TokenInstruction_Token_Approve2_Body approve2; - Token_TokenInstruction_Token_MintTo2_Body mint_to2; - Token_TokenInstruction_Token_Burn2_Body burn2; }; } Token_TokenInstruction; +typedef uint8_t Token_Pubkey[32]; + +/** + * A C representation of Rust's `std::option::Option` + */ +typedef enum Token_COption_Pubkey_Tag { + /** + * No value + */ + Token_COption_Pubkey_None_Pubkey, + /** + * Some value `T` + */ + Token_COption_Pubkey_Some_Pubkey, +} Token_COption_Pubkey_Tag; + +typedef struct Token_COption_Pubkey_Token_Some_Body_Pubkey { + Token_Pubkey _0; +} Token_COption_Pubkey_Token_Some_Body_Pubkey; + +typedef struct Token_COption_Pubkey { + Token_COption_Pubkey_Tag tag; + union { + Token_COption_Pubkey_Token_Some_Body_Pubkey some; + }; +} Token_COption_Pubkey; + /** * Mint data. */ typedef struct Token_Mint { /** - * Optional authority used to mint new tokens. The mint authority may only be provided during - * mint creation. If no mint authority is present then the mint has a fixed supply and no - * further tokens may be minted. + * Optional owner, used to mint new tokens. The owner may only + * be provided during mint creation. If no owner is present then the mint + * has a fixed supply and no further tokens may be minted. */ - Token_COption_Pubkey mint_authority; - /** - * Total supply of tokens. - */ - uint64_t supply; + Token_COption_Pubkey owner; /** * Number of base 10 digits to the right of the decimal place. */ @@ -548,37 +295,8 @@ typedef struct Token_Mint { * Is `true` if this structure has been initialized */ bool is_initialized; - /** - * Optional authority to freeze token accounts. - */ - Token_COption_Pubkey freeze_authority; } Token_Mint; -/** - * A C representation of Rust's `std::option::Option` - */ -typedef enum Token_COption_u64_Tag { - /** - * No value - */ - Token_COption_u64_None_u64, - /** - * Some value `T` - */ - Token_COption_u64_Some_u64, -} Token_COption_u64_Tag; - -typedef struct Token_COption_u64_Token_Some_Body_u64 { - uint64_t _0; -} Token_COption_u64_Token_Some_Body_u64; - -typedef struct Token_COption_u64 { - Token_COption_u64_Tag tag; - union { - Token_COption_u64_Token_Some_Body_u64 some; - }; -} Token_COption_u64; - /** * Account data. */ @@ -601,23 +319,17 @@ typedef struct Token_Account { */ Token_COption_Pubkey delegate; /** - * The account's state + * Is `true` if this structure has been initialized */ - Token_AccountState state; + bool is_initialized; /** - * If is_some, this is a native token, and the value logs the rent-exempt reserve. An Account - * is required to be rent-exempt, so the value is used by the Processor to ensure that wrapped - * SOL accounts do not drop below this threshold. + * Is this a native token */ - Token_COption_u64 is_native; + bool is_native; /** * The amount delegated */ uint64_t delegated_amount; - /** - * Optional authority to close the account. - */ - Token_COption_Pubkey close_authority; } Token_Account; /** diff --git a/utils/cgen/Cargo.toml b/utils/cgen/Cargo.toml new file mode 100644 index 00000000..22bc2097 --- /dev/null +++ b/utils/cgen/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "cgen" +version = "0.1.0" +authors = ["Solana Maintainers "] +publish = false +edition = "2018" + +[dependencies] +cbindgen = "=0.14.2" diff --git a/utils/cgen/src/main b/utils/cgen/src/main new file mode 100644 index 00000000..e69de29b diff --git a/token/program/build.rs b/utils/cgen/src/main.rs similarity index 59% rename from token/program/build.rs rename to utils/cgen/src/main.rs index 48620754..6c677692 100644 --- a/token/program/build.rs +++ b/utils/cgen/src/main.rs @@ -1,33 +1,14 @@ extern crate cbindgen; use std::env; +use std::path::Path; -fn main() { - println!("cargo:rerun-if-env-changed=SPL_CBINDGEN"); - println!("cargo:rerun-if-changed=inc/token.h"); - if std::path::Path::new("inc/token.h").exists() && env::var("SPL_CBINDGEN").is_err() { - return; - } +fn token>(crate_dir: P) { + let output_file = crate_dir.as_ref().join("inc/token.h"); + println!("Generating {}", output_file.display()); - println!("cargo:warning=Generating inc/token.h"); - let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let config = cbindgen::Config { header: Some("/* Autogenerated SPL Token program C Bindings */".to_string()), - after_includes: Some(format!( - "{}{}{}", - format!( - "\n#define TOKEN_MAJOR_VERSION {}", - env!("CARGO_PKG_VERSION_MAJOR") - ), - format!( - "\n#define TOKEN_MINOR_VERSION {}", - env!("CARGO_PKG_VERSION_MINOR") - ), - format!( - "\n#define TOKEN_PATCH_VERSION {}", - env!("CARGO_PKG_VERSION_PATCH") - ) - )), language: cbindgen::Language::C, line_length: 80, style: cbindgen::Style::Both, @@ -61,5 +42,26 @@ fn main() { .with_config(config) .generate() .unwrap() - .write_to_file("inc/token.h"); + .write_to_file(output_file); +} + +fn token_swap>(crate_dir: P) { + let output_file = crate_dir.as_ref().join("inc/token-swap.h"); + println!("Generating {}", output_file.display()); + + cbindgen::generate(crate_dir) + .unwrap() + .write_to_file(output_file); +} + +fn main() { + let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let workspace_root = Path::new(&cargo_manifest_dir) + .parent() + .unwrap() + .parent() + .unwrap(); + + token(&workspace_root.join("token/program")); + token_swap(&workspace_root.join("token-swap/program")); }